基于视图的NSTableView文本字段失去焦点

时间:2017-03-31 08:02:27

标签: objective-c nstableview

选择一行后,按TAB键通常会将焦点移动到下一个可编辑的文本字段,或者在我的情况下,列。但是,我注意到只有在按下TAB后,该行才会变为灰色并且焦点丢失。然后我必须单击文本字段才能继续。经过几天的观察,我仍然无法检测到可重复的模式,互联网搜索没有给我足够的信息。我想知道我的代表是否可能是罪魁祸首。有些问题浮现在脑海中。

  1. 任何人都可以了解为什么或如何失去焦点? (由Willeke的评论间接回答删除一些代码)
  2. 是否有适当或刻意的方法强制关注下一个文本字段? (现在无关紧要)
  3. 提示前两个问题的不可预测的行为似乎是两种方法之间的干扰。解决一个至少导致可预测的行为和这个相关的问题。我在下面用另一种方法包含了更多代码。一列包含一个弹出按钮。通常,选择值不会选择行(即突出显示)。我希望选择并聚焦行(即突出显示为蓝色),以便我可以立即TAB到下一个字段并开始编辑。在editPopUps:中,selectRowIndexes:将选择行,但该行为灰色而不是蓝色,因此TAB无效。如何选择并聚焦行?
  4. 更新:以下是一些相关方法。我根据列设置了每个视图,因为只有一些列是可编辑的。

    - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
        NSString *column = tableColumn.identifier;
        NSTableCellView *value = [tableView makeViewWithIdentifier:column owner:self];
    
        Foo *foo = self.foos[row];
        [self setupView:value column:column foo:foo];
        [self populateCellView:value column:column foo:foo object:[foo valueForKey:column]];
    
        return value;
    }
    
    - (void)setupCellView:(NSTableCellView *)view column:(NSString *)column foo:(Foo *)foo {
        view.textField.alignment = NSRightTextAlignment;
        BOOL editable = YES;
        if ([attribute isEqualToString:column] || ![foo.x isEqualToNumber:bar.x]) {
            editable = NO;
        } else {
            view.textField.target = self;
            view.textField.action = @selector(editTextField:);
        }
        [view.textField setEditable:editable];
    }
    
    - (void)editTextField:(NSTextField *)sender {
        if ([self.fooTableView numberOfSelectedRows]) {
            NSTableCellView *cellView = (NSTableCellView *)[sender superview];
            NSString *column = cellView.identifier;
            NSInteger row = [self.fooTableView rowForView:cellView];
            Foo *foo = self.foos[row];
            NSNumber *amountNumber = [NSNumber numberWithShort:[sender intValue]];
            if ([attribute isEqualToString:column]) {
                foo.y = amountNumber;
            } else {
                foo.z = amountNumber;
            }
    
            [self.fooTableView reloadDataForRowIndexes:[NSIndexSet indexSetWithIndex:row] columnIndexes:[NSIndexSet indexSetWithIndex:[self.fooTableView columnWithIdentifier:column]]];
            [self refreshSelection];
        }
    }
    
    - (void)editPopUps:(NSPopUpButton *)sender {
        GlorpView *glorpView = (GlorpView *)[sender superview];
        NSString *column = pokeCellView.identifier;
        NSInteger row = [self.fooTableView rowForView:glorpView];
        Foo *foo = self.foos[row];
        NSNumber *indexValue = [NSNumber numberWithShort:[sender indexOfSelectedItem]];
        NSMutableIndexSet *columnIndexes = [NSMutableIndexSet indexSetWithIndex:[self.fooTableView columnWithIdentifier:column]];
    
        if ([attribute isEqualToString:column]) {
            foo.Z = indexValue;
        }
    
        [self.fooTableView selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
        [self refreshSelection];
    }
    

0 个答案:

没有答案