之前我曾经使用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
答案 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的yourController
和delegate
设置为dataSource
;
yourController
当然,您应该在self.tableView.delegate = self;
self.tableView.dataSource = self;
;
然后:
yourController
这适合我。