I realisierte dies eine alte Post, aber ich hatte ein ähnliches Problem und schuf eine Lösung, die für mich gut funktionierte. Ich habe die Techniken angewendet auf NSCookBook für die Erstellung von UIAlertViews mit Blöcken. Der Grund dafür war, dass ich die integrierten Animationen anstelle von UIView + animateWithDuration verwenden wollte: animations: completion :. Zwischen diesen Animationen besteht bei der Umstellung auf iOS 7 ein größerer Unterschied.
Sie erstellen eine Kategorie für UITableView und in der Implementierungsdatei erstellen Sie eine innere private Klasse, die den Block zurückruft, indem sie ihn als Delegierten Ihrer TableViews zuweist. Der Catch ist, dass der ursprüngliche Delegat sozusagen "verloren" wird, bis der Block aufgerufen wird, da der neue Delegat das Objekt ist, das den Block aufrufen wird. Aus diesem Grund habe ich eine Benachrichtigung gesendet, um eine Nachricht zu senden, wenn der Block aufgerufen wurde, um das ursprüngliche UITableViewDelegate neu zuzuweisen. Dieser Code wurde getestet und arbeitet an meinem Ende.
// Header file
@interface UITableView (ScrollDelegateBlock)
-(void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath
atScrollPosition:(UITableViewScrollPosition)scrollPosition
animated:(BOOL)animated
scrollFinished:(void (^)())scrollFinished;
@end
// Implementation file
#import "UITableView+ScrollDelegateBlock.h"
#import <objc/runtime.h>
NSString *const BLOCK_CALLED_NOTIFICATION = @"BlockCalled";
@interface ScrollDelegateWrapper : NSObject <UITableViewDelegate>
@property (copy) void(^scrollFinishedBlock)();
@end
@implementation ScrollDelegateWrapper
-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
if (self.scrollFinishedBlock) {
[[NSNotificationCenter defaultCenter] postNotificationName:BLOCK_CALLED_NOTIFICATION object:nil];
self.scrollFinishedBlock();
}
}
@end
static const char kScrollDelegateWrapper;
static id<UITableViewDelegate>previousDelegate;
@implementation UITableView (ScrollDelegateBlock)
-(void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath
atScrollPosition:(UITableViewScrollPosition)scrollPosition
animated:(BOOL)animated
scrollFinished:(void (^)())scrollFinished {
previousDelegate = self.delegate;
ScrollDelegateWrapper *scrollDelegateWrapper = [[ScrollDelegateWrapper alloc] init];
scrollDelegateWrapper.scrollFinishedBlock = scrollFinished;
self.delegate = scrollDelegateWrapper;
objc_setAssociatedObject(self, &kScrollDelegateWrapper, scrollDelegateWrapper, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[self scrollToRowAtIndexPath:indexPath atScrollPosition:scrollPosition animated:animated];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(blockCalled:)
name:BLOCK_CALLED_NOTIFICATION
object:nil];
}
/*
* Assigns delegate back to the original delegate
*/
-(void) blockCalled:(NSNotification *)notification {
self.delegate = previousDelegate;
[[NSNotificationCenter defaultCenter] removeObserver:self
name:BLOCK_CALLED_NOTIFICATION
object:nil];
}
@end
Sie können dann mit einem Block das Verfahren wie jedes andere nennen:
[self.tableView scrollToRowAtIndexPath:self.currentPath
atScrollPosition:UITableViewScrollPositionMiddle
animated:YES
scrollFinished:^{
NSLog(@"scrollFinished");
}
];
, wie Sie Ihren 'myAnimation' Zeiger werden initialisiert? –