2010-04-21 17 views
12

Tôi có thiết lập UITableView + UISearchDisplayController + UITableViewIndex chuẩn. Tất cả mọi thứ hoạt động như một nhà vô địch.UITableViewIndex phát triển đến giới hạn không chính xác bất ngờ

Ngoại trừ, trong điều kiện rất cụ thể, chỉ mục tăng quá lâu để hiển thị trên màn hình. Cụ thể, sau khi kết thúc tìm kiếm và hiển thị lại bảng đã được lập chỉ mục chưa được lọc, chỉ mục đôi khi tăng quá dài.

Cụ thể hơn, điều này không xảy ra nếu tôi tìm kiếm rồi hủy. Nó chỉ xảy ra nếu tôi tìm kiếm, sau đó đẩy bộ điều khiển chế độ xem từ bảng tìm kiếm, sau đó bật bộ điều khiển chế độ xem đó trở lại bảng tìm kiếm, sau đó hủy tìm kiếm, sau đó xóa tìm kiếm lại rồi hủy tìm kiếm cuối cùng đó. Sau khi kết thúc tìm kiếm cuối cùng chỉ mục quá dài.

Trong chế độ dọc, chế độ xem bảng báo cáo chiều cao là 416 và chỉ mục có chiều cao 404 trong điều kiện bình thường. Nếu tôi đăng nhập từ searchDisplayControllerDidEndSearch khi chỉ mục có kích thước không chính xác, báo cáo có chiều cao là 620.

Tôi đã thử mọi thứ từ setLayout trên bàn và chỉ mục để định lại kích thước khung theo cách thủ công. Không có gì hoạt động (kích thước lại thủ công khiến chiều cao chính xác được ghi lại, nhưng nó không thay đổi hiển thị trên màn hình).

tôi sắp sửa thử lại kích thước sau khi một sự chậm trễ trong trường hợp các hình ảnh động hủy được can thiệp, nhưng sau đó tôi nhận ra những gì một tình huống ngớ ngẩn Tôi đang ở và nghĩ tìm sự giúp đỡ có thể là khôn ngoan ...

+0

Bạn đang xây dựng chỉ mục của mình như thế nào? Nó có được xây dựng trong viewWillAppear không? – gnasher

+0

Bạn đang chạy một số loại tác vụ nền (đồng bộ), nó có thể chặn hành vi giao diện người dùng phù hợp trong một số trường hợp hiếm hoi. – elslooo

+0

Có thể muốn kiểm tra xem bạn có đặt lại kích thước tự động trên chế độ xem hay không. – fjlksahfob

Trả lời

1

Nếu bạn vẫn gặp sự cố, bạn có thể thử đặt một điểm ngắt biểu tượng trên - [UITableView setFrame:] và theo dõi nơi cuộc gọi khung được đặt đến. HTH

+0

(hoặc có thể - [UITableView setBounds:]) – nielsbot

0

Kịch bản của tôi hơi khác so với bài đăng, nhưng tôi đã tìm thấy giải pháp hoạt động trong trường hợp của tôi, vì vậy hy vọng trong một trường hợp được đăng ở đây.

Tôi có UITableView sử dụng fetchedResultsController và tải thêm phần tử từ máy chủ khi bạn đến cuối bảngView. Khi tìm kiếm, fetchedResultsController được lọc và tải thêm các mục từ máy chủ khi không đủ để hiển thị.

Khi kết nối trả về kết quả của nó (sau khi nhấn "tìm kiếm"), tôi sẽ tải lại tableViews (bảng gốc và searchResultsTableView). Giờ đây, khi bạn hủy tìm kiếm và mọi thứ được đặt trở lại bình thường, tôi gặp sự cố từ câu hỏi. Các UITableViewIndex phát triển đến giới hạn bất ngờ của nó.

Vì tôi cũng trải nghiệm rằng UITableView đã đổi kích thước lớn hơn rất nhiều so với dự kiến, tôi đã chơi linh cảm và nó hoạt động với tôi. Trong lớp con UITableView của bạn (đây là ARC/6.1):

- (void)loadView 
{ 
    [super loadView]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    if (self.isSearching) 
    { 
     // Ensure the correct height of the original tableview while displaying the searchresults-tableview 
     // only this will make sure, the height of the UITableViewIndex is set correctly ... 
     [UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^(){ 
      CGRect rect = self.tableView.frame; 
      rect.size.height -= [self.tableView convertRect:[[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil].size.height; 
      self.tableView.frame = rect; 
     }]; 
    } 
} 

- (void)keyboardWillHide:(NSNotification *)notification 
{ 
    if (self.isSearching) 
    { 
     // Ensure the correct height of the original tableview while displaying the searchresults-tableview 
     // only this will make sure, the height of the UITableViewIndex is set correctly ... 
     [UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^(){ 
      CGRect rect = self.tableView.frame; 
      rect.size.height += [self.tableView convertRect:[[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil].size.height; 
      self.tableView.frame = rect; 
     }]; 
    } 
} 

Bạn có thể cần phải chỉnh sửa điều này.

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