IOS 7 UITextField resignFirstResponder 坏
Posted
技术标签:
【中文标题】IOS 7 UITextField resignFirstResponder 坏【英文标题】:IOS 7 UITextField resignFirstResponder BAD 【发布时间】:2013-10-01 13:32:19 【问题描述】:在我的 customCell 中使用 UItextField 时,以及当我 resignFirstResponder 文本字段时,我遇到了崩溃,但它不再可见(表格视图滚动出窗口)。我仍然可以找到文本字段,指针继续可访问,它不为空,并且崩溃仅发生在 ios7 上,在 IOS6 上我没有这个问题。这是一些代码:
textField
是一个全局变量。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSString * CellIdentifier = [NSString stringWithFormat:@"Cell%d",indexPath.row];
TableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[TableCell alloc] init];
if(indexPath.row == 0)
[textField setFrame:CGRectMake(15, 5, cell.frame.size.width-60, cell.frame.size.height)];
textField.textAlignment = NSTextAlignmentLeft;
[textField setBorderStyle:UITextBorderStyleNone];
textField.textColor = [UIColor blackColor];
textField.tag = indexPath.row;
textField.delegate = self;
textField.secureTextEntry = YES;
[textField setFont:[UIFont fontWithName:@"Arial-BoldMT" size:15]];
textField.textColor = [UIColor whiteColor];
textField.returnKeyType = UIReturnKeyDone;
[textField setAdjustsFontSizeToFitWidth:YES];
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Senha" attributes:@NSForegroundColorAttributeName: [UIColor whiteColor]];
[cell.contentView textField];
return cell;
-(BOOL)textFieldShouldReturn:(UITextField *)textField
// NSLog(@"text field %@",textField);
// NSLog(@"tfield return: %d",textField.isFirstResponder);
[textField resignFirstResponder];
// [self.view endEditing:YES];
return NO;
【问题讨论】:
您在所有 UITableViewCells 中都有相同的 textField 实例?真奇怪。如何分配初始化 textField IVar ? 例如,我只放了一个 TextField,但我有: if(indexPath.row == 0) [textField1 setFrame:CGREctMake(0,0,0,0)]; if(indexPath.row == 1) [textField2 setFrame:CGREctMake(0,0,0,0)]; 然后我在我的 viewDidLoad @tdelepine 中初始化它们 OK 如何分配初始化 textField IVar ?什么是崩溃消息 我在过去的一天里一直在处理这个完全相同的问题——任何时候第一响应者不可见(例如,在键盘后面滚动)并且它被辞职,崩溃乙>。我的文本字段不是全局变量,因此崩溃与此无关。仅限 iOS7。 @Answerbot,感谢您的提示,我已经成功地在我的应用程序上重现了崩溃。 【参考方案1】:在 Apple 的帮助下,我成功修复了一个类似的崩溃错误。关键是reuseIdentifer
。
引用来自Apple 开发者技术支持的 Vincent Gable 的邮件:
这是在 iOS 7 中使用
UITableView
发生的已知行为变化,当单元格未被重用时。这里的解决方法是确保您遵循正确的单元重用。如果您不想重复使用
UITableViewCells
,那么建议您简单地将所有视图布局在UIScrollView
中。为确保重复使用单元格,请确保您传递给
dequeueReusableCellWithIdentifier:
的字符串与使用alloc/init
创建单元格时传递给reuseIdentifier:
的字符串相同。该字符串不能为 nil。
所以我认为你应该确保你设置TableCell
的reuseIdentifer
属性与你传递给dequeueReusableCellWithIdentifier:
的值相同
【讨论】:
+1 此修复有效。在我的情况下,InterfaceBuilder 中的单元格上没有设置重用标识符。如果您通过使用 tableView 注册单元格来使用更现代的单元格重用方法,这可能不是问题,但是,如果您仍然通过 loadNibNamed 手动加载 nib——就像我正在使用的遗留代码一样——它几乎肯定会在某个时候咬你。 @MichaelG.Emmons,就我而言,我也没有在 IB 中设置reuseIdentifer
。我从来没有注意到有这样的财产存在。【参考方案2】:
您需要对 UITableView 的工作原理进行更多研究并重新考虑您的设计。将 UITextField 存储在全局变量中并尝试像这样定位它不是正确的方法。即使您可以解决眼前的问题,即 UITextField 可能已与 UITableViewCell 一起发布,但这种设计只会让您陷入更深的困境。
请考虑将 UITableViewCell 子类化并将 UITextField 属性添加到您的子类中。
您可能也不希望对每一行都使用不同的 CellIdentifier。
【讨论】:
【参考方案3】:也许我已经解决了。 这是一个有点肮脏的方法,但我认为它有效。 我存储了 cellForRowAtIndexPath 创建的所有单元格
if (!cell)
cell = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"FormCell_%@",cellID] owner:nil options:nil] lastObject];
[self.allTheCell addObject:cell];
该应用在 ios7 上不再崩溃
【讨论】:
以上是关于IOS 7 UITextField resignFirstResponder 坏的主要内容,如果未能解决你的问题,请参考以下文章
UITextField 上的 UITapGestureRecognizer 不再适用于 IOS 7.1
如何在 iOS 7 中向 UIAlertView 添加多个 UITextField?
IOS 7 UITextField resignFirstResponder 坏