I rendersi conto di questo vecchio post ma stavo avendo un problema simile e ho creato una soluzione che funzionava bene per me. Ho applicato le tecniche utilizzate su NSCookBook per la creazione di UIAlertViews con blocchi. Il motivo per cui ho optato per questo è stato perché volevo utilizzare le animazioni integrate piuttosto che quelle di UIView + animateWithDuration: animations: completion :. C'è una maggiore differenza tra queste animazioni con la modifica a iOS 7.
Si crea una categoria per UITableView e nel file di implementazione si crea una classe privata interna che richiamerà il blocco assegnandolo come delegato della propria tabella. Il problema è che finché il blocco non viene chiamato, il delegato originale verrà "perso" per così dire, dal momento che il nuovo delegato è l'oggetto che chiamerà il blocco. Questo è il motivo per cui ho inviato una notifica per inviare un messaggio quando il blocco è stato chiamato per riassegnare l'UITableViewDelegate originale. Questo codice è stato testato e sta lavorando alla mia fine.
// 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
È quindi possibile chiamare il metodo come un altro con un blocco:
[self.tableView scrollToRowAtIndexPath:self.currentPath
atScrollPosition:UITableViewScrollPositionMiddle
animated:YES
scrollFinished:^{
NSLog(@"scrollFinished");
}
];
come stai inizializzazione vostro 'puntatore myAnimation'? –