给 NSTextField 焦点-?

Posted

技术标签:

【中文标题】给 NSTextField 焦点-?【英文标题】:Give NSTextField focus -? 【发布时间】:2012-04-07 01:45:07 【问题描述】:

我目前有一个表格视图,其中包含 NSTextFields 的单元格视图。 目前,在行选择时,我正在向单元格视图发送以下消息,希望在单元格视图中授予 NSTextView 第一响应者状态:

- (void)notifyOfSelectionInWindow:(NSWindow *)window 
    [[self textField] setEditable:YES];
    [[self textField] setSelectable:YES];
    // make textField (textView) first responder
    [[self textField] selectText:nil];
    [[[self textField] currentEditor] setSelectedRange:NSMakeRange([[[self textField] stringValue] length], 0)];      

因为我不希望 NSTextFields 在未选择它们所在的行时可编辑,所以我也在我的自定义 NSTextField 子类中执行此操作:

- (void)textDidEndEditing:(NSNotification *)notification 
    [self setEditable:NO];
    [self setSelectable:NO];
    [super textDidEndEditing:notification];

选择更新代码:(注意我在这里也改变了行高)

- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row 
    // get the table veiw to animate/recalculate height of row
    NSMutableIndexSet *changedRows = [NSMutableIndexSet indexSet];
    [changedRows addIndex:row];
    [changedRows addIndex:[tableView selectedRow]];
    [tableView noteHeightOfRowsWithIndexesChanged:changedRows];
    [rowView notifyOfSelectionInWindow:[self window]]; 
    // ^ this in turn calls a method of the same name of the corresponding cell view
    return YES;

问题是,这只有 一半 的时间有效。我第一次尝试选择一行时,第一响应者状态返回到表视图。第二次,它完美地工作,并且文本字段具有焦点。第三次,又断了。第四——完美!出于某种奇怪的原因,该代码每隔一段时间才有效...

有人知道为什么会这样吗?非常感谢任何有启发性的反馈。

【问题讨论】:

【参考方案1】:

当在 tableView 中从 textField 切换到 textField 时,会以意想不到的顺序调用事件(直到您考虑一下)。

这里的问题是你的委托方法被调用的顺序。

假设您要从 textField1 转到 textField2。

一旦 textField1 已经处于活动状态并且您单击 textField2,它们就会被这样调用:

textShouldBeginEditing  (textField2)
textShouldEndEditing    (textField1)
textDidEndEditing       (textField1)
textDidBeginEditing     (textField2)

因为textShouldBeginEditingtextDidEndEditing 之前被调用(因为它需要确保它可以在放弃旧行之前选择行)你需要更新你的self.textField改为textDidBeginEditing

【讨论】:

以上是关于给 NSTextField 焦点-?的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObjectContext 保存导致 NSTextField 失去焦点

按 T​​ab 时 NSTextField 没有注意到失去焦点?

从 NSTextField 元素获取当前的第一响应者

Mac NSTextField 不会辞职 firstResponder

从 NSTextField 获取文本 [重复]

UI测试失败 - 无论是元素还是任何后代都没有将键盘焦点放在secureTextField上