2015-03-09 16 views
10

Tôi có chế độ xem bảng được nhóm tĩnh có 5 phần (tất cả các phần có tiêu đề, không có chân trang). Tôi đã tạo tất cả điều này bằng cách sử dụng Bảng phân cảnh. Bây giờ, làm thế nào tôi có thể ẩn UITableViewSection đầu tiên/đầu (bao gồm cả tiêu đề). Tôi cố gắng làm cho một lối thoát cho UITableViewSection nhưng nó nói với tôi rằng nó không phải là hợp lệ (không khai báo type):Làm thế nào để ẩn UITableViewSections trong Swift?

@IBOutlet var section: UITableViewSection! 

tôi đã làm nó theo cách này bởi vì tôi đã có kế hoạch thực hiện:

section.hidden = true 

Can nó không được làm theo cách này?

Các đại biểu và nguồn dữ liệu của tôi được thiết lập chính xác 100%.

Trả lời

11

Bạn có thể sử dụng phương pháp đại biểu:

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    if(section == 0) 
    return 0.0 
} 

Nếu bạn muốn không có các tế bào trong một phần cụ thể, sử dụng phương pháp đại biểu:

func numberOfRowsInSection(section: Int) -> Int { 
    if (section == 0) { 
    return 0 
    } 
    else { 
    // return the number of rows you want 
    } 
} 

EDIT (Phát biểu Tim 's bình luận)

Để nhận cú pháp đúng:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    if (section == 0) { 
     return 0.0 
    } 
    return UITableViewAutomaticDimension 
} 

Hoặc để một switch-case cú pháp gọn gàng:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    switch section { 
    case 0: 
     return 0.0 
    default: 
     return UITableViewAutomaticDimension 
    } 
} 

Tôi đã thử nghiệm cả hai và họ đang làm việc tốt.

+0

Điều gì xảy ra nếu TableView là tĩnh (một vài mã cứng khác với mỗi hàng khác, như cửa sổ cài đặt)? – Josh

+0

Kể từ Xcode 7.3, Swift 2.2: thay thế cho 'tableView (_: heightForHeaderInSection)', bạn cũng có thể ghi đè 'tableView (_: titleForHeaderInSection)' và trả về 'nil' khi bạn muốn ẩn tiêu đề. Sau đó, chiều cao của phần heder sẽ được điều chỉnh tự động thành 0 để không hiển thị văn bản. – maganap

+1

Ẩn các hàng và thiết lập các hàng là chiều cao 0 đã gây ra các vấn đề với các ràng buộc của tôi. Câu trả lời này cố định rằng, giải pháp tốt đẹp! –

1

0.0 không hoạt động đối với tôi. Tôi đã phải làm điều này để làm cho nó hoạt động.

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 

    switch section { 
    case 0: 
     return 0.01 
    default: 
     return UITableViewAutomaticDimension 
    } 
} 
0

Đối với bất kỳ ai muốn ẩn phần vì họ đang sử dụng bảng được nhóm tĩnhXem số lượng động, giải pháp dưới đây có thể trợ giúp. Trong trường hợp của tôi, mỗi phần có dữ liệu cần hiển thị để có tiêu đề tùy chỉnh. Bất kỳ phần nào không có dữ liệu, cần được ẩn hoàn toàn.

Câu trả lời ở trên là sự trợ giúp tuyệt vời trong kịch bản của tôi. Tuy nhiên, đối với những người không phải lúc nào cũng biết phần nào sẽ cần được ẩn ở đây là giải pháp cho bạn mở rộng ở trên.

Trong trường hợp của mình, tôi có tối đa 12 mục nhập trong một mảng mà tôi muốn hiển thị trong tối đa 12 mục (trong số các phần khác trong bảng được nhóm). Nếu có ít hơn 12 mục để hiển thị, tôi muốn ẩn các phần không cần thiết bằng cách cho chúng 0 chiều cao và 0 hàng. Tôi cũng muốn ẩn headerView.

Để làm điều này, tôi đã làm như sau:

  1. Thiết lập tableView của bạn theo câu trả lời tuyệt vời @sasquatch đã trên.
  2. Trong phần numberOfRowsInSection (phần: Int) và tableView (_ tableView: UITableView, heightForHeaderInSection phần: Int) chức năng, kiểm tra xem các hàng/chiều cao nên là 0.

Trong trường hợp của tôi, tôi đã sử dụng phần 1-12 cho dữ liệu động của tôi vì vậy tôi đã sử dụng mã như dưới đây:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    //For section 0 and 13, just 1 row is ok 
    if section == 0 || section == 13 { 
     return 1 
    } 

    //For sections 1 - 12, determine if we have data to populate it, or if we should hide it 
    if section <= dynamicDataToDisplay.count { 
     return 2 
    } 

    //If it's section 1 - 12, but we don't have a corresponding data entry in dynamicDataToDisplay, then just return 0 rows 
    return 0 

} 

Mã cho chức năng heightForHeader cũng tương tự như trong logic:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 

    switch section { 

    case 0: 
     return 45.0 
    case 13: 
     return UITableViewAutomaticDimension 
    default: 
     if dynamicDataToDisplay.count >= section { 
      return 25.0 
     } else { 
      return 0.0 
     } 

    } //end switch 

} 

Ngay cả sau khi thiết lập các chức năng này, tôi thấy rằng tôi vẫn nhận được tiêu đề xuất hiện cho các phần tôi muốn ẩn. Tôi đoán tôi nghĩ rằng viewForHeaderInSection sẽ không được gọi nếu numberOfRows là 0 và heightOfHeader cũng là 0, nhưng nó vẫn đang được gọi.

Thêm những điều sau đây giúp đảm bảo rằng các tiêu đề không cần thiết tạo:

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

    //set up header for dynamic data sections 
    if 1 ... 12 ~= section { 

     if tableView.numberOfRows(inSection: section) == 0 { 
      return nil 
     } 
     //Continue with the header set up for valid sections with rows to display data 

     ...... 
    } 
} 

Giải pháp này có thể giúp đỡ bất cứ ai vẫn còn nhận được một tiêu đề được tạo ra mặc dù chiều cao và các hàng của nó được thiết lập là 0.

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