2011-08-21 41 views
7

Tôi có một UITableView với nội dung hình ảnh nặng. Vì vậy, di chuyển không phải là chất lỏng nữa. Tôi muốn thêm bộ hẹn giờ để tải hình ảnh, trong khi bạn cuộn Tôi tạo bộ hẹn giờ cho mỗi hàng. Nếu ô bỏ chế độ xem, tôi sẽ hủy bộ hẹn giờ. Nếu tôi không phai mờ trong hình ảnh.Ô UITableView vừa biến mất gọi lại?

Câu hỏi của tôi là: có một cuộc gọi lại cho một ô không tham gia không? Tôi đang đọc tài liệu, nhưng tôi không chắc chắn có bất cứ điều gì cho nhu cầu của tôi.

Cảm ơn sự giúp đỡ!

CHỈNH SỬA: Mã tôi đang sử dụng (đây là thư viện ba20, tôi đang sử dụng TTTableItemCell tùy chỉnh. "_tabBar1.tabItems = item.photos" là tài nguyên kênh đang chạy. những bức ảnh đang được tải không đồng bộ từ máy chủ, nhưng khi tôi cuộn lại hoặc tải lại xem, họ đều nạp đồng bộ, và di chuyển không được mịn nữa, đặc biệt là trên một chiếc iPhone 3G:.

- (void)setObject:(id)object { 
    if (_item != object) { 
     [super setObject:object]; 

     Mission* item = object; 

     self.textLabel.text = item.name; 
     _tabBar1.tabItems = nil; 

     timerFeats = [NSTimer scheduledTimerWithTimeInterval:(0.5f) target:self selector:@selector(updateFeats) userInfo:nil repeats: NO]; 
     //_tabBar1.tabItems = item.photos; 
    } 
} 

-(void)updateFeats { 
    DLog(@"timer ended"); 
    Mission* item = self.object; 
    self._tabBar1.tabItems = item.photos; 
} 

Trả lời

5

Được rồi, tôi đã tìm được cách.

Thực sự là một cuộc gọi lại để biết ô nào sắp thoát ra khỏi chế độ xem. :

- (void)willMoveToSuperview:(UIView *)newSuperview; 

Vì vậy, mã của tôi là:

- (void)willMoveToSuperview:(UIView *)newSuperview { 
    [super willMoveToSuperview:newSuperview]; 
    if(!newSuperview) { 
     DLog(@"timer invalidated"); 
     if ([timerFeats isValid]) { 
      [timerFeats invalidate]; 
     } 

    } 
} 

Nếu không có newSuperview tế bào là đi ra khỏi quan điểm và vì vậy tôi xác minh đầu tiên mà giờ tôi vẫn chưa hết hiệu lực nêu ra, và sau đó Tôi hủy nó.

+1

Điều này dường như kích hoạt ngay khi một ô đến * trong * để xem – Matthew

+1

@Matt như của iOS 7.02, phương pháp này có thể không được gọi khi bạn di chuyển ra khỏi ô và cuộn lại. ngay sau đó nó được hiển thị một lần nữa phương thức prepareForReuse được gọi. Trong thời gian nó không thể nhìn thấy chỉ có cờ ẩn là TRUE, nhưng nó vẫn còn gắn liền với tableview. Vì vậy, không có sự thay đổi của superview. – Klaas

0

khi một số UITableView ban đầu được hiển thị, nó gọi phương thức này một lần cho mỗi hàng

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath 

sau khi phương pháp này được gọi khi bao giờ một hàng mới là bắt buộc mà thường là kết quả của việc cuộn để hiển thị một hàng mới và đẩy một cái nhìn cũ ra khỏi đầu kia.

Vì vậy, đây là một móc lý tưởng để tìm hiểu những hàng nào có thể nhìn thấy. Để kiểm tra các tế bào có thể nhìn thấy bạn có thể gọi

- (NSArray *)indexPathsForVisibleRows 

Vì tableview là điều duy nhất giữ một tham chiếu đến các tế bào của bạn trước khi chúng được tái chế hoặc creaetd bạn không thể có được một tay cầm vào những giờ tươi. Những gì tôi đề nghị là tạo ra một Ivar NSMutableDictionary và khi bạn tạo các tế bào của bạn thêm bộ đếm thời gian để các NSMutableDictionary

[timersForIndexs setObject:yourTimer forKey:indexPath]; 

Bây giờ khi bạn nhận được - (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath bạn cần phải làm điều gì đó như

NSMutableDictionary *tmpDictionary = [timersForIndexs copy]; 

[tmpDictionary removeObjectsForKeys:[self.tableView indexPathsForVisibleRows]]; 

NSArray *timers = [tmpDictionary allKeys]; 

[timers makeObjectsPerformSelector:@selector(invalidate)]; 

Tôi không ở mặt trước của xcode vì vậy mã này khô mã nên vui lòng cho tôi biết nếu bạn có bất kỳ sự cố nào

+0

Tôi đang cố gắng nhưng rõ ràng, nếu tôi sử dụng [tableView cellForRowAtIndexPath: indexToRemove] trên một ô không hiển thị, tôi nhận được giá trị rỗng, vì vậy tôi không thể hủy hẹn giờ của mình. – rnaud

+0

Tôi đã cập nhật câu trả lời của mình –

+0

Tôi nhận được mảng các hàng hiển thị, vấn đề là tôi chỉ có thể truy cập các hàng này bằng phương thức cellForRowAtIndexPath. Bất kỳ hàng nào khác cho tôi một (null). Mà tôi đoán là bởi vì các tế bào đã được dequeued? – rnaud

1

tôi đề nghị sử dụng một cách tiếp cận KVO:

On phương pháp awakeFromNib của bạn (hoặc bất kỳ phương pháp bạn sử dụng để nhanh chóng các tế bào) thêm như sau:

- (void)awakeFromNib { 
    [self addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew context:nil]; 

    ... 
} 

Hãy chắc chắn để thực hiện các phương pháp đại biểu cho người quan sát như sau:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if([keyPath isEqualToString:@"hidden"]) { 
     NSLog(@"cell is hidden"); 
    } 
} 
+0

Điều này không phù hợp với tôi. Tôi chỉ nhận được thông báo khi ô bật lại lần nữa. KVO không được kích hoạt khi hệ thống đặt ẩn thành TRUE. Tôi cũng đã cố gắng ghi đè setHidden:, nhưng điều này cũng không được gọi khi chuyển sang ẩn = TRUE; – Klaas

8

Nếu bạn đang sử dụng iOS 6 trở lên, chỉ cần ghi đè phương pháp này:

- tableView:didEndDisplayingCell:forRowAtIndexPath:

Nó sẽ được gọi khi ô đã ra khỏi chế độ xem và bạn sẽ nhận được nó và chỉ mục của nó.

Các vấn đề liên quan