9

customCell内でUItextFieldを使用し、テキストフィールドをresignFirstResponderするとクラッシュしますが、もう表示されません(テーブルビューがウィンドウからスクロールアウトしました)。私はまだテキストフィールドを見つけることができ、ポインタは引き続きアクセス可能で、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;
}
4

3 に答える 3

9

Apple の助けを借りて、同様のクラッシュ バグを修正することに成功しました。キーはreuseIdentiferです。

この引用は、Apple Developer Technical SupportのVincent Gableからのメールからのものです。

UITableViewこれは、セルが再利用されない場合に iOS 7 で発生する既知の動作変更です。

ここでの修正は、適切なセルの再利用に従っていることを確認することです。を再利用したくない場合はUITableViewCells、すべてのビューを 内に単純にレイアウトすることをお勧めしますUIScrollView

セルが確実に再利用されるようにするには、 を使用してセルを作成dequeueReusableCellWithIdentifier:するときに渡したものと同じ文字列を に渡していることを確認してください。この文字列を nil にすることはできません。reuseIdentifier:alloc/init

TableCellしたがって、渡したのと同じ値でのreuseIdentiferプロパティを設定したことを確認する必要があると思いますdequeueReusableCellWithIdentifier:

于 2013-10-24T02:51:05.003 に答える
1

UITableViews がどのように機能するかをさらに調査し、設計を再検討する必要があります。UITextField をグローバル変数に格納し、このように配置しようとするのは正しい方法ではありません。UITextField が UITableViewCell と一緒にリリースされた可能性が高いという差し迫った問題を解決できたとしても、この設計では、さらに問題が発生するだけです。

代わりに、UITableViewCell をサブクラス化し、UITextField プロパティをサブクラスに追加することを検討してください。

おそらく、行ごとに異なる CellIdentifier を使用したくないでしょう。

于 2013-10-01T16:51:38.460 に答える