【问题标题】:Setting initialFirstResponder in a storyboarded OSX app在故事板 OSX 应用程序中设置 initialFirstResponder
【发布时间】:2016-04-30 04:32:48
【问题描述】:

类似于this question,我试图在一个非常简单的应用程序中将第一响应者设置为三个NSTextFields 中的第一个。那里的建议(在界面构建器中设置Window 的第一响应者)似乎不再适用,至少在涉及情节提要时不适用。 Window 对象确实有一个 initialFirstResponder 出口,但我无法通过拖动、ctrl-drag 等方式在往返 NSTextField 的任一方向上设置它。

IB 提供给我的结构包括一个窗口控制器场景(它本身只是一个空窗口),它链接到一个视图控制器场景(它又包含我的一组NSTextFields 和标签)。

我的怀疑是 Xcode 嵌入到我的应用程序中的一些默认假设/关联导致 Window 控制器在运行时自动加载特定视图,这就是为什么无法绑定它不知道的初始响应程序的原因大约在构建时。这让我想知道哪个对象的哪个生命周期调用是在为时已晚之前调用self.view.window.initialFirstResponder = myTextField 的正确点,以及如何最正确地访问该对象。视图控制器中的 viewWillAppearviewDidLoad 感觉不错,但似乎都没有可靠地产生任何效果(最初活动的 NSTextField 因运行而异,有时似乎跟踪代码更改,但有时不是)。

到目前为止,我已经在GitHub上发布了代码

【问题讨论】:

    标签: xcode macos storyboard first-responder


    【解决方案1】:

    initialFirstResponder 仅在 NSWindow 首次出现在屏幕上时应用。根据 Xcode 文档:

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

    如果您想将某些东西设置为第一响应者,那么您需要调用:

    斯威夫特: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 的位置..

    为错误道歉!

    【讨论】:

    • 是的,这就是为什么我想知道在应用程序生命周期的哪个时间点可以以编程方式设置窗口的 initialFirstResponder - 我无法在应用程序、窗口、视图和控制器生命周期中加快速度故事板世界。另外,这不是正确的选择。来自文档:“使用 NSWindow makeFirstResponder: 方法,而不是此方法,使对象成为第一响应者。切勿直接调用此方法。”。 becomeFirstResponder 是视图可以实现拒绝成为 firstResponder 的方法。尽管如此,makeFirstResponder 对我也不起作用!
    • 就我个人而言,我要么在 init 上调用它,要么在 viewDidLoad: 上调用它。无论哪种方式,只要控件(NSTextField 等)正确绑定到@IBOutlet,您就可以在 init() 阶段或 viewDidLoad() 阶段轻松调用 self.whateverControl.becoemFirstRsponder() ..其中任何一个在视图继承人 achy 实际生效之前发生 WAY。
    • makeFirstResponder 从 viewDidLoad 为我返回 NO
    • 在 viewDidLoad 查询中:myControl.refusesFirstResponder (boolean value)... 这在 IB 中是可设置的。它大约是控件属性检查器的 2/3...
    • 不幸的是,这不是解决方案。 becomeFirstResponder 用于询问视图是否愿意成为 firstResponder(并且根据文档,无论如何我们都不会调用),而不是将其设置为 firstResponder。根据我的经验,实际的 firstResponder 是半随机的。它可能看起来正确,并且可能不会在多次运行/构建中发生变化,但干净和重建可能会导致它发生变化(即使没有代码更改)。
    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 2013-04-03
    相关资源
    最近更新 更多