2014-05-06 12 views
11

UITableView của tôi có tiêu đề UIView tùy chỉnh trong mọi phần. Tôi chỉ cần làm mới tiêu đề chứ không phải nội dung khác trong phần. Tôi đã thử ra [self.tableView headerViewForSection:i] và nó không trả lại bất cứ điều gì mặc dù nó nên. Có anyway mà tôi có thể làm điều này?Chỉ làm mới chế độ xem tiêu đề tùy chỉnh trong UITableView?

Chỉnh sửa: Mã dựa trên gợi ý mới

tôi đã đưa ra một shot là tốt và nó gọi/cập nhật các UIView trong phương pháp đó, nhưng những thay đổi không trực quan tuyên truyền lên màn hình.

for (int i = 0; i < self.objects.count; i++) { 
    UIView *headerView = [self tableView:self.tableView viewForHeaderInSection:i]; 
    [headerView setNeedsDisplay]; 
} 
+0

Bạn đang sử dụng ngòi để tải tiêu đề của mình hay bạn đang tạo chúng theo cách lập trình trong 'tableView: viewForHeaderInSection:'? – Stonz2

+0

Tôi đang tạo chúng theo cách lập trình theo phương pháp đã nêu. – Jonathan

Trả lời

12

Thay vì gọi số setNeedsDisplay, hãy định cấu hình chính tiêu đề bằng cách đặt thuộc tính của nó. Và tất nhiên bạn phải lấy các tiêu đề thực tế trong bảng, không gọi phương thức ủy nhiệm, vì phương thức đó thường tạo ra một khung nhìn tiêu đề mới.

Tôi thường làm điều này trong một phương thức trợ giúp nhỏ được gọi là từ tableView:viewForHeaderInSection:.

ví dụ .:

- (void)configureHeader:(UITableViewHeaderFooterView *)header forSection:(NSInteger)section { 
    // configure your header 
    header.textLabel.text = ... 
} 

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    UITableViewHeaderFooterView *header = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"Header"]; 
    [self configureHeader:header forSection:section]; 
} 

- (void)reloadHeaders { 
    for (NSInteger i = 0; i < [self numberOfSectionsInTableView:self.tableView]; i++) { 
     UITableViewHeaderFooterView *header = [self.tableView headerViewForSection:i]; 
     [self configureHeader:header forSection:i]; 
    } 
} 
+1

Tất cả các công trình này đều tuyệt vời, nhưng cuộc gọi cho tiêu đề 'UITableViewHeaderFooterView * = [self.tableView headerViewForSection: i];' không trả về bất cứ điều gì. Tôi đã thử làm '[tự tableView: self.tableView viewForHeaderInSection: i]' và nó trả về một tiêu đề và đưa tôi để cấu hình, nhưng vẫn không hiển thị các thay đổi trực quan trên màn hình. – Jonathan

+2

nếu '[tự.tableView headerViewForSection: i] 'trả về nil, sau đó tableView của bạn không có một tiêu đề cho phần này, hoặc nó hiện không nhìn thấy được. Và dĩ nhiên '[self tableView: self.tableView viewForHeaderInSection: i]' sẽ trả về một khung nhìn, nhưng khung nhìn này mới được tạo ra và không phải là một phần của hệ thống phân cấp khung nhìn; bạn không thể thấy chế độ xem đó. –

+0

Tôi có thể làm gì để kiểm tra điều này? Trực quan chế độ xem bảng có tiêu đề cho từng phần và chúng được khởi tạo chính xác theo cách bạn đã viết ở trên. – Jonathan

0

Tạo phân lớp UIView của riêng bạn cho headerView và thêm một vài phương thức để trình điều khiển chế độ xem có thể gửi bất kỳ cập nhật giao diện người dùng nào bạn muốn.

0

Khi bạn tạo ra quan điểm tiêu đề tùy chỉnh của bạn, sử dụng UITableViewHeaderFooterView thay vì một đơn giản UIView và khi bạn khởi tạo nó, sử dụng một cái gì đó như thế này:

UITableViewHeaderFooterView *cell = [[UITableViewHeaderFooterView alloc] initWithReuseIdentifier:@"reuseIdentifier"]; 

Các reuseIdentifier sẽ cho UITableView để theo dõi các tiêu đề của bạn và nó nên không còn trở null khi bạn cố gắng truy cập vào nó với [self.tableView headerViewForSection:i]

sau đó bạn sẽ có thể sử dụng setNeedsDisplay trên UITableViewHeaderFooterView bạn trở lại từ headerViewForSection sau khi thực hiện các sửa đổi của bạn.

0

Gọi setNeedsDisplay chỉ phục vụ để kích hoạt phương thức drawRect: của chế độ xem nhận. Trừ khi đây là nơi logic màu văn bản của bạn (nghĩa là, trong phương thức drawRect của lớp con UIView mà bạn đang sử dụng cho các khung nhìn tiêu đề), không có gì có thể thay đổi. Những gì bạn cần làm là trực tiếp gọi một cái gì đó trên các khung nhìn tiêu đề để cập nhật trạng thái của chúng dựa trên dữ liệu mới hoặc thay đổi của bạn hoặc truy cập trực tiếp vào nhãn trong khung nhìn tiêu đề và tự thay đổi nó trong khi lặp qua chúng. setNeedsDisplay sẽ chỉ kích hoạt mã được tìm thấy trong phương thức drawRect: của chế độ xem.

0

Gần đây tôi có vấn đề này chính xác và chỉ vượt qua nó bằng cách giữ một con trỏ đến các tiêu đề như chúng được tạo ra. Tôi đã làm nó trong Swift và với một loại từ điển chỉ nhanh chóng nhưng ý tưởng có thể được mát xa vào objC bằng cách nào đó.

var headers : [ Int : UIView ] = [ : ] //dictionary for keeping pointer to headers 

    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 

     if let h = super.tableView(tableView , viewForHeaderInSection: section) { //or create your view (this viewController inherits it).. 
     self.headers.updateValue(h , forKey: section) //keep a pointer to it before you return it.. 
     return h 
     } 
     return nil 
    } 
Các vấn đề liên quan