17

ナビゲーション コントローラーを使用して詳細ビューにドリルダウンするコア データ アプリケーションがあり、詳細ビューでデータ行の 1 つを編集すると、Apple の CoreDataBooks のように、その 1 行の編集ビューに移動します。例(CoreDataBooksは、私UITextFieldのようなサブビューではなく、単独でのみ使用することを除いてUITableViewCell)!

編集ビューはUITableviewController、単一セクションの単一行とUITextfieldセル内のテーブルをプログラムで作成するものです。

私がしたいのは、編集する行を選択し、編集ビューがナビゲーション スタックにプッシュされ、編集ビューが画面上を移動するアニメーションになっている場合です。テキスト フィールドを firstResponder として選択して、キーボードが既に表示されているようにします。ビューが画面上を移動して位置を決めるとき。連絡先アプリや CoreDataBooks アプリと同様です。

現在、アプリに次のコードがあり、ビューが読み込まれ、キーボードが表示されます(これは私が望んでいるものではありません。キーボードが既に存在することを望んでいます)

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [theTextField becomeFirstResponder];
}

-viewWillAppearテキストフィールドがまだ作成されていないため、これを入れることはできませんtheTextField。彼らが欲しいものを達成するCoreDataBooksアプリでは、ペン先からビューをロードするので、同じコードを使用しますが-viewWillAppear、テキストフィールドはすでに作成されています!

いずれにせよ、ペン先を作成せずにこれを回避する方法はありますか?私は実装をプログラム的に維持して、柔軟性を高めたいと考えています。

どうもありがとう

4

4 に答える 4

16

Apple Dev Support Teamと話した後、私は答えを持っています!

あなたがする必要があるのは、オフスクリーンを作成し、UITextFieldそれ-(void)loadView;をファーストレスポンダーとして設定することです。次に、viewDidLoadメソッドで、をファーストレスポンダーとして設定できUITextFieldますUITableViewCell。ここにいくつかのサンプルコードがあります(私はこれをで行っているUITableViewControllerので、テーブルビューも作成していることを忘れないでください!

- (void)loadView
{
    [super loadView];

    //Set the view up.
    UIView *theView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.view = theView;
    [theView release];

    //Create an negatively sized or offscreen textfield
    UITextField *hiddenField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, -10, -10)];
    hiddenTextField = hiddenField;
    [self.view addSubview:hiddenTextField];
    [hiddenField release];

    //Create the tableview
    UITableView *theTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] bounds] style:UITableViewStyleGrouped];
    theTableView.delegate = self;
    theTableView.dataSource = self;
    [self.view addSubview:theTableView];
    [theTableView release];

    //Set the hiddenTextField to become first responder
    [hiddenTextField becomeFirstResponder];

    //Background for a grouped tableview
    self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    //Now the the UITableViewCells UITextField has loaded you can set that as first responder
    [theTextField becomeFirstResponder];
}

これが私と同じ立場で立ち往生している人に役立つことを願っています!

他の誰かがこれを行うためのより良い方法を見ることができるなら、言ってください。

于 2010-04-22T14:36:23.247 に答える
5

viewDidAppear メソッドで試してみてください。私にとってはうまくいきます。

于 2011-09-03T08:10:30.503 に答える
3

init明らかな解決策は、View Controllerのメソッドでテキストフィールドを作成することだと思います。ビュー コントローラーには入力済みのビュー プロパティが必要なため、通常はここでビューを構成します。

次に、テキストフィールドをファーストレスポンダーとして設定するviewWillAppearと、ビューがスライドインするとキーボードが表示されるはずです。

于 2010-04-17T13:44:13.533 に答える
2

uinavigationcontroller デリゲート メソッドを使用してみましたか?:

navigationController:willShowViewController:アニメーション:

于 2010-04-18T22:21:22.197 に答える