2016-01-23 11 views
5

Ähnlich wie this question, ich versuche, den ersten Responder auf die erste von drei NSTextField s in einer sehr einfachen App zu setzen. Der Hinweis dort (setze den Window 's Ersthelfer im Interface Builder) scheint nicht mehr zu gelten, zumindest nicht wenn Storyboards involviert sind. Das Window Objekt hat tatsächlich eine Steckdose, aber ich kann keine Möglichkeit finden, es per Drag, Strg-Ziehen usw. in beide Richtungen zu/von NSTextField zu setzen.InitialFirstResponder in einer Storyboard-OSX-App einstellen

Die Struktur IB hat mir zur Verfügung gestellt umfasst eine Window Controller-Szene (selbst nur ein leeres Fenster) mit einer View-Controller-Szene verbunden (die wiederum enthält meine Reihe von NSTextField s und Etiketten).

Mein Verdacht ist, dass es eine Standardannahme/-verknüpfung gibt, die Xcode in meine App eingebaut hat, die bewirkt, dass der Fenster-Controller automatisch eine bestimmte Ansicht zur Laufzeit lädt, und deshalb ist es nicht möglich, einen ersten Responder zu binden wissen um zur Bauzeit. Das lässt mich dann fragen, welcher Lifecycle-Aufruf an welchem ​​Objekt der richtige Zeitpunkt ist, um self.view.window.initialFirstResponder = myTextField anzurufen, bevor es zu spät ist, und wie man am richtigsten Zugang zu diesem Objekt erhält. viewWillAppear oder viewDidLoad in der View-Controller fühlen sich richtig, aber keiner scheint zuverlässig zu wirken (die zunächst aktive NSTextField variiert von Lauf zu Lauf, manchmal scheint, um Code-Änderungen zu verfolgen, aber entweder nicht).

ich den Code gepostet habe bisher auf GitHub

Antwort

2

initialFirstResponder wird nur angewendet, wenn die NSWindow zuerst auf dem Bildschirm erscheint. Gemäß den Xcode-Dokumentation:

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

Wenn man etwas als Ersthelfer setzen wollen, dann müssen Sie aufrufen:

swift: yourTextField.becomeFirstresponder()

Obj-C: [yourTextField becomeFirstresponder];

Hoffe, dass die hilft!

Ade

bearbeiten

ich .m bis auf ein paar Zeilen wörtlich rasiert:

#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 

meine Schuld! Entschuldigung, viewWillAppear (kurz bevor die Ansicht tatsächlich angezeigt wird) ist, wo Sie findRirstResponder setzen ..

Entschuldigung für den Fehler!

+0

Yeh, deshalb frage ich mich, an welchem ​​Punkt im App-Lebenszyklus es möglich war, den initialFirstResponder des Fensters programmatisch zu setzen - Ich bin nicht in der Lage, App, Fenster, Ansicht und Controller-Lebenszyklus in einer Storyboard-Welt. Auch das ist nicht der richtige Ruf. Aus der Dokumentation: "Verwenden Sie die Methode makeFirstResponder: NSWindow, nicht diese Methode, um ein Objekt zum ersten Responder zu machen. Rufen Sie diese Methode niemals direkt auf." BecomesFirstResponder ist eine Methode, die Views implementieren können, um den FirstResponder abzulehnen. Trotzdem funktioniert makeFirstResponder auch nicht für mich! – Chris

+0

persönlich ich entweder auf init oder viewDidLoad aufrufen :. Auf jede Weise, vorausgesetzt, dass das Steuerelement (NSTextField etc ..) ordnungsgemäß an ein @IBOutlet gebunden ist, können Sie einfach self.whateverControl.becoemFirstRsponder() in der Stufe init() oder viewDidLoad() aufrufen.Entweder was passiert, bevor die Sicht Erbitterung tatsächlich wirksam wird. –

+0

makeFirstResponder gibt NO für mich aus viewDidLoad – Chris

Verwandte Themen