1

多くのビューを持つ比較的大きな iPhone アプリケーションがあります。キーボードに次/前のオプションを実装したいと思います。オンラインで見たいくつかのコード例を使用して、UI ごとに実装することができましたが、それらはすべて、テキスト フィールド間の実際の遷移を実装するために各ビュー コントローラーにコードを追加する必要があると想定しています。

私の質問は次のとおりです。あるテキスト フィールドが与えられた場合、次のフィールドが誰であるかを知る一般的な方法はありますか? (つまり、各View Controllerをリファクタリングせずに)

iPhoneシミュレーターを使用してコンピューターのTabキーを押すと、フィールド間の切り替えが発生するため、この質問をします。iOSに組み込みまたは一般的な方法で実装できるのではないかと思います。

明確化: ビューコントローラーの種類ごとに特定のコードを追加せずにそれを行う方法はありますか? (汎用コードの追加は許容されます)

4

3 に答える 3

2

ここで私に与えられた多くの良い答えの助けを借りて、私がこの問題をどのように解決したかを書きたい:)

まず、ビューに関係なくタブを作成する完全に汎用的なコードを作成できませんでした。代わりに、このことを作成しました。これは、firstResponder メソッドが機能しない最も一般的なソリューションだと思います。

  • 次/前/完了ボタンと適切なアクションデリゲートを備えたカスタムツールバーを作成しました。
  • カテゴリ「タブ」を追加してUIViewControllerを拡張しました。このカテゴリは fieldsArray を宣言し、delegate メソッドを実装します。
  • ここで、特定のすべてのビュー コントローラーが (カテゴリをインポートする以外に) 行う必要があるのは、プロパティに従ってこの fieldsArray を提供し、このフィールドにボタン ツールバーを追加する init メソッドを呼び出すことです。

この恩恵を受けることができれば幸いです。また、すべての良い回答に感謝します

于 2013-08-27T11:06:22.113 に答える
0

これは私が思いついた一般的なコードです:

// add a property for the fieldsArray

//add this in viewDidLoad
_fieldsArray = [[NSMutableArray alloc] init];
NSArray *viewsArray = [self.view subviews];
for (id view in viewsArray) {
    if ([view isKindOfClass:NSClassFromString(@"UITextField")]) {
        [_fieldsArray addObject:view];
    }
}

//add this in your action that switches the fields
for (UITextField *field in _fieldsArray) {
    if ([field isFirstResponder]) {
        if ([fieldsArray lastObject] == field) {
            [_fieldsArray[0] becomeFirstResponder];
        }else {
            NSUInteger nextIndex = [_fieldsArray indexOfObject:field] + 1;
            [_fieldsArray[nextIndex] becomeFirstResponder];
        }
        break;
    }
}

それを使用する前に、それを改善する必要があります。

1) のすべてのサブビューをself.view再帰的に見つける

2) 配列が空か nil か、オブジェクトが 1 つしかないかどうかをチェックします。

幸運を!

于 2013-06-30T14:40:07.003 に答える