tableViewSelectionDidChange:未被调用

时间:2013-06-03 01:02:41

标签: objective-c cocoa nstableview

之前我曾经使用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 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:2)

你需要通过控制点击tableview控件并将字符串扩展到AppDelegate的蓝色图标来设置其数据源并委托给AppDelegate,如果你没有的话。

答案 3 :(得分:0)

您需要使用n = sqrt(m) NSViewController包装tableview,将tableview的yourControllerdelegate设置为dataSource;

yourController

当然,您应该在self.tableView.delegate = self; self.tableView.dataSource = self; ;

中实现委托方法和数据源方法

然后:

yourController

这适合我。