2011-08-26 38 views
16

Làm thế nào tôi có thể biết khi nào [UITableView setEditing: YES animated: YES] đã hoàn tất?Làm thế nào tôi có thể biết Khi nào một hoạt ảnh UITableView đã kết thúc?

Tôi không muốn đưa ra bất kỳ bối cảnh nào, bởi vì tôi muốn tránh bất kỳ ai cho tôi cách giải quyết, điều này không làm tôi quan tâm.

Điều tôi muốn gọi là ở trên, sau đó có một chức năng riêng được gọi là khi hoạt ảnh được hoàn tất.


Tôi đã chỉnh sửa bài đăng để cung cấp ngữ cảnh và một số giải pháp. Ban đầu tôi đã chỉnh sửa và tải lại ngay lập tức dữ liệu bảng.

[tableView setEditing:YES animated:YES]; 
[tableView reloadData]; 

Vấn đề là bảng tải lại trước khi hoạt ảnh bắt đầu và do đó hoạt ảnh không bao giờ được nhìn thấy.

Dưới đây là một số cách giải quyết khác nhau:

[tableView setEditing:YES animated:YES]; 
[self performSelector:@selector(ReloadTable) withObject:nil afterDelay:1.0]; 

này hoạt động nhưng nếu tôi nhận được sự chậm trễ không chính xác sau đó nó sẽ trông xấu. Vì vậy, tôi cần phải biết sự chậm trễ là gì, mà tôi có thể tìm ra, nhưng chúng tôi không gauranteed rằng sự chậm trễ sẽ luôn luôn giống nhau.

isEditing = YES; 
[tableView reloadData]; 
[tableView setEditing:YES animated:YES]; 

Điều này có thể hoạt động, nhưng bảng hoạt động khác nhau tùy theo chúng tôi đang ở chế độ chỉnh sửa. Vì vậy, tôi phải sử dụng biến isEditing của riêng tôi thay vì UITableView.editing chuẩn. Tôi không muốn tạo một biến boolean isEditing mới.

[tableView setEditing:YES animated:YES]; 
[tableView insertRowsAtIndexPaths:path withRowAnimation:UITableViewRowAnimationTop]; 

này gần như hoạt động tốt nhưng trong chế độ chỉnh sửa hàng đầu tiên nên có UITableViewCellEditingStyleInsert, trong khi các hàng khác có được UITableViewCellEditingStyleDelete. Và với đoạn mã trên, kiểu chỉnh sửa được thiết lập TRƯỚC KHI hàng được thêm vào. Do đó hàng thứ hai kết thúc bằng UITableViewCellEditingStyleInsert.

Trả lời

46
[CATransaction begin]; 
[CATransaction setCompletionBlock: ^{ 
    // your animation has finished 
}]; 
[tableView setEditing:YES animated:YES]; 
[CATransaction commit]; 

Lưu ý rằng setCompletionBlock phải nằm trên đỉnh.

+2

+1 Điều này hoạt động * hoàn hảo *. – Isaac

+2

Tôi đã thử rất nhiều đề xuất về các chủ đề khác về vấn đề này và đây là bài viết đầu tiên đã hoạt động! – Marty

+0

Thật là một câu trả lời tuyệt vời! – Swindler

3

Trong iOS 4, bạn có thể làm như sau:

[UIView animateWithDuration:0.3f 
       animations:^{ 
        [self.tableView setEditing:YES animated:NO]; 
       } 
       completion:^(BOOL finished){ 
        // Do something 
       } 
]; 
+0

này hoạt động tốt (+1), nhưng 'CATransaction' gợi ý trong câu trả lời khác làm việc tốt hơn. – Isaac

+0

Điều này phụ thuộc vào thời gian mà Apple chọn cho hoạt ảnh. Nếu họ thay đổi thời gian trong bản phát hành trong tương lai, thì điều này sẽ không hoạt động nữa. Xem câu trả lời được chấp nhận cho một cách tốt hơn. – fishinear

1

Swift 4 phiên bản của câu trả lời được chấp nhận:

CATransaction.begin() 
CATransaction.setCompletionBlock { 
    // your animation has finished 
} 
tableView.setEditing(true, animated: true) 
CATransaction.commit() 
Các vấn đề liên quan