2016-07-27 15 views
11

Tôi có bộ điều khiển xem bảng với UISearchController đặt UISearchBar làm tableView.tableHeaderView. Khi cập nhật kết quả tìm kiếm, tôi sử dụng beginUpdatesendUpdates và các phương pháp liên quan để cập nhật dữ liệu cho chế độ xem bảng.UISearchBar biến mất khỏi tableHeaderXem khi sử dụng beginUpdates/endUpdates

Điều này làm cho thanh tìm kiếm biến mất; tableHeaderView được đặt thành UIView rỗng, có cùng kích thước với thanh tìm kiếm. Nếu tôi chỉ sử dụng reloadData thay vì toàn bộ thủ tục beginUpdates/endUpdates, mọi thứ đều ổn.

Bộ điều khiển xem bảng được nhúng trong bộ điều khiển chế độ xem thông thường; không có trình điều khiển điều hướng nào liên quan. Đây là toàn bộ việc triển khai bộ điều khiển xem bảng cần thiết để tái tạo sự cố:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; 
    self.searchController.searchResultsUpdater = self; 
    self.searchController.dimsBackgroundDuringPresentation = NO; 

    self.tableView.tableHeaderView = self.searchController.searchBar; 
} 

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController 
{ 
    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 
} 

Tại sao điều này làm cho thanh tìm kiếm được thay thế bằng chế độ xem trống và cách tránh thanh này?

+0

Bạn đã thử thay đổi thuộc tính "mờ" trên chế độ xem của bạnBộ điều khiển/Điều hướng trên và của? Tôi nhớ tôi đã có vấn đề này một lần, Và nếu tôi nhớ chính xác "mờ" nó đã có một cái gì đó để làm với nó .. – MCMatan

Trả lời

0

Khi bạn lần đầu tiên nhấp vào UISearchController's searchBar, sẽ mất khoảng 0,5 giây để thanh tìm kiếm hoạt ảnh. Nhưng self.tableView.endUpdates() được gọi ngay bởi phương thức ủy nhiệm, hoạt ảnh bị gián đoạn.
thanh tìm kiếm mắc kẹt ở giữa của hình ảnh động, và bạn không thể nhìn thấy nó là giao diện người dùng:
enter image description here

Một cách giải quyết là để kiểm tra xem Searchbar là trong hoạt hình, và trì hoãn self.tableView.endUpdates() khi nó trong.

func updateSearchResultsForSearchController(searchController: UISearchController){ 
    self.tableView.beginUpdates() 
    //Do some updates 

    if !searchController.searchBar.showsCancelButton{ 
     self.tableView.performSelector(#selector(UITableView.endUpdates), withObject: nil, afterDelay: 1) 

    }else{ 
     self.tableView.endUpdates() 
    } 
} 
+0

Cảm ơn bạn đã trả lời của bạn. Tôi nghĩ rằng bạn đang lên một cái gì đó về hình ảnh động. Tôi đã thử các thủ thuật như '[CATransaction setCompletionBlock:]', nhưng không có kết quả. Cách giải quyết của bạn có vẻ đặc biệt khó hiểu, và hơn thế nữa không hoạt động cho vấn đề ban đầu. Có lẽ vì nó không được giả tạo như ví dụ tái sản xuất mà tôi đã cung cấp và làm việc nhiều hơn giữa 'beginUpdates' và' endUpdates'. –

+0

Trong trường hợp đó, bạn nên thử khởi động 'UISearchController' với một tableViewController khác, và thực hiện tất cả các bản cập nhật với tableViewController thứ hai này. – wj2061

+0

Như trong '[[UISearchController alloc] initWithSearchResultsController: ...]'? Tôi cho rằng đó là một giải pháp, nhưng tôi muốn giữ tất cả các chức năng gắn liền với chế độ xem bảng ban đầu, như cử chỉ và như vậy. Nếu không có cách nào khác, không có gì một chút refactoring không thể giải quyết, mặc dù. –

0

ít sửa đổi về beginUpdates, endUpdates and reloadData

beginUpdates:: Bắt đầu một loạt các phương pháp gọi là chèn, xóa, hoặc chọn hàng và các phần của xem bảng. Gọi phương thức này nếu bạn muốn các thao tác chèn, xóa và chọn tiếp theo (ví dụ: cellForRowAtIndexPath: và indexPathsForVisibleRows) được làm động cùng một lúc. Bạn cũng có thể sử dụng phương pháp này theo sau là phương thức endUpdates để tạo hiệu ứng thay đổi ở chiều cao hàng mà không cần tải lại ô. Nhóm phương pháp này phải kết thúc bằng lời gọi endUpdates. Các cặp phương thức này có thể được lồng nhau. Nếu bạn không thực hiện lệnh chèn, xóa và lựa chọn bên trong khối này, các thuộc tính bảng chẳng hạn như số lượng hàng có thể trở thành không hợp lệ. Bạn không nên gọi reloadData trong nhóm; nếu bạn gọi phương thức này trong nhóm, bạn phải tự mình thực hiện bất kỳ hoạt ảnh nào.

endUpdates: Kết thúc một loạt các cuộc gọi phương thức chèn, xóa, chọn hoặc tải lại hàng và phần của chế độ xem bảng. Bạn gọi phương thức này để định khung một loạt các cuộc gọi phương thức bắt đầu với beginUpdates và bao gồm các hoạt động để chèn, xóa, chọn và tải lại các hàng và phần của chế độ xem bảng. Khi bạn gọi endUpdates, UITableView sẽ hoạt ảnh đồng thời. Các yêu cầu của beginUpdates và endUpdates có thể được lồng vào nhau. Nếu bạn không thực hiện lệnh chèn, xóa và lựa chọn bên trong khối này, các thuộc tính bảng như số hàng có thể trở thành không hợp lệ.

tải lạiData: Tải lại hàng và phần của chế độ xem bảng. Gọi phương thức này để tải lại tất cả dữ liệu được sử dụng để tạo bảng, bao gồm ô, phần đầu trang và chân trang, mảng chỉ mục, v.v. Để có hiệu quả, chế độ xem bảng sẽ chỉ hiển thị lại những hàng có thể nhìn thấy được.Nó điều chỉnh bù đắp nếu bảng co lại do tải lại. Nguồn đại biểu hoặc nguồn dữ liệu của chế độ xem bảng gọi phương thức này khi nó muốn chế độ xem bảng hoàn toàn tải lại dữ liệu của nó. Nó không nên được gọi trong các phương thức chèn hoặc xóa các hàng, đặc biệt là trong một khối hoạt ảnh được thực hiện với các cuộc gọi đến beginUpdates và endUpdates.

Bây giờ trong trường hợp tìm kiếm, chúng tôi không biết đó hàng sẽ ảnh hưởng cũng mỗi lần dữ liệu kết quả tìm kiếm sẽ khác nhau, tôi tin rằng người ta không nên sử dụng

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 

như được sử dụng nó khi bạn đang thực hiện thao tác insert, update or delete trên chế độ xem bảng và bạn biết số indexPath của nó.

Sử dụng tốt hơn [self.tableView reloadData]; vì nó sẽ chỉ cập nhật các hàng hoặc phần hiển thị trong chế độ xem bảng. Đồng thời tham khảo Mã mẫu của Apple cho Table Search with UISearchController, nó cũng khuyên bạn nên sử dụng reloadData.

Thực hiện các thay đổi tương ứng và bạn tốt để thực hiện.

Mã hóa hạnh phúc :)

+0

Tôi biết rằng việc sử dụng 'reloadData' làm cho vấn đề biến mất, mặc dù điều đó không giải thích tại sao người ta không thể sử dụng' beginUpdates' và 'endUpdates'. –

+0

@ Håvard thats những gì tôi đã giải thích, khi sử dụng 'beginUpdates và endUpdates' và' reloadData'. –

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