iOS - UITableViewCell 中的自定义 UISwitch dealloc 错误

iOS - Custom UISwitch in UITableViewCell dealloc error

我正在使用 UISwitch subclass 将 UISwitch 添加到我所有的 UITableViewCell。我使用自定义 class 能够将更多信息传递给 UISwitch。

我在 iOS 8 上的错误是:

*** -[NamedUISwitch _sendActionsForEvents:withEvent:]: message sent to deallocated instance

NamedUISwitch 是我制作的自定义 UISwitch:

@interface NamedUISwitch : UISwitch
@property (nonatomic, strong) NSString *specialinfo1;
@property (nonatomic, strong) NSString *specialinfo2;
@end

@implementation NamedUISwitch

@end

这就是我在 cellForRowAtIndexPath 方法中实现 UISwitch 的方式。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [[UITableViewCell alloc] init];
    NamedUISwitch *switchview = [[NamedUISwitch alloc] initWithFrame:CGRectZero];
    [switchview addTarget:self action:@selector(updateSwitchAtIndexPath:) forControlEvents:UIControlEventTouchUpInside];
    cell.textLabel.text = ...;
    switchview.nomEtablissement = ...;
    switchview.tag = ...;
    switchview.typeInfo = ...;
    cell.accessoryView = switchview;
    return cell;
}

我已经尝试使用 Instruments 来跟踪 dealloc,但我似乎无法让它以正确的方式工作。 我该如何解决这个 dealloc 问题?

您没有正确创建单元格。您需要这样的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    NamedUISwitch *switchview = nil;
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
        switchview = [[NamedUISwitch alloc] initWithFrame:CGRectZero];
        [switchview addTarget:self action:@selector(updateSwitchAtIndexPath:) forControlEvents:UIControlEventTouchUpInside];
        cell.accessoryView = switchview;
    } else {
        switchview = cell.accessoryview;
    }

    cell.textLabel.text = ...;
    switchview.nomEtablissement = ...;
    switchview.tag = ...;
    switchview.typeInfo = ...;
    // You also need to set switchview.on here

    return cell;
}

这样你就可以正确地重复使用单元格,每个单元格只有一个开关。

更好的选择是创建自定义 table 单元格 class 并且该单元格 class 设置自己的开关。