给NSTextField集中注意力 - ?

时间:2012-04-07 01:45:07

标签: objective-c cocoa osx-lion nstableview nstextfield

我目前有一个tableview,其中包含单元格视图,其中包含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 个答案:

答案 0 :(得分:2)

当从tableView中的textField切换到textField时,会以意外的顺序调用事件(直到你想到它为止)。

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

假设您从textField1转到textField2。

一旦textField1处于活动状态并单击textField2,就会像这样调用它们:

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

因为在textShouldBeginEditing之前调用了textDidEndEditing(因为它需要确保 >在放弃其旧版之前选择该行),您需要更新取而代之的是self.textField中的textDidBeginEditing