web-dev-qa-db-ja.com

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

私のアプリケーションでは、UITextField内にUITableViewCellがあります。テキストフィールド内をクリックしてテキストを追加すると、挿入ポイントを移動しようとすると、最初は機能しますが、その後の試行では失敗することがわかります。選択範囲を完全に移動できません。 「虫眼鏡」は表示されません。

さらに不思議なことに、この「設定」は、アプリケーションを再起動するまで永続的であるように見えます。そして、それは私が最初に編集しようとしたものだけでなく、その画面上のすべてのUITextFieldsに影響します。

自分で見たい場合は、iPhoneSDKに付属の「UICatalog」サンプルを試してみてください。 「テキストフィールド」をクリックしてから「編集」をクリックし、テキストボックスをいじってみてください。

私はこれについて多くの掘り下げをしましたが、グーグルにとってはかなり難しいです!私が見つけた最高のリファレンスは AppleのサポートボードMacRumors formum (どちらもiPhone 2.0で動作していたようですが、現在のバージョンでは動作しないソリューションを参照しています- -やってみました)。

これはOSのバグだと思いますが、セカンドオピニオンと回避策があるかどうかを確認するためにSO群衆にこれを捨てると思いました。 ?

Benzadoの提案に従って、2.0、2.1、および2.2SDKを使用してアプリケーションを構築してみました。すべてのバージョンで同じ動作がしました。 (実際、2.2では関連しているが同じではない何かが壊れましたが、それはおそらく別の質問です!)

24

私はこれに多くの時間を費やしましたが、私はついにそれを釘付けにしたと思います。

秘訣は、テーブルを編集可能にする必要があることです(つまり、そのeditingプロパティをYESに設定する必要があります)。良いニュースは、挿入ポイントを移動できるようになったことです。虫眼鏡が表示されない、または追従しない場合がありますが、ジェスチャーは常に機能しているように見えます。

これはまだバグと見なされますか?おそらく。少なくとも、AppleのSDKドキュメントを更新する必要があります。これをカバーするためにApple)でバグレポートを作成しました(rdar:// 6462725)。

12

この投稿のおかげで、これをアプリで正常に機能させることができました。

ただし、追加するもの:

テーブルを編集可能に設定すると、予想とは異なる動作が発生する可能性があります(インデント、ウィジェットの編集、開示インジケーターなしなど)。これは私を驚かせましたが、これに最もよく対処する方法は次のとおりです。

UITableViewデリゲートで、以下を実装します。

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    return NO;
}

次に、UITableViewCellの実装で、実際に編集しているときにのみUITableViewを編集可能に設定します。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    ((UITableView *)[self superview]).editing = YES;
...
}

編集が完了したら編集を無効にします。

- (void)textFieldDidEndEditing:(UITextField *)textField
{
...
    ((UITableView *)[self superview]).editing = YES;
}

これにより、セルを編集していないときにテーブルが編集モードになっていないことが保証され、作業がスムーズになります。

ありがとう!

ブライアンM.クリスクオロマーク/スペースインク.

2
Brian Criscuolo

Brian M. Criscuoloの答えが最も近いですが、それでも完全には正しくありません。SDK2.2.1の使用法では、次のことを行う必要があることがわかりました。

UITableViewDelegate(多くの場合UITableViewController)に、次の両方を追加します。

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    return NO;
}

そして:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    return UITableViewCellEditingStyleNone;
}

そして:

- (void)viewDidLoad {
[super viewDidLoad];

    // do any other customisation here
self.uiTableView.editing = true;
}

上位2つのデリゲートメソッドを配置しない場合、上記の場合、各行の横に削除アイコンが表示され、各行がインデントされます。

ブライアンが示したように、テキストフィールドデリゲートに対して何もする必要はありません(複数の行があり、編集モードでは取得されないように見えるdidSelectRowAtIndexPath:イベントに応答する場合を除く)。彼が示唆するように)。

ちなみに、これはSDK3.0で修正されているようです(変更される可能性がありますが)

2
TimM

iOS 12以降では、ストーリーボードでテーブルビューセルを選択し、属性インスペクターでユーザーインタラクションを有効にするを有効にします。

0
Saeed Ir

私は自分のアプリケーションでこれを試しましたが、期待どおりに機能しているようです。毎回虫眼鏡をもらいます。 2.1SDKを使用しています。

0
lostInTransit

実際に最も効果的なのは、「viewDidLoad」でテーブルの「editing」プロパティをtrueに設定し、これらをテーブルデリゲートに追加することです。

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    return NO;
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return NO;
}

テキストフィールドデリゲートで何もする必要はありません

0
billy bob

OSのバグのように聞こえます。 2.0、2.1、および2.2 SDKに対してUICatalogサンプルを実行して再現し、変更があるかどうかを確認します。 (デバイスに搭載されているOSのバージョンに関係なく、2.2用にビルドした場合に発生するが、2.1用にビルドした場合には発生しない、テーブルセルのテキスト配置に関連するバグがあります。)

違いが出ることが判明した場合、 https://bugreport.Apple.com/

0
benzado