【问题标题】:NSTextField set cursorNSTextField 设置光标
【发布时间】:2012-06-06 21:20:48
【问题描述】:

好的,所以我觉得这个问题显然缺少一些东西。我在整个代码中使用 makeFirstResponder 从 textField 1 移动到 2、2 到 3 等。这似乎可以按我的意愿工作,但是当加载新视图时,我希望光标位于 textField1 中,并且但是以下代码在加载时并未将光标置于 textField1 中。

- (void) awakeFromNib{
    [[[self view] window] makeFirstResponder:textField1];
}

我也尝试了 setInitialFirstResponder,但也没有任何效果(我什至不认为这是正确的。)那么,是因为它在 awakeFromNib 方法中吗?谁能告诉我我错过了什么?提前致谢。

编辑 - 我的解决方案与接受的答案略有不同,所以我想我会发布我的实现。因为我想为其设置第一响应者的视图是稍后添加的子视图(想想应用程序向导的第二个屏幕),我只是添加了一个 setCursorToFirstTextField 方法:

- (void) setCursorToFirstTextField {
[[[self view] window] makeFirstResponder:textField1];
}

并确保在我将子视图添加到原始窗口的自定义视图后调用它。

【问题讨论】:

    标签: objective-c nstextfield first-responder


    【解决方案1】:

    是的,你说得对,问题在于 awakeFromNib 中方法的位置。如果您在 awakeFromNib 中记录 [self.view window],您会看到它为 NULL。我不知道您到底是如何设置的,但我猜(如果这与您的 WizardController 问题有关)您正在另一个类中执行 alloc initWithNibName:bundle: 来创建您的视图控制器,然后添加它控制器的视图到视图层次结构。如果你把一些日志扔在那里,它会告诉你控制器类中的 awakeFromNib 在 alloc init 之后被调用,但在视图被添加为子视图之前,所以当时没有窗口。我解决这个问题的方法是在视图控制器类中创建一个设置方法(其中包含 makeFirstResponder 代码),并在将其添加为子视图后从创建控制器的类中调用它。

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
        self.wizard = [[WizardController alloc] initWithNibName:@"WizardController" bundle:nil];
        [self.window.contentView addSubview:wizard.view];
        [self.wizard doSetup];
    }
    

    【讨论】:

    • 您的解释绝对正确并且对我有帮助,但是因为我想为其设置 firstResponder 的视图不是我的应用程序窗口的第一个视图(想想向导的第二个屏幕),我实施的解决方案略有不同(见编辑),但您的回答非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    • 2011-10-03
    相关资源
    最近更新 更多