如何通过从NSTableView中选择行来创建操作

Cod*_*ama 17 cocoa objective-c 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Cod*_*ama 27

所以这里的问题是当我tableViewSelectionChange点击NSTableColumn中的一行时,我试图使用它来触发事件.由于我无法完成这项工作,我采取了另一种方法,即创建一个IBAction并将其链接到NSTableView,我发现这很好用.

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

  1. 删除 - (void)tableViewSelectionDidChange
  2. 创建IBAction
  3. 在XIB文件中,Received Actions在IBAction和NSTableView之间创建一个链接,在"发送操作"下的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
    }
}
Run Code Online (Sandbox Code Playgroud)


And*_*rew 5

为了扩展 Coderama 的答案,代码中的等效内容是:

tableView.target = self;
tableView.action = @selector(tableViewClicked:);
Run Code Online (Sandbox Code Playgroud)

然后在同一个类中实现该方法:

- (void)tableViewClicked:(id)sender {
    // This will return -1 if the click did not land on a row
    NSLog(@"tableView.clickedRow = %ld", tableView.clickedRow);

    // This will return -1 if there is no row selected.
    NSLog(@"tableView.selectedRow = %ld", tableView.selectedRow);
}
Run Code Online (Sandbox Code Playgroud)

每次单击视图时,表视图都会在您设置的目标上调用其操作方法。这将使您知道每次选择一行,即使它已经被选择。