iOS - dequeueReusableCellWithIdentifier返回包含nil字段

时间:2016-12-21 23:52:49

标签: ios objective-c uitableview

我有两个UITableView,我想为UITableView使用相同的自定义单元格。 问题是其中只有一个工作正常。只有第一个表显示行。

当我调试时,我看到第二个表的cell.lb_subject是nil。

MyCustomCell仅在第一个表中被定义为原型单元(不是xib),因为我没有看到两次定义同一行的要点。

- (UITableViewCell *)tableView:(UITableView *)mytableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

        static NSString *simpleTableIdentifier = @"MyCustomCell";

        MyCustomCell *cell = [mytableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

        if (cell == nil) {
            cell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
        }
        MyRowData* data = [tableData objectAtIndex:indexPath.row];
        cell.lb_subject.text = data.subject;
  • 我有两个UIViewController
  • 每个UIViewController一个表
  • 我没有Xib,我有一个故事板。
  • 我已将demo
  • 上传到我的仓库

5 个答案:

答案 0 :(得分:0)

按照此步骤操作。

您的ViewController

  

ViewController.h

NSMutableArray *tableData;
  

ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    tableData = [[NSMutableArray alloc]initWithObjects:@"test1",@"test2",@"test3",nil];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [tableData count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //Here MyCustomCell is identifier for both tableview cell.
    static NSString *simpleTableIdentifier = @"MyCustomCell";

    //tblCell is your custom tableview cell.
    tblCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
        cell = [[tblCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }
    cell.lb_subject.text = [tableData objectAtIndex:indexPath.row];
    return cell;
}

您的自定义单元格

  

tblCell.h

//Here lb_subject is common Outlet for both label of both cell.
@property (strong, nonatomic) IBOutlet UILabel *lb_subject;

答案 1 :(得分:0)

将Tag添加到两个表中,然后分别对两个表使用dequeueReusableCellWithIdentifier。

 if (tableView.tag==1) {

    static NSString *simpleTableIdentifier = @"MyCustomCell";

        MyCustomCell *cell = [mytableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

        if (cell == nil) {
            cell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
        }
        MyRowData* data = [tableData objectAtIndex:indexPath.row];
        cell.lb_subject.text = data.subject;
        return cell;
    }
    else {
    static NSString *simpleTableIdentifier = @"MyCustomCell";

        MyCustomCell *cell = [mytableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

        if (cell == nil) {
            cell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
        }
        MyRowData* data = [tableData objectAtIndex:indexPath.row];
        cell.lb_subject.text = data.subject;
        return cell;   
}

答案 2 :(得分:0)

您尚未在其他表中添加单元格 如果您不想为viewController 2创建另一个原型单元格,则需要使用XIB

注册您的XIB:

ViewDidload而非cellForRow

中注册您的自定义单元格
[self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"CustomCell"];

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
        cell = (CustomCell *)[topLevelObjects objectAtIndex:0];
    }

    cell.cellLabel.text = _arrData[indexPath.row];

    return cell;
}

如果您仍面临同样的问题,请告诉我

答案 3 :(得分:0)

我想在customCell类中使用tableView注册单元格。像这样的东西

class func cellForTableView(tableView: UITableView, atIndexPath indexPath: NSIndexPath) -> YourCustomTableViewCell {
let kYourCustomTableViewCellIdentifier = "kYourCustomTableViewCellIdentifier"
tableView.registerNib(UINib(nibName: "YourCustomTableViewCell", bundle: NSBundle.mainBundle()), forCellReuseIdentifier:     kYourCustomTableViewCellIdentifier)

let cell = tableView.dequeueReusableCellWithIdentifier(kYourCustomTableViewCellIdentifier, forIndexPath: indexPath) as! YourCustomTableViewCell

return cell
}

您可以看到更详细的答案Here

答案 4 :(得分:0)

我猜你的每张桌子都有两个原型单元。

让我们说,表A - “CustomCellA”&对于表B - “CustomCellB”

customCell的父类应该是相同的。

现在在cellForRowAtIndexPath中写下代码,

MyCustomCell *cell;

if (tableView == tableViewA) 
    cell = [mytableView dequeueReusableCellWithIdentifier:@"CustomCellA"];
else
    cell = [mytableView dequeueReusableCellWithIdentifier:@"CustomCellB"];

应该为两个tableview找到您的单元格的出口和属性。

让我知道结果。

谢谢,希望这有帮助。