tôi nhận ra điều này một bài cũ nhưng tôi đã có một vấn đề tương tự và tạo ra một giải pháp mà làm việc tốt cho tôi. Tôi đã áp dụng các kỹ thuật được sử dụng trên NSCookBook để tạo UIAlertView với các khối. Lý do tôi đã đi cho điều này là bởi vì tôi muốn sử dụng hình ảnh động tích hợp hơn là UIView's + animateWithDuration: animations: completion :. Có sự khác biệt lớn hơn giữa các hoạt ảnh này với thay đổi đối với iOS 7.
Bạn tạo danh mục cho UITableView và trong tệp triển khai bạn tạo lớp riêng bên trong sẽ gọi lại khối bằng cách gán nó làm đại biểu của tableview. Việc nắm bắt là cho đến khi khối được gọi, đại biểu ban đầu sẽ bị "mất" để nói, vì đại biểu mới là đối tượng sẽ gọi khối. Đó là lý do tại sao tôi đặt một thông báo để gửi một tin nhắn khi khối đã được gọi để gán lại UITableViewDelegate gốc. Mã này đã được thử nghiệm và đang hoạt động trên đầu của tôi.
// 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
Sau đó bạn có thể gọi phương thức giống như bất kỳ khác với một khối:
[self.tableView scrollToRowAtIndexPath:self.currentPath
atScrollPosition:UITableViewScrollPositionMiddle
animated:YES
scrollFinished:^{
NSLog(@"scrollFinished");
}
];
làm thế nào bạn initialising 'con trỏ myAnimation' của bạn? –