2

次のようにテーブル セルを作成します (これは最初のセクションの最初のセルであり、textField を含む唯一のセルです)。

if (indexPath.section == 0 && indexPath.row == 0) {
        GroupedTableViewCellWithTextField *cell = (GroupedTableViewCellWithTextField *) [tableView dequeueReusableCellWithIdentifier: nameCellIdentifier];
        if (!cell && !_nameCell) {
            cell = [[GroupedTableViewCellWithTextField alloc] initWithStyle: UITableViewCellStyleValue1
                                                            reuseIdentifier: nameCellIdentifier];
            cell.textField.delegate = self;
            if (!_adding)
                cell.textField.text = @"Some Text";
            _nameCell = cell;
        }
        if (!cell) {
            cell = _nameCell;
        }
        return cell;
    }

textField は単純な

- (UITextField *)textField {
    if (!_textField) {
        CGRect rect = self.bounds;
        CGFloat cellWidth = rect.size.width;
        CGFloat cellHeight = rect.size.height;
        CGRect cellRect = CGRectMake(rect.origin.x + 15, rect.origin.y, cellWidth - 48, cellHeight);

        _textField = [[SSTextField alloc] initWithFrame: cellRect];
        _textField.textColor = self.textLabel.textColor;
        _textField.placeholderTextColor = [UIColor grayColor];
        _textField.placeholder = @"Name";
        _textField.backgroundColor = [UIColor clearColor];
        _textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        _textField.textAlignment = UITextAlignmentCenter;
        _textField.returnKeyType = UIReturnKeyDone;
        _textField.alpha = 1.0f;
        [_textField becomeFirstResponder];
        [self.contentView addSubview:_textField];
    }
    return _textField;
}

で、〜がある:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    if ([_nameCell.textField isFirstResponder]) {
        [_nameCell.textField resignFirstResponder];
    return YES;
}

問題は次のとおりです。下にスクロールすると、textField のあるセルが画面の外に出て、ResignFirstResponder になるまで、

no index path for table cell being reused

しかし、一度だけ。textField でセル内に触れると、その textField は再び firstResponder を取得し、もう一度下にスクロールして、ResignFirstResponder を取得しますが、そのエラーは再度表示されません...初回のみ表示されます。

もし私が

[self.tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: 0]
                atScrollPosition: UITableViewRowAnimationTop
                    animated: YES];

スクロールが遅すぎて、まだエラーが発生します。アニメーション化しないと、セルがresignFirstResponderが呼び出されるよりも速く表示されるため、エラーは発生しなくなります。しかし、それは見た目も気分も悪いです。

私も辞任しようとしましたFirstResponder

-(void)scrollViewDidScroll:(UIScrollView *)scrollView

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

そのため、セルがビューを離れる前に発生しますが、アニメーションは途切れ途切れです。スクロールが開始され、キーボードが下に移動し始める間、一瞬停止してから再び開始します。

はっきりさせておくと、resignFirstResponder は機能します。

テーブルは、キーボードが表示されている間はスクロールが必要な大きさですが、キーボードが表示されていないときは画面に収まるほど小さいことに注意してください。

また、セルが画面に表示されなくなるまでテーブルを下にスクロールすると、ビューをポップしてもエラーが表示されます。

テーブルをスクロール可能にしたいのですが、それをオフにできることはわかっています。

エラーが表示されないようにする方法についてのアイデアはありますか? それ以外はすべて正常に動作します: データの保存、データの表示、レスポンダー、クラッシュなどはありません。

私はそれが重大なエラーではないことを知っており、そのままにしておくことができますが、それでもエラーが発生しないようにしたいと思います:)

ありがとうございました。

4

0 に答える 0