2011-12-28 3 views
16

Tôi có một UITableView với một số phần, mỗi phần có chế độ xem tiêu đề riêng. Khi người dùng chạm vào chế độ xem tiêu đề của một phần, tất cả các hàng của phần đó sẽ thu gọn. Những gì tôi làm là, tôi đặt số lượng hàng của phần đó bằng 0, và sau đó gọi:UITableView reloadSections/reloadData: xem tiêu đề trở thành trống

[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationBottom]; 

Tất cả mọi thứ hoạt động như mong đợi, ngoại trừ một điều: quan điểm tiêu đề của phần này trở nên trống trắng. Khi tôi cuộn bảng, thì tiêu đề trở lại bình thường.

Vì vậy, tôi đoán có một số vấn đề với bản vẽ của bảng.

Một điều thú vị là, nếu tôi sử dụng UITableViewRowAnimationFade thay vào đó, sau đó ngay cả khi tôi cuộn bảng, tiêu đề vẫn còn trống trắng.

Khi tôi cập nhật chỉ MỘT phần, cũng không có vấn đề gì - khi tôi cập nhật nhiều hơn một phần, sự cố xảy ra.

Nếu tôi sử dụng

[self.tableView reloadData] 

thay vào đó, sau đó tất cả mọi thứ hoạt động tốt.

Lý do tôi sử dụng

[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationBottom]; 

là bởi vì tôi muốn hình ảnh động.

Gói với beginUpdates/endupdates không hoạt động.

Trả lời

1

Tôi tìm thấy một công việc xung quanh - không phải là rất thanh lịch, nhưng nó hoạt động. Thay vì cung cấp một NSIndexSet với nhiều hơn một phần, tôi gọi các phần tải lại trong vòng một vòng lặp chỉ với một phần trong mỗi cuộc gọi.

trông giống như:

for (Element *eleSection in self.gruppenKoepfe) { 
     if (eleSection.type.integerValue == qmObjectTypeFormularSpalte || eleSection.type.integerValue == qmObjectTypeFormularZeile) { 
      [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:nCount] withRowAnimation:UITableViewRowAnimationFade]; 
     } 
     nCount ++; 
    }  
0

Tôi đã có một vấn đề tương tự, ngoại trừ tôi đã cố gắng để xóa/phần chèn, và tôi thấy rằng việc giữ một tài sản chỉ để xem toàn bộ tiêu đề (mạnh tức là không chỉ là một subview) dừng nó biến mất trong phần cập nhật.

ví dụ: Bất động sản và instantiation

@property (nonatomic, strong) UIView *headerView;

-(UIView *)headerView { 
    if (!_headerView) { 
    _headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.view.bounds.size.width, 300)]; 
    // add additional view setup, including subviews 
    } 
    return _headerView; 
} 

Và trong tableView:(UITableView *)viewForHeaderInSection:(NSInteger)section:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    if (section == theCorrectSection) { 
     return self.headerView; 
    } 
    return nil; 
} 
33

tôi nhận ra rằng đó là một thời gian dài kể từ khi câu hỏi này được đặt ra nhưng tôi nghĩ rằng tất cả các câu trả lời đưa ra dưới đây là không chính xác.

Tôi đã gặp sự cố tương tự (với mã của người khác) và sắp bị lừa bởi bài đăng này khi tôi nhận ra rằng mã không làm việc sử dụng lại chính xác tiêu đề bảng. Tiêu đề biến mất là vì mã chỉ cung cấp UIView chứ không phải UITableViewHeaderFooterView, đã đăng ký chính xác và được thiết lập để sử dụng lại.

Hãy nhìn vào câu trả lời ở đây: How to use UITableViewHeaderFooterView?

tiêu đề trống của tôi ra đi khi tôi thiết lập một tiêu đề tái sử dụng.

+1

này nên là câu trả lời đúng. Cảm ơn! :) – RJiryes

+0

Đẹp bắt - có vẻ rất rõ ràng bây giờ ... :) – NSTJ

+0

Không có câu trả lời được chấp nhận trong câu hỏi đó. Đó là một trong những để làm theo? – GeneCode

0

Tôi gặp vấn đề tương tự và không có vấn đề nào ở trên. Vấn đề của tôi là tôi đã che giấu tiêu đề đầu tiên và vì một lý do nào đó sau đó thì 10 tải lại tiêu đề tại chỉ số 2 đã được đặt ẩn. Khi tôi đặt headerView.hidden = false thì ok.

1

Trong Swift:

Bạn cần phải tạo ra một lớp đó là một lớp con của UITableViewHeaderFooterView và đăng ký nó vào xem bảng. Sau đó, trong viewForHeaderInSection, bạn thực hiện let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "HeaderView") as! YourHeaderView, tương tự như những gì bạn làm cho UITableViewCells. Sau đó trả lại số header.

Điều lừa đảo là chức năng gọi cho sự trở lại của UIView? khi nó thực sự cần một dequeuedReusableHeaderFooterView hoặc reloadData sẽ gây ra nó biến mất

+0

Bạn có thể cung cấp một đoạn mã cho điều này không? Tôi đã đấu tranh với vấn đề này trong vài ngày và bạn là người duy nhất cho thấy cách tiếp cận này (mà tôi nghĩ là đúng) –

+0

Tôi quên nói xin vui lòng –