カスタム 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;
}
提案を歓迎します。