0

カスタム UITableViewCell (サブクラス化) があり、うまく機能します。セルの一部は UITextField であり、これを @property として外部に公開します。ただし、initWithStyle 関数での UITextField の割り当てと設定を含め、すべてがセル内で内部的に管理されます。

私が気づいたのは、適切なサイズのテーブル (一度にページに表示できるよりも多くのセル) を作成し、UITextField の 1 つを選択し、少し入力し、最後に下にスクロールして別のセルを選択すると、プログラムがクラッシュすることです。

次の場合、プログラムはクラッシュしません。

  • 元のセルに入力することを除いて、上記の手順を繰り返します
  • UITextField に入力し、スクロールしてテキスト フィールドの近くに入力します。
  • 特定のテキストフィールドに直接ジャンプして入力を開始する

現在、セルを再利用していませんが、すべてのバグが解消されたら再利用します。

クラッシュ スタックを調べると、プログラムが元のテキスト フィールドのファーストレスポンダを辞任しようとしているために、これが発生しているようです。このテキスト フィールドは誤って割り当て解除されましたか? セルを選択し、画面からスクロールして、入力を開始し、最後までスクロールして、入力した内容を表示できるので、そうは思いません。内部の *textfield ポインタが変更されましたか? オーバーロードされた UITableViewCell の initWithStyle:reuseIdentifier: 関数でのみ割り当てるようにするべきではありませんでした。コードのどこにも rejectFirstResponder を呼び出しません。

私のUIView(例えばUITableViewCell)が(UITableViewCell内から - できればいくつかのメソッドをオーバーロードすることによって)画面外にスクロールしたかどうかを識別する方法はありますか?viewDidUnload が頭に浮かびますが、それは viewControllers 用です。そのようなメソッドがあれば、それを利用して、テキスト フィールドの resignFirstResponder と、その上で処理したいその他の処理を行います。

いくつかのコード:

// In the .h
@interface mycell:UITableViewCell <UITextFieldDelegate>;
@property (nonatomic, retain) UITextField *textfield;
@end

// In the .m
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuse];
    if (!self) return self;

    self.textfield = [[UITextField alloc] initWithFrame:CGRectZero];
    [self.textfield setDelegate:self];
    [self addSubview:self.textfield];
    return self;
}

提案を歓迎します。

4

0 に答える 0