作者peliuya (Unknown)
看板MacDev
标题Re: [问题] reloadRowsAtIndexPath exception
时间Mon Nov 4 17:33:03 2013
※ 引述《peliuya (Unknown)》之铭言:
: ※ 引述《uranusjr (←这人是超级笨蛋)》之铭言:
: : 当 textFieldShouldEndEditing 被呼叫时, text field 还没有结束编辑
: : 这时候你还不能对包含它的 cell 进行 reload (正确来说应该是不能 remove)
: : 不然程式就...嗯, 失去了 consistency
: : 解决方法是不要在 textFieldShouldEndEditing: 直接呼叫 reload
: : 而是要在它「结束之後」排定一个 reload 事件
: : 最简单的解法(之一)是用 GCD 塞一个 async call
: : http://stackoverflow.com/questions/13907335/
问题可能是出在 cellForRowAtIndexPath 内, 才有资料不同步的情况
cellForRowAtIndexPath
{
AlertThresholdCell *AlertCell= (AlertThresholdCell *)
[tableView dequeueReusableCellWithIdentifier:@"AlertCell"];
if (AlertCell == nil)
{
NSArray *nibs;
nibs = [[NSBundle mainBundle]loadNibNamed:@"AlertThreshold"
owner:self options:nil];
AlertCell = [nibs objectAtIndex:0];
}
AlertCell.delegate = self;
NSLog(@"%@", AlertCell.textField);
return AlertCell;
}
textFieldShouldEndEditing
{
NSIndexPath *AlertThresholdPath;
AlertThresholdPath = [NSIndexPath indexPathForRow:1 inSection:0];
NSArray *myArray = [NSArray arrayWithObjects:AlertThresholdPath, nil];
dispatch_async(dispatch_get_main_queue(), ^{
[self.functionTable reloadRowsAtIndexPaths:myArray
withRowAnimation:UITableViewRowAnimationAutomatic];
NSLog(@"%@", textField);
return YES;
}
这两处印出的textField是不同的,
直到下次编辑结束 cellForRowAtIndexPath 中,
AlertCell才会拿到上次编辑的textField
请问我该怎麽保持资料的一致性呢?
我在cellForRowAtIndexPath 是否撰写得有问题呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.251.44.30
1F:→ s8911124:你要把cell想成只是显示资料的UI 11/04 22:52
2F:→ s8911124:你只要在reloadRowsAtIndexPath前,更新你cell要显示资料 11/04 22:52
3F:→ s8911124:即可 11/04 22:52
4F:推 s8911124:dequeueReusableCellWithIdentifier会把画面上没出现cell 11/04 22:57
5F:→ s8911124:回收,所以textfield要拿上次的是会破坏它本身系统的机制 11/04 22:59
6F:→ s8911124:textifle 注册UIControlEventEditingChanged,在对应 11/04 23:03
7F:→ s8911124:action,把资料先写进去在reloadRowsAtIndexPath即可 11/04 23:04