3

UITextFieldプロトタイプセル内にタグが付いています。が構築され、上のセルの a がオンになっている場合、 はファーストレスUITextFieldポンダーになるように設定されています。これは、アプリを最初から起動した場合、またはアプリを閉じて再起動した場合に機能します。ロードされると、はトリガーされなくなります。UITableViewUISwitch[tableView reloadData]becomeFirstResponder

UITextField後でテキストフィールドに触れてファーストレスポンダーになった場合、ボタンやポップアップなどでイベントをトリガーできますbecomeFirstResponder...しかし、スイッチではできなくなりました。

私が試すことができるものについての指針はありますか?

現在、didSelectRowAtIndexPathメソッドを使用してポップアップをトリガーしています。良い副作用は、数字キーパッドをプルアップすると、キーパッドの個別のボタンをいじる代わりに、ポップアップ内に [OK] ボタンと [キャンセル] ボタンを提供できることです。しかし、それは明らかに回避策のようです。

これは、ビルド時に firstresponder を呼び出す方法ですUITableView(アプリがゼロから起動するたびに機能します)。

if ([settings doubleForKey:@"limitDouble"]==0 && [settings boolForKey:@"limitBool"]==YES) {
    [dailyLimitEntry becomeFirstResponder];
}

DailyLimitEntry はUITextField強力なため、そのまま残ります。

楽しみのために、ボタンを追加して、次のようにコードに接続しました。

UITextField *tmp = (UITextField *)[self.view viewWithTag:35];
[tmp becomeFirstResponder];

これも機能します。スイッチで使用すると、アプリがメモリに新たにロードされたときにのみ呼び出されます。そうUITextFieldしないと、スイッチに応答しません。

UITableView最初のコメントの後、リロードが完了したかどうかを確認する方法を見つけました

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if([indexPath row] == ((NSIndexPath*)[[settingsTableView indexPathsForVisibleRows] lastObject]).row){
        //end of loading
        //for example [activityIndicator stopAnimating];
        NSLog(@"finished reload");
        NSLog(@"%@",dailyLimitEntry);
        if ([settings boolForKey:@"limitBool"]==YES) {
            UITextField *tmp = (UITextField *)[self.view viewWithTag:35];
            [tmp becomeFirstResponder];
        }
    }
}

楽しいことですが、ファーストレスポンダーになるのは、アプリが読み込まれた後に最初にスイッチが使用されたときにのみトリガーされます. 最初は、スイッチはオフです。そのため、 を含むセルUITextFieldはまだ描画されていません。に切り替えるとONUITextFieldが 2 番目のセルに描画され、ファーストレスポンダになります。もう一度切り替えOFFても、ログに「リロード完了」が表示されますが、最初の応答者にはなりません。それは私を夢中にさせています....アプリのライフサイクルに関する何かに違いありません。ONUITextField

4

1 に答える 1