UITableViewCell
のリロードに関する奇妙なバグに直面しています。にカスタムrightView
が含まれています。 UITextField
とUITextFieldにrightViewを含むリロードすると無限ループとメモリがオーバーフローする
マイカスタムセル:
@implementation TableViewCell
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
_textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
_textField.text = @"This is a text field";
[self.contentView addSubview:_textField];
}
return self;
}
@end
UITableView
と私のビューコントローラ:
@interface ViewController() <UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (nonatomic) UIView *rightView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// Press to reload the row with rightView
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(reloadRow)];
// Create rightView and store to a property
_rightView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 24, 24)];
_rightView.backgroundColor = [UIColor greenColor];
[_tableView registerClass:[TableViewCell class] forCellReuseIdentifier:@"Cell"];
_tableView.dataSource = self;
}
- (void)reloadRow {
[_tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0
inSection:0]]
withRowAnimation:(UITableViewRowAnimationAutomatic)];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.textField.rightView = _rightView;
cell.textField.rightViewMode = UITextFieldViewModeAlways;
return cell;
}
@end
私はバグを証明するのは非常に簡単な例を作成しました
それだけです。次に、リロードボタンを押します。無限ループが始まり、アプリケーションがハングします。私はそこ、プロパティにrightView
を格納し、各時間セルデキューtableView
新しいビューを作成しない場合は、
Terminated due to memory error.
しかし:それはあまりにも多くのメモリを使用するため、いくつかの秒後、アプリがクラッシュします問題はありません。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.textField.rightView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 24, 24)];
cell.textField.rightView.backgroundColor = [UIColor greenColor];
cell.textField.rightViewMode = UITextFieldViewModeAlways;
return cell;
}
しかし、私のrightView
(実際のアプリで)ので、私は行が現れるたびにそれを再作成する必要はありません単純なビューではありません。
これがなぜ起こったのか誰でも知っていますか?私がrightView
を保管していないと、なぜそれは起こりませんでしたか?読んでくれてありがとう。
のインスタンスを返します生地の方法を作るからそれを削除してみてください? – thorb65
私は 'UITableViewCell'のサブクラスを1つ持っています。これは、アプリケーション内のあらゆる場所で使うことができ、' rightView'を1つのビューコントローラで使用するので、セルのサブクラス内に追加することはできません。 – kientux
正しい方法は、アプリケーション全体で1つだけでなく、異なるUITableViewCellクラスを使用することです:-) – thorb65