2010-03-22 29 views
22

Tôi có UITableView được nhóm theo đó không phải tất cả các phần có thể được hiển thị cùng một lúc, bảng được điều khiển bởi một số dữ liệu mà không phải mọi bản ghi có thể có. rắc rối của tôi là các hồ sơ mà không có bộ phận nào đó xuất hiện khoảng trống như trống trong bảng (xem hình)UITableView được nhóm lại hiển thị không gian trống khi phần trống rỗng

alt text http://img220.imageshack.us/img220/5633/screenshot20100322at228.png

Không có footers/tiêu đề. Bất cứ điều gì tôi đã bỏ lỡ?

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
// Return the number of rows in the section. 
return [self getRowCount:section]; 
} 


// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 

cell.textLabel.text = [NSString stringWithFormat:@"section: %d row: %d",indexPath.section,indexPath.row]; 
// Configure the cell... 

return cell; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    float height = 0.0; 

    if([self getRowCount:indexPath.section] != 0){ 
     height = kDefaultRowHeight; 
    } 

    return height; 

} 

Trả lời

6

Trong ảnh trên, phương thức numberOfSectionsInTableView: của bạn có trả về giá trị là 5 không? Và sau đó là phương pháp getRowCount: của bạn (được gọi là từ numberOfRowsInSection:) trả lại giá trị bằng 0 cho những phần "thiếu" đó (ví dụ: 1, 3 và 4)?

Nếu bạn không muốn những khoảng trống ở giữa, giải pháp có khả năng là chỉ khai báo số phần bạn muốn hiển thị. Trong ví dụ trên, bạn chỉ muốn trả về giá trị 3 từ numberOfSectionsInTableView:.

0

Tôi tin rằng với chế độ xem bảng mục, mỗi phần phải tồn tại và mỗi phần có phòng đệm cho đầu trang và chân trang bất kể bạn đặt văn bản vào phần đầu trang. Những gì bạn cần làm là xóa các phần không được sử dụng. Trong ví dụ của bạn, bạn sẽ loại bỏ phần 1, 3 và 4. Điều này có nghĩa:

"phần 0" là indexPath.section == 0

"phần 2" được indexPath.section == 1

"phần 5" là indexPath.section == 2

Nếu bạn mã hóa trong thời trang này, đầu trang và chân trang sẽ bị xóa vì ô không được xóa.

Đây không phải là mã hóa phù hợp, nhưng tôi chỉ muốn cung cấp cho bạn ý tưởng về thần học. Hy vọng điều này sẽ hữu ích.

38

Tôi có tình huống tương tự và mô hình dữ liệu của tôi thực sự hoạt động tốt hơn nếu tôi có thể để cho nó có các phần trống.

Sự cố của bạn có thể được giải quyết nếu bạn đặt self.tableView.sectionHeaderHeight = 0;self.tableView.sectionFooterHeight = 0; trong bộ điều khiển xem bảng của mình. Đây phải là 0 bởi vì các phương pháp đại biểu nào đó bỏ qua một giá trị trả về là 0. Sau đó, bạn phải ghi đè lên một số phương pháp đại biểu:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
    if (section==0) 
     return sectionGapHeight; 
    if ([self tableView:tableView numberOfRowsInSection:section]==0) { 
     return 0; 
    } 
    return sectionGapHeight; 
} 
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { 
    if (section==[self numberOfSectionsInTableView:tableView]-1) { 
     return sectionGapHeight; 
    } 
    return 0; 
} 
- (UIView *)sectionFiller { 
    static UILabel *emptyLabel = nil; 
    if (!emptyLabel) { 
     emptyLabel = [[UILabel alloc] initWithFrame:CGRectZero]; 
     emptyLabel.backgroundColor = [UIColor clearColor]; 
    } 
    return emptyLabel; 
} 
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    return [self sectionFiller]; 
} 
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { 
    return [self sectionFiller]; 
} 

Mã này cũng sẽ làm cho khoảng cách giữa các phần chiều cao tương tự như khoảng cách trước khi là người đầu tiên phần và khoảng cách bên dưới cuối cùng. Điều đó có vẻ tốt hơn trong quan điểm của tôi so với mặc định, nơi khoảng cách giữa hai lần lớn như những người ở trên cùng và dưới cùng.

+0

Nice, nhờ cho công tác điều tra! –

+3

Phương pháp ít xâm nhập nhất mà tôi đã tìm thấy cho đến bây giờ là trả về 1 cho heightForHeaderInSection và heightForFooterInSection 'if ([tự tableView: tableView numberOfRowsInSection: section] == 0)' và trả về một khung nhìn có kích thước bằng không cho 'viewForHeaderInSection' /' viewForFooterInSection 'nếu số hàng là 0. –

+1

Cảm ơn! Cảm ơn! Freaking Apple. Nó sẽ thực sự tốt đẹp nếu họ ghi lại những thứ như một thực tế rằng trở về 0 cho chiều cao trong đại biểu không ghi đè khoảng cách chuẩn. Có quá nhiều trường hợp cạnh API tinh tế mà Apple không ghi lại. – smparkes

4

Giải pháp này dựa trên giải pháp user362178.Nhưng giữ các nhãn của các phần còn nguyên vẹn:

Xác định đâu đó ở phía trên cùng của mã của bạn:

#define HEIGHT_FOR_HEADER_AND_FOOTER 50 

Thêm vào quan điểm tải đã làm:

self.tableView.sectionHeaderHeight = 0; 
self.tableView.sectionFooterHeight = 0; 

Thêm các phương pháp:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
{ 
    // Needed because if this does not return a value, the header label of the section will 
    // be at the top of the screen. 
    if (section == 0) 
    { 
     return HEIGHT_FOR_HEADER_AND_FOOTER; 
    } 

    if ([self tableView:tableView numberOfRowsInSection:section] == 0) 
    { 
     return 0; 
    } 
    else 
    { 
     return HEIGHT_FOR_HEADER_AND_FOOTER; 
    } 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section 
{ 
    // if last section 
    if (section == [self numberOfSectionsInTableView:tableView] - 1) 
    { 
     return HEIGHT_FOR_HEADER_AND_FOOTER; 
    } 

    return 0; 
} 
17

Đây là giải pháp phù hợp với tôi

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
    switch (section) { 
     case 1: case 3: case 5: return 20.0f; break; 
     default: return 0.01f; // for some reason 0 is not accepted - give something :) 
    } 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { 
    switch (section) { 
     case 1: case 3: case 5: return 20.0f; break; 
     default: return 0.01f; // for some reason 0 is not accepted - give something :) 
    } 
} 
+1

Tôi đọc điều này và nghĩ rằng "không có cách nào mà nó chỉ không giống như 0.0f". Nhưng tôi đã kiểm tra nó và như iOS6, đây vẫn là trường hợp. –

+0

Ngay cả trên iOS 8, 0 không phải là accepter, nhưng 0.01f là :-) –

0

Điều quan trọng là đặt chế độ xem bảng sectionHeaderHeightsectionFooterHeight thành 0.

Bạn có thể thực hiện việc này trong viewDidLoad hoặc trong các thuộc tính thời gian chạy do người dùng định nghĩa do người dùng xác định trong bảng phân cảnh/xib của bạn. Vì lý do nào đó, trong tab Kích thước thanh tra, bạn không thể đặt chiều cao đầu trang hoặc chân trang bên dưới 1.

Tôi thấy rằng một khi tôi đã làm điều này, tôi không cần ghi đè lên bất kỳ phương thức đại biểu nào khác theo cách đặc biệt. Tôi chỉ cần trả lại 0 từ numberOfRowsInSectionnil từ titleForHeaderInSection cho các mục trống và không chiếm không gian trong chế độ xem bảng của tôi.

Các phần có tiêu đề tự động được cung cấp cho kích thước tiêu đề phù hợp và đầu của chế độ xem bảng vẫn có khoảng trống mặc định.

1

tôi đã cùng một vấn đề trong iOS 7 và cuối cùng tôi giải quyết này kiểm tra Chiều cao cho Header và Footer phần, như Ramesh cho biết:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
if ([[self.tableView objectAtIndex:section] count] == 0) 
    return 0.01f; 
else 
    return 30.f; 

}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { 
return 0.01f; 

}

Đó là tò mò, nhưng nếu bạn đặt 0.f là chiều cao các phần được hiển thị với kích thước mặc định và di chuyển xuống các phần khác.

1

Dưới đây là giải pháp thanh lịch nhất mà tôi đã tìm thấy dựa trên tất cả các câu trả lời ở đây, cộng this answer:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 

    if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) { 
     return nil; 
    } else { 
     // Return title normally 
    } 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
    if ([self tableView: tableView numberOfRowsInSection: section] == 0) { 
     return 0.01f;; 
    } 

    return UITableViewAutomaticDimension; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { 
    if ([self tableView: tableView numberOfRowsInSection: section] == 0) { 
     return 0.01f;; 
    } 

    return UITableViewAutomaticDimension; 
} 
Các vấn đề liên quan