【问题标题】:viewWithTag: returns nil after reloadDataviewWithTag:reloadData 后返回 nil
【发布时间】:2015-04-04 14:37:55
【问题描述】:

我有使用自定义单元格制作的 6 行的 tableView。

自定义单元格有一个 UILabel 和一个 UISwitch。 在“cellForRowAtIndexPath:”方法中,我有:

    static NSString *CellIdentifier = @"optionsCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    UISwitch *optionsSwitch = (UISwitch *)[cell viewWithTag:300];
    UILabel  *optionsLabel  = (UILabel *) [cell viewWithTag:200];

    NSLog(@"%@", optionsSwitch);
    NSLog(@"%@", optionsLabel);

第一次实例化 tableView 时(从情节提要)我正确地得到了两个对象(我只为表格视图的第一行添加结果):

但是当我将 reloadData 方法发送到 tableView 时(UISwitch 状态可以通过编程方式更改,因此我在显示它之前更新了 tableview)我正确地获得了 UILabel 而 UISwitch 为 nil:

为什么 UILabel 有效而 UISwitch 无效?

UISizeClasses 未启用,正如另一篇关于此问题的帖子中所建议的那样。

谢谢,科拉多

【问题讨论】:

    标签: ios objective-c uitableview uiswitch viewwithtag


    【解决方案1】:

    您在代码的其他地方更改开关的标记,可能是这样当开关更改时您可以从中获取行号。

    真的,你应该有一个自定义单元格,它有视图的出口,所以你根本不需要使用标签,并且单元格应该处理开关更改以更新模型或调用视图控制器的一些回调。

    【讨论】:

    • 其实我并没有改变标签:标签只分配在基于indexPath.row的“cellForRowAtIndexPath:”中。出于测试目的,我什至不更改 UISwitch 的状态或其他任何内容......我只是重新加载 tableview 而不更改任何内容。
    • the tag is only assigned in the "cellForRowAtIndexPath:" based on indexPath.row - 这正是问题所在,您不能这样做然后重用单元​​格...
    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2019-06-20
    • 2017-12-16
    • 2014-09-27
    • 2017-06-11
    相关资源
    最近更新 更多