iOS 7中的UITextField resignFirstResponder问题

9

我在使用自定义单元格中的UItextField时出现了崩溃,当我使用resignFirstResponder退出textfield时,它不再可见(表视图已经滚动出了屏幕)。我仍然可以找到textfield,指针仍然可以访问,它不是null,但是只有在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;
}

好的,如何分配初始化textField IVar?还有什么崩溃信息? - tdelepine
2
我已经花了过去一天的时间来解决这个完全相同的问题 - 任何时候第一个响应者不可见(例如,滚动到键盘后面)并且它被辞职,就会崩溃。我的文本字段不是全局变量,所以崩溃与此无关。仅适用于iOS7。 - memmons
@Answerbot,谢谢你的提示,我已经成功地在我的应用程序上重现了崩溃。 - Zhao Xiang
@ZhaoXiang 感谢您下面的答案。这也是我的崩溃根本原因。终于有了解决方法,太棒了。 - memmons
darkman:你应该将Zhao的回答标记为正确答案。 - memmons
显示剩余2条评论
3个回答

9
我曾在Apple的帮助下成功解决了一个相似的崩溃问题。关键在于reuseIdentifer
这句话来自于Apple Developer Technical SupportVincent Gable 的邮件:
“这是iOS7中UITableView的已知行为更改,当单元格未被重用时会发生崩溃。
修复方法是确保遵循正确的单元格重用方式。如果您不想重新使用UITableViewCells,那么建议您简单地在UIScrollView中布置所有视图。
为确保单元格被重用,请确保将相同的字符串传递给dequeueReusableCellWithIdentifier:,并且与使用alloc/init创建单元格时所传递给reuseIdentifier: 相同。该字符串不能为nil。”
因此,我认为您应确保设置TableCellreuseIdentifer属性,其值应该与您传递给dequeueReusableCellWithIdentifier:相同。

+1 这个修复方法可行。在我的情况下,InterfaceBuilder 中的单元格没有设置 reuseIdentifier。如果您使用更现代的通过向 tableView 注册单元格来重用单元格的方法,则这可能不是问题,但是,如果您仍然通过 loadNibNamed 手动加载 nib 文件,就像我正在处理的遗留代码一样,它几乎肯定会在某些时候咬你一口。 - memmons
@MichaelG.Emmons,在我的情况下,我也没有在IB中设置reuseIdentifer。我从来没有注意到有这样的属性存在。 - Zhao Xiang

1
你需要对UITableView的工作方式进行更多研究并重新考虑你的设计。将UITextField存储在全局变量中并尝试像这样定位它并不是正确的方法。即使你能解决即时问题,即UITextField已经与UITableViewCell一起被释放,这种设计只会在今后给你带来麻烦。
相反,考虑子类化UITableViewCell并向你的子类添加一个UITextField属性。
你可能也不想为每一行使用不同的CellIdentifier。

0

也许我解决了。 这是一个有点脏的方法,但我认为它有效。 我存储所有由cellForRowAtIndexPath创建的单元格

if (!cell) { cell = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"FormCell_%@",cellID] owner:nil options:nil] lastObject]; [self.allTheCell addObject:cell]; } 应用程序在iOS7上不再崩溃


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接