2

iPhone のフォト ギャラリーで、YouTube ビデオ アップローダー ビューに似たテーブル ビューを作成しようとしています。

これが基本的なセットアップです。

UITextField を含むカスタム UITableViewCell を作成しました。テーブルにセルを表示するとうまくいき、問題なくテキストを編集できます。テキスト フィールドでテキストが変更されたときに表示できるように、イベント フックを作成しました。

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]

やりたいことはこれです。ユーザーが最初にテキストを編集するとき、現在のセルの下のテーブル ビューに新しいセルを挿入したい (newIndexPath は適切な位置の前に計算される):

[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationBottom];
[self.tableView endUpdates];

問題は、セル挿入コードを実行すると、セルが作成されますが、テキスト フィールドのテキストが一時的に更新されますが、キーボードが閉じられ、テキスト フィールドが空の文字列に戻されることです。

どんな助けでも素晴らしいでしょう!私は一日中これについて頭を悩ませてきました。

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section
{
    if (section == 0)
        return 2;
    else
        return self.tags.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    cell = (SimpleTextFieldTableCell *)[tableView dequeueReusableCellWithIdentifier:tagCellIdentifier];

    if (cell == nil)
    {
        cell = [[[NSBundle mainBundle] loadNibNamed:@"SimpleTextFieldTableCell" owner:nil options:nil] lastObject];
    }

    ((SimpleTextFieldTableCell *)cell).textField.delegate = self;
    ((SimpleTextFieldTableCell *)cell).textField.tag = indexPath.row;
    ((SimpleTextFieldTableCell *)cell).textField.text = [self.tags objectAtIndex:indexPath.row];
    [((SimpleTextFieldTableCell *)cell).textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

- (void)textFieldDidChange:(id)sender
{
    UITextField *textField = sender;

    [self.tags replaceObjectAtIndex:textField.tag withObject:textField.text];
    if (textField.text.length == 1)
    {
        [textField setNeedsDisplay];
        [self addTagsCell];
    }
}

- (void)addTagsCell
{
    NSString *newTag = @"";
    [self.tags addObject:newTag];

    NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:self.tags.count - 1 inSection:1];
    [self.tableView beginUpdates];
    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationBottom];
    [self.tableView endUpdates];
}
4

2 に答える 2

0

ここで考えられる唯一のことは、行を挿入するとテーブルビュー全体がリロードされる可能性があるということです。セルをセルキューに適切に追加しなかった場合、元の状態に戻らないため、表示されています挿入の結果として空のセルが表示されます。推測にすぎませんが、お役に立てば幸いです。

于 2009-07-28T20:16:28.817 に答える
0

クイックアップデート:

問題ではありませんが、必要ないことに気付きました:

[self.tableView beginUpdates]
[self.tableView endUpdates]

1 つの操作を実行しているためです。それが重要かどうかはわかりません(そうすべきではありません)。


アップデート:

そのような問題はかなり一般的だと言っておくべきでした。これはあなたの問題に関連する投稿です

http://www.bdunagan.com/2008/12/08/uitextview-in-a-uitableview-on-the-iphone/

また、他の人はこれを抽象化しています。具体的には、そのような問題なしでこれを試しました:

http://furbo.org/2009/04/30/matt-gallagher-deserves-a-medal/

使用できます: http://github.com/joehewitt/three20/

しかし、それには少し学習曲線があります。

この問題に取り組む別の Stackoverflow の質問:

UITableViewCell 内の UITextField の編集が失敗する

あなたの問題に直接答えなくて申し訳ありませんが、解決策はこれらのリンクのいずれかに含まれていると思います.


元の回答:

試す:

[newTextField setNeedsDisplay];

UITextView/UITextField コンテンツを更新すると、テーブルビューが「スティッキー」になることがあります。

それでもうまくいかない場合は、バッキング モデルも適切に更新されていることを確認してください。モデルを更新したことを示すコードは表示されていません (ただし、更新したと思いますが、そうでなければ例外がスローされた可能性があります)。

于 2009-07-29T03:07:55.340 に答える