objective-c - 如何通过从 NSTableView 中选择一行来创建操作

标签 objective-c cocoa nstableview

当我从 NSTableView 中选择一行时,它没有运行 tableViewSelectionDidChange 方法中的代码。我在这个方法中设置了断点,它甚至没有进入这个方法。

有什么想法吗?我在初始化程序中遗漏了什么吗?

PersonController.h

#import <Foundation/Foundation.h>

@interface Person : NSObject {
  IBOutlet NSTableView *personsTable;
  NSMutableArray *personsList;
  NSMutableArray *personCollection;

  IBOutlet NSTextField *selectedPersonName;
  IBOutlet NSTextField *selectedPersonGender;
@private

}

- (void)tableViewSelectionDidChange:(NSNotification *)aNotification;

@end

PersonController.m

#import "PersonController.h"
#import "Person.h"


@implementation PersonController

- (id)init
{
    self = [super init];
    if (self) {
        personsList = [[NSMutableArray alloc] init];
        Person *person = [[Person alloc] init];

        // Create person 1
        person.name = @"Bob";
        person.gender = @"male";

        // Append to array
        [personsList addObject:person];
        [person release];

        // Create person 2
        person = [[Person alloc] init];
        person.name = @"Fred";
        person.gender = @"Unknown";

        // Append to array
        [personsList addObject:person];
        [person release];

        [personsTable reloadData];
    }

    return self;
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
    return [personsList count];
}

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    Person *person = [personsList objectAtIndex:row];
    NSString *identifier = [tableColumn identifier];

    return [person valueForKey:identifier];
}

- (void)tableViewSelectionDidChange:(NSNotification *)aNotification
{
    NSInteger selectedRow = [personsTable selectedRow];
    if (selectedRow == -1)
    {
        // these should be localized, but use string constants here for clarity
        [selectedPersonName setStringValue:@"No selection"];
        [selectedPersonGender setStringValue:@"No selection"];
    }
    else
    {
        Person *selectedPerson = [personCollection objectAtIndex:selectedRow];

        [selectedPersonName setStringValue:[selectedPerson name]];
        [selectedPersonGender setStringValue:[selectedPerson gender]];
    }
}

- (void)dealloc
{
    [super dealloc];
}

@end

最佳答案

所以这里的问题是我试图使用 tableViewSelectionChange 在单击 NSTableColumn 中的一行时触发事件。由于无法正常工作,我采用了另一种方法,即创建一个 IBAction 并将其链接到 NSTableView,我发现它运行良好。

为了做到这一点,我做了以下事情:

  1. 删除- (void)tableViewSelectionDidChange
  2. 创建 IBAction
  3. 在 XIB 文件中,在 IBAction 和 NSTableView 之间创建一个 Received Actions 链接,在 NSTableView 连接检查器中的“发送操作”下有“选择器”操作“将这个”选择器“与那个 IBAction 连接起来你想触发。

这是 PersonController.m 中的 IBAction

- (IBAction)columnChangeSelected:(id)sender
{
    NSInteger selectedRow = [personsTable selectedRow];

    if (selectedRow != -1) {
        NSLog(@"Do something with selectedRow!");
    }
    else {
        // No row was selected
    }
}

关于objective-c - 如何通过从 NSTableView 中选择一行来创建操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9139484/

相关文章:

ios - 在 Swift 中使用 Facebook Messenger SDK

ios - 我的 iPad Storyboard上的详细 View 未填充

cocoa - 我的应用程序被拒绝。它访问 '/usr/lib/libpcap.A.dylib' 我该怎么做才能避免它?

objective-c - 使用 NSArrayController 对 NSTableColumn 进行排序

cocoa - NSTableView 适用于 osx 10.0,但 NsTableViewDataSource 仅适用于 10.6?

objective-c - NSOutlineView:拖动项目时避免出现黄色边框?

objective-c - UITextView 从 iOS10 底部开始

iphone - IF 语句在第一次运行时不检查条件

objective-c - 苹果操作系统 X : Intercept keyboard layout change

macos - NSTableView -noteNumberOfRowsChanged 的​​ NSView 版本是什么?