UITableView無資料時該如何呈現

Android的ListView都是用setEmptyView,然後去設定塞進EmptyView的TextView,例如顏色、字體大小等。
且xml檔都要記得放android:id="@+id/empty"的TextView

iOS的做法如下
作法1:使用UITableView自身來呈現
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (self.myDataItems.count == 0) // 資料為空, 只需1個cell呈現"無資料"資訊, 故個數是1
        return 1;
    else
        return self.myDataItems.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.myDataItems.count == 0) {
        UITableViewCell *cell = [UITableViewCell new];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.textLabel.textAlignment = NSTextAlignmentCenter;
        cell.textLabel.textColor = [UIColor lightGrayColor];
        cell.textLabel.text = @"沒有資料";
        return cell;
    }

    // 若資料不為空, 就自行實踐cell的呈現
    static NSString *CellIdentifier = @"MyCustomCellIdentifier";
    MyCustomCell *cell = (MyCustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    // 略...
 
    return cell;
}
作法2:使用UILable客製化呈現
作法1因為用cell呈現,樣式有點難隨心所欲,例如想把"沒有資料"放在畫面正中央,這時候自行new一個UILabel會是比較快的選擇
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
      // 不需要額外撰寫 if (self.myDataItems.count == 0)要怎麼處理
     return self.myDataItems.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // 不需要額外撰寫 if (self.myDataItems.count == 0)要怎麼處理, 本method只要專心處理有資料的cell要怎麼呈現即可

    // 若資料不為空, 就自行實踐cell的呈現
    static NSString *CellIdentifier = @"MyCustomCellIdentifier";
    MyCustomCell *cell = (MyCustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    // 略...
 
    return cell;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    if([self.myDataItems count] == 0) {
        //create a lable size to fit the Table View
        UILabel *messageLbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, tableView.bounds.size.height)];
        //set the message
        messageLbl.text = @"沒有資料";
        //center the text
        messageLbl.textAlignment = NSTextAlignmentCenter;
        //auto size the text
        [messageLbl sizeToFit];
        
        //set back to label view
        tableView.backgroundView = messageLbl;
        //no separator
        tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        
        return 0;
    }
    return 1;
}
參考資料 UITableView: Display Message In Empty Table View

沒有留言: