2016-01-23 14 views
5

this questionと同様に、私は最初のレスポンダを3つのうちの最初のものに設定しようとしています。NSTextFieldはとても簡単なアプリです。そこにあるアドバイス(Windowのインターフェースビルダーの最初のレスポンダーを設定)は、Storyboardsが関係しているときには、少なくとももう適用しないようです。 Windowオブジェクトは実際にはinitialFirstResponderアウトレットを持っていますが、NSTextFieldとの間のどちらの方向にもドラッグ、ドラッグ、ドラッグなどで設定する方法はありません。ストーリーボードOSXアプリケーションでinitialFirstResponderを設定する

構造IBは、ビューコントローラシーン(これにはNSTextFieldとラベルのセットが含まれています)にリンクされたウィンドウコントローラシーン(それ自体は空のウィンドウ)を備えています。

私の疑惑は、Xcodeがアプリケーションに焼き付けられて、実行時に特定のビューを自動的にロードする原因となるいくつかの既定の仮定/関連があることです。そのため、初期レスポンダをバインドすることができませんビルド時に知っている。それで、遅くなる前に、どのオブジェクトのライフサイクルコールがself.view.window.initialFirstResponder = myTextFieldという正しいポイントであるか、そしてそのオブジェクトへのアクセスを最も正確に得る方法が不思議に思えます。 View ControllerのviewWillAppearまたはviewDidLoadは正しいと感じていますが、いずれも確実に影響を及ぼさないようです(最初はアクティブなNSTextFieldが実行ごとに異なりますが、コードの変更を追跡するように表示されることもあります)。

私はNSWindowのは、最初の画面に表示されたときにのみ適用されGitHub

答えて

2

initialFirstResponderに、これまでのコードを掲載しました。 Xcodeのドキュメントごとのように:

`NSWindow initialFirstResponder` 
The view that’s made first responder (also called the key view) the first time the window is placed onscreen. 

あなたが最初の応答者として何かを設定したい場合は、あなたが起動する必要があります。

SWIFT:yourTextField.becomeFirstresponder()

のObj-C:[yourTextField becomeFirstresponder];

希望インクルード助けて!

アデ

編集

私は、文字通り数行までご.Mを剃っ:

#import "ViewController.h" 

    @implementation ViewController 

    #pragma mark - View lifecycle 

    -(void)viewWillAppear{ 
     [super viewWillAppear]; 
     //[self.userTextField becomeFirstResponder]; 
     [self.pathTextField becomeFirstResponder]; 
    } 

    #pragma mark - Connection actions 

    - (IBAction)connectClicked:(id)sender { 

    } 

    - (IBAction)cancelClicked:(id)sender { 
     // Tell the app delegate (once we've actually got a pointer to it) that we want to exit 
    // [self.delegate exitApplication]; 
    } 



    @end 

私のせい!申し訳ありませんが、viewWillAppear(ビューが実際に表示される直前)は、becomeFirstResponderを配置した場所です。

謝罪!

+0

ええ、アプリのライフサイクルのどの時点で、プログラムによってウィンドウのinitialFirstResponderを設定することができるのだろうかと思っていました。ストーリーボードの世界でアプリ、ウィンドウ、ビュー、およびコントローラのライフサイクルをスピードアップするわけではありません。また、それは正しい呼び出しではありません。ドキュメントから: "このメソッドではなく、NSWindow makeFirstResponder:メソッドを使用して、オブジェクトを最初のレスポンダにします。このメソッドを直接呼び出さないでください。" becomeFirstResponderは、firstResponderになることを拒否するために実装できるメソッドビューです。それでも、makeFirstResponderは私にとってはうまくいきません! – Chris

+0

個人的に私はinitまたはviewDidLoad:でそれを呼び出す。どちらの方法でも、コントロール(NSTextFieldなど)が@IBOutletに正しくバインドされていれば、init()ステージまたはviewDidLoad()ステージでself.whateverControl.becoemFirstRsponder()を簡単に呼び出すことができます。ビューの継承が実際に効力を発する前に、いずれかの方法が起こります。 –

+0

makeFirstResponderがviewDidLoadからNOを返す – Chris

関連する問題