tableViewSelectionDidChange:未被调用

问题描述 投票:2回答:4

我曾经使用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
objective-c cocoa nstableview
4个回答
4
投票

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

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

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


8
投票

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

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


2
投票

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


0
投票

你需要用NSViewController这样的yourController包装tableview,将tableview的delegatedataSource设置为yourController;

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

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

然后:

window.contentViewController = yourController;

这适合我。

© www.soinside.com 2019 - 2024. All rights reserved.