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 设置自己的开关。
我正在使用 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 设置自己的开关。