加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 继续从dequeueReusableCellWithIdentifier获取ni

发布时间:2020-12-15 01:47:03 所属栏目:百科 来源:网络整理
导读:我在storyboard文件中创建了一个标识符为“mainViewTableCell”的原型单元格,并将主表视图与名为“NTTableViewController”的自定义控制器类连接起来. 我在NTTableViewController.m中实现了函数“tableView cellForRowAtIndexPath”,如下所示: - (UITableVi
我在storyboard文件中创建了一个标识符为“mainViewTableCell”的原型单元格,并将主表视图与名为“NTTableViewController”的自定义控制器类连接起来.
我在NTTableViewController.m中实现了函数“tableView cellForRowAtIndexPath”,如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString* MAINVIEW_CELLIDENTIFIER = @"mainViewTableCell";
    UITableViewCell *newCell = [tableView dequeueReusableCellWithIdentifier: MAINVIEW_CELLIDENTIFIER];

    if (newCell == nil) {
        newCell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: MAINVIEW_CELLIDENTIFIER];
        [newCell autorelease];
        newCell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    NTContactItem* currentItem = [self.contactItemContainer objectInContainerAtIndex: indexPath.row];
    NSString* firstName = currentItem.firstName;
    NSString* lastName = currentItem.lastName;

    NSString* fullName = [firstName stringByAppendingFormat: lastName];    
    [newCell.textLabel setText: fullName];
    [newCell.detailTextLabel setText: currentItem.mobilePhone];

    return newCell;
}

但我继续从dequeueReusableCellWithIdentifier获取nil,并且每次都必须创建一个新的cell实例.

那么,有什么不对?

代码:project

谢谢大家.

解决方法

对于具有原型单元格的故事板和tableviews,[tableView dequeueReusableCellWithIdentifier:]不应返回nil.即使这是第一个单元格,并且重用队列中已经没有单元格,tableview将创建原型单元格的新实例并返回该实例.

在你的情况下,问题是完全不同的(我下载你的项目,因为我真的很好奇).

在应用程序的应用程序委托中:didFinishLaunchingWithOptions:方法,您将重新初始化此tableviewcontroller.当你调用[masterController init]时,这会调用[super init],然后调用[UITableViewController initWithStyle:].

这会导致控制器创建一个新的UITableView,它与故事板中的UITableView不同.新的UITableView没有原型单元格,这就是为什么dequeueReusableCellWithIdentifier:返回nil.

当然,教训是不重新初始化已经初始化的Objective-C对象.从故事板加载表视图控制器时,加载机制将使用initWithCoder:初始化它.因此,如果您需要进行一些自定义初始化工作(比如在您的情况下设置NSMutableArray),那么只需覆盖initWithCoder:和/或awakeFromNib.

您可以根据需要覆盖这些方法,但不要自己调用它们. initWithCoder:和awakeFromNib都将由Storyboard / nib加载机制调用.

如果一切正确,则无需在此以编程方式创建单元格.不需要这段代码:

// This bit is unnecessary with storyboards:      
if (newCell == nil) {
    newCell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: MAINVIEW_CELLIDENTIFIER];
    [newCell autorelease];
    newCell.selectionStyle = UITableViewCellSelectionStyleNone;
}

希望有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读