Objective-C中如何从独立NSWindow调用NSPanel内的方法
问题解决方法
首先明确报错原因:*类方法归属类本身,不属于任何实例化对象,无法访问仅实例对象持有的IBOutlet属性MetadataView,无需将方法改为类方法即可实现父窗口调用需求,以下是两种可行实现方案:
方案1:Xib绑定实例引用(推荐)
- 保持TableController中刷新方法为实例方法,不要修改为类方法,
MetadataView属性定义无需变动。 - 在父NSWindow对应的控制器类的.h文件中添加TableController实例的输出口:
@property (weak) IBOutlet TableController *tableControllerInstance;
- 打开MainMenu.xib,按住Ctrl从父窗口控制器对象,拖拽到Objects分区已存在的TableController对象上,松开后选择绑定到刚才定义的
tableControllerInstance输出口完成关联。 - 在父窗口按钮的点击事件方法中直接调用实例方法即可:
- (IBAction)parentWindowReloadBtnClick:(id)sender { [self.tableControllerInstance reloadMetadataTable]; }
注:上述代码中的
reloadMetadataTable替换为你自己实际用来调用[MetadataView reloadData]的方法名即可。
方案2:通知机制实现跨组件调用
如果通过Xib绑定实例不方便时,可使用通知机制实现解耦调用:
- 在TableController的
- (void)awakeFromNib方法中添加通知监听:
- (void)awakeFromNib { [super awakeFromNib]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadMetadataTable) name:@"ReloadMetadataTableNotification" object:nil]; }
- 在父窗口按钮的点击事件中发送对应通知即可触发刷新:
- (IBAction)parentWindowReloadBtnClick:(id)sender { [[NSNotificationCenter defaultCenter] postNotificationName:@"ReloadMetadataTableNotification" object:nil]; }
- 在TableController的
dealloc方法中移除通知监听,避免内存泄漏:
- (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; }
内容的提问来源于stack exchange,提问作者SimonKravis
相关产品推荐
相关产品推荐

