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。

所以我认为你应该确保你设置TableCellreuseIdentifer属性与你传递给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 坏的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7获取UITextField默认层

UITextField 上的 UITapGestureRecognizer 不再适用于 IOS 7.1

如何在 iOS 7 中向 UIAlertView 添加多个 UITextField?

IOS 7 UITextField resignFirstResponder 坏

右对齐 UITextField 空格键在 iOS 7 中不前进光标

ios 7底部的白线与UITextField