2

我之前使用过 NSTableView 几次,并且我使用此方法没有任何问题,但由于某种原因,在我的最新程序中,tableViewSelectionDidChange:当我切换行时没有调用委托方法。我创建了一个非常简单的程序来尝试找到它的源头,但由于某种原因它仍然无法正常工作。我知道我可能忽略了一些小东西,但我已经盯着这个看了几个小时,并将它与我的其他代码进行比较,但我什么也看不到。

AppDelegate.h:

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDataSource, NSTableViewDelegate>

//not sure if the NSTableViewDelegate part is needed, as I've used this before without it

@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTableView *tableView;

@end

AppDelegate.m:

#import "AppDelegate.h"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
}
- (void)tableViewSelectionDidChange:(NSNotification *)aNotification{
    NSLog(@"Row changed");
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
    return 2;
}

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
    return nil;
}

@end
4

4 回答 4

9

我也有这个tableViewSelectionDidChange:方法没有被调用的问题,但只有在我关闭并重新打开我的对话框之后。事实证明,这个“委托”方法确实有一个通知观察者签名,原因是:Apple 只是将您的委托方法注册到 NSNotficationCenter。因此,如果您[[NSNotificationCenter defaultCenter] removeObserver:self];像我在我的windowDidHide方法中所做的那样调用,您将不会再收到有关表选择更改的通知。

解决方案不是懒惰和调用,您[[NSNotificationCenter defaultCenter] removeObserver:self];需要取消注册您之前明确观察到的通知。

于 2013-11-13T15:38:08.477 回答
4

另外插入以下行,看看会发生什么。确保您已将 AppDelegate 设置为源和委托。

- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(NSInteger)rowIndex {
    return YES;
}

如果这没有帮助,我不知道原因。

于 2013-06-04T07:31:01.797 回答
2

您需要设置它的数据源并委托给 AppDelegate,方法是按住 control 并单击 tableview 控件并将字符串扩展到 AppDelegate 的蓝色图标(如果还没有的话)。

于 2013-06-03T03:57:52.007 回答
0

您需要用NSViewController诸如包装表格视图,将表格视图的和yourController设置为;delegatedataSourceyourController

self.tableView.delegate = self;
self.tableView.dataSource = self;

当然,你应该在 ; 中实现委托方法和数据源方法yourController

然后:

window.contentViewController = yourController;

这对我有用。

于 2018-04-16T09:25:25.467 回答