2010-07-20 31 views
8

UITableView của tôi lấy dữ liệu ra khỏi internet. Đôi khi nó không nhận được bất kỳ dữ liệu (ô) nào. Nó chỉ hiển thị một bảng trống.UITableView Không có màn hình dữ liệu

Làm cách nào để hiển thị thông báo/ô cho người dùng mà không tìm thấy bản ghi dữ liệu?

Trả lời

25

Bạn muốn trả lại một báo cáo ô về việc thiếu dữ liệu.

Nếu bạn đang giữ dữ liệu di động của bạn trong một mảng đó là một tài sản lớp (giả sử NSArray *listings), bạn có thể đi:

-(NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section 
{ 
    if ([self.listings count] == 0) { 
     return 1; // a single cell to report no data 
    } 
    return [self.listings count]; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if ([self.listings count] == 0) { 
     UITableViewCell *cell = [[[UITableViewCell alloc] init] autorelease]; 
     cell.textLabel.text = @"No records to display"; 
     //whatever else to configure your one cell you're going to return 
     return cell; 
    } 

    // go on about your business, you have listings to display 
} 
+0

nó là một ý tưởng tốt để bộ nhớ cache tế bào này giống như với các tế bào bình thường khác? nếu vậy, làm thế nào để bạn làm điều đó? – Yazzmi

+0

Bạn không phải lo lắng về việc lưu vào bộ nhớ đệm của ô đơn này vì nó sẽ biến mất vào phút bạn có dữ liệu thực tế để hiển thị và tính năng tự động sửa sẽ giúp bạn nhớ. Nó sẽ không bao giờ di chuyển ra khỏi bảng, do đó, thực sự không có gì để cache. Nhân tiện, bạn cũng muốn làm điều này NHƯ BẠN cũng mất dữ liệu của mình. Sau đó, khi quá trình mạng của bạn được thực hiện và bạn đã điền nguồn dữ liệu của mình, hãy gọi 'reloadData' trên UITableView của bạn. –

+0

hoạt động giống như sự quyến rũ - chỉ cần điều chỉnh phông chữ một chút để nhận được thông báo tôi muốn phù hợp: [cell.textLabel setFont: [UIFont fontWithName: @ Helvetica-Bold "size: 13]]; – jaySF

2

Bạn có thể thêm kiểm tra trong -tableView: cellForRowAtIndexPath: triển khai và hiển thị UITableViewCell đặc biệt nói "không có kết quả khả dụng" khi bạn không nhận được dữ liệu.

Cách tiếp cận khác, nhìn chung tốt hơn, là thêm chế độ xem tùy chỉnh vào UITableView trực tiếp. Đừng quên xóa nó khi có kết quả để hiển thị.

2

Bạn có thể thêm một UILabel để xem bạn này có thể được tạo lập trình hoặc trong xib của bạn. Nếu xib của bạn có chứa một UITableView như [tự xem], như là điển hình cho một UITableViewController, sau đó tạo ra một tài sản cho các nhãn trên viewController bạn

@property (nonatomic, retain) IBOutlet UILabel  *noResultsLabel; 

Kéo một UILabel từ thư viện vào cửa sổ tài liệu như một anh chị em đến "Chế độ xem bảng" của bạn. Đặt các thuộc tính văn bản (phông chữ đậm 36pt, màu xám nhạt trông khá tốt)
Kéo điều khiển từ "Chủ sở hữu tệp" để nối đầu ra vào nhãn.

UITableView with no results UILabel

Trong callback máy chủ của bạn, bạn có thể thêm các nhãn để xem. Dưới đây là một ví dụ:

#pragma mark - 
#pragma mark Server callbacks 
- (void)serviceExecutionComplete:(NSMutableArray *)results { 
    [self setServerData:results]; 
    if ([results count] == 0) 
    { 
     // no results, 
     CGRect viewFrame = [[self view] frame]; 
     [[self noResultsLabel] setFrame:CGRectMake(0, (viewFrame.size.height - 100)/2, viewFrame.size.width, 50.0)]; 
     [[self view] addSubview:[self noResultsLabel]]; 
    } 
    else 
    { 
      [[self noResultsLabel] removeFromSuperview]; 
     [self.tableView reloadData]; 
    } 
} 

Bạn có thể làm điều tương tự trong tableView: numberOfRowsInSection: nếu phù hợp với thiết kế của bạn tốt hơn

1

Tôi đã dự tính cho thấy một emptyDataView trong hoặc header/footer, hoặc hack một trong những hàng như câu trả lời được đề xuất từ ​​Dan.

Nhưng tôi nghĩ rằng cách đơn giản nhất là tạo chế độ xem bên ngoài bảngView.

@property (weak, nonatomic) IBOutlet UIView *emptyDataView; 

Sau đó ẩn/hiển thị khung nhìn trong numberOfRowsInSection: như thế này:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    id sectionInfo = [[_fetchedResultsController sections] objectAtIndex:section]; 

    // Show empty data view if no data 
    _emptyDataView.hidden = ([sectionInfo numberOfObjects] == 0) ? NO : YES; 

    return [sectionInfo numberOfObjects]; 
} 

này hoạt động tốt với Core Data NSFetchedResultsController và ẩn xem một lần có dữ liệu.

1

Như đã đề cập trong liên kết bên dưới, thật dễ dàng nếu chúng ta tạo nhãn và đặt làm chế độ xem nền cho UITableView như dưới đây. Có thể nó hữu ích cho ai đó. http://www.appcoda.com/pull-to-refresh-uitableview-empty/

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    if (data) { 
     self.tableView.backgroundView = nil; 
     self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; 
     return 1; 

    } else { 

     // Display a message when the table is empty 
     UILabel *messageLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)]; 

     messageLabel.text = @"No data is currently available. Please pull down to refresh."; 
     messageLabel.textColor = [UIColor blackColor]; 
     messageLabel.numberOfLines = 0; 
     messageLabel.textAlignment = NSTextAlignmentCenter; 
     messageLabel.font = [UIFont fontWithName:@"Palatino-Italic" size:20]; 
     [messageLabel sizeToFit]; 

     self.tableView.backgroundView = messageLabel; 
     self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 

    } 

    return 0; 
} 
+0

Tôi đã thử phương pháp này. Được cảnh báo rằng nếu bạn trả về 0 phần khi bạn không có dữ liệu, ứng dụng sẽ treo nếu bạn sử dụng deleteRowsAtIndexPaths. Để khắc phục điều này, tôi luôn trả về 1 cho số phần. Tôi cũng đã thêm 'self.tableView.backgroundView = nil' nếu dữ liệu tồn tại. – davew

-1

Ở đây tôi sử dụng mã như:

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 
NSInteger numOfSections = 0; 
if ([jsonArray count] != 0){ 
    tableview.separatorStyle = UITableViewCellSeparatorStyleSingleLine; 
    numOfSections     = 1; 
    tableview.backgroundView = nil; 
} 
else{ 
    UILabel *noDataLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableview.bounds.size.width, tableview.bounds.size.height)]; 
    noDataLabel.text    = @"No item found."; 
    noDataLabel.textColor  = [UIColor blackColor]; 
    noDataLabel.textAlignment = NSTextAlignmentCenter; 
    tableview.backgroundView  = noDataLabel; 
    tableview.separatorStyle  = UITableViewCellSeparatorStyleNone; 
} 
    return numOfSections; 
} 

- (NSInteger)tableView:(UITableView *)theTableView numberOfRowsInSection:(NSInteger)section{ 
    return [jsonArray count ]; 
} 
Các vấn đề liên quan