6

iPhone ベースの BI プロジェクトに取り組んでいます。

私は に を持っています。私UITextFieldのへUITextViewCellUITextFieldDelegateポイントです。 も もUITableViewControllerサブクラス化していUITextViewCellませんUITextField

テキストフィールドがデリゲートの編集を終了した後

  -(void)textFieldDidEndEditing:(UITextField*)textField

編集中の現在のセルの行インデックスを知る必要があります。テキスト フィールドの親セルを取得する方法はありますか? または、セルを作成するときに「rowIndex」などのプロパティをテキストフィールドに設定できますか? 新しいテキストを保存するには、この値が本当に必要です。

ありがとうございました。フォースがあなたと共にありますように。

4

8 に答える 8

8

あなたが求めている本当の質問は、ユーザーがテーブル セル内のテキスト フィールドにデータを入力したときに、データ モデルへの変更を保存する場所を知る方法です。

プロパティを使用するという@Ole Begemannの提案tagは完全に有効です。データモデルによって異なります。モデル内で値が取得される場所を特定するために単一の整数のみが必要な場合は、その整数tagを各テキスト フィールドのプロパティに格納します。セクションを使用していないため、行インデックスはインデックス パス全体を持つことと同じです。

すべてのビューにはtagプロパティがあることに注意してください。cell.contentView.tagしたがって、行インデックスを に、列インデックスを に格納できますtextField.tag。テキスト フィールドから、 でコンテンツ ビューを取得しますtextField.superview。別のビューがスーパービューであるtextField場合は、代わりにそれを使用してください。

テキスト フィールドの内容を保存するモデル内の場所を特定するために、それよりも複雑なことが必要な場合は、別のことを行う必要があります。サブクラス化するか、サブクラスUITableViewCellUITextField定義するプロパティに必要な情報を保存します。

于 2011-04-20T18:16:59.290 に答える
4

サブビューとしてインを追加UITextFieldした場合、プロパティからアクセスできます。UITableViewCellUITableViewCellUITextField's superview

以下で試してみてください。

UITableViewCell* myCell = (UITableViewCell*)textField.superview ;

直面している問題についてお知らせください。

編集:

UITextFieldSoのタグプロパティから行を取得します

NSUInteger  myRow = myTextField.tag;

アプリケーションが複数のセクションを持つことをサポートしていないと言ったように、それはすべての行が 0 セクションにあることを意味します。

NSUInteger  mySection = 0;

NSIndexPath上記の情報からインスタンスを構築します。

NSIndexPath *myIndexPath =[NSIndexPath indexPathForRow:myRow  inSection:mySection]; //Do'nt release myIndexPath instance.

UITableViewCell* myCell = [myTableView cellForRowAtIndexPath:myIndexPath];

これで、UITableViewmyCellにあるものがわかりましたmyRow

于 2011-04-20T15:09:57.463 に答える
3

iOS 7 の場合は、少し異なります。aTextField が種類のオブジェクトである場合: UITextField iOS 6: [[aTextField superView] superView]

iOS 7: [[[aTextField superView] superView] superView]

Apple は、UItableViewCell とその contentView の間に ScrollView を追加しました。

編集: スクロール ビューは iOS 8 でなくなりました。

iOS 8: [[aTextField superView] superView]

于 2013-10-23T03:57:38.503 に答える
2

他の人が示唆しているように、テキスト フィールドのスーパービューにアクセスすることで、現在のセルを取得できます。そこから、UITableViewメソッド-indexPathForCell:を使用して、現在のセルのインデックス パスを簡単に見つけることができます。

アップデート

上記が最も簡単で最善の方法だと思いますが、大きなテーブル ビューでは速度が低下する可能性があります (-indexPathForCell: に線形検索が含まれる場合)。別の興味深いアイデアを読みました: セクションと行を unsigned short として表し、それらを 1 つの整数にパックし、結果をビュー (テキスト フィールド) のタグ プロパティ ( source ) に格納します。

于 2011-04-20T19:05:29.967 に答える
1

textfield.tagでセルを返すときに、行インデックスに設定できますtableView:cellForRowAtIndexPath:

于 2011-04-20T15:03:05.617 に答える
0

セルの長いテーブルがある場合、UITableView のフレームのサイズが原因で、セルの割り当てが解除される可能性があることに注意してください。

iOS はセルを再利用するため、似たようなセルが複数ある場合は、これを試してみてください: UITextField をタップしてセルの編集を開始し、選択した UITextField が表示されなくなるまで下にスクロールして、-(void)textFieldDidEndEditing:(UITextField*)textFieldメソッドで何が起こるかを確認します。textFiled.superviewセルの割り当てが解除され、もうアクセスできないため、これは NULL ポインターであることがわかります。

私の頭に浮かぶ唯一の解決策は、必要なセル属性をメソッドを介してプロパティに格納することです-(void)textFieldDidBeginEditing:(UITextField*)textField

于 2012-10-03T08:59:48.847 に答える