我的基于文档的应用程序有一个带有表格视图的窗口。该表视图具有一个数据源,该数据源指向一类NSObject(称为HopBill),该类包括NSMutableArray(aHopBill)和所需的表视图方法。到目前为止,一切都很好。
为了向表视图添加行,我添加了一个表格,该表格由NSWindowController(称为HopBillSheetController)控制。在工作表中按确定按钮时。我实际上需要执行两个IBAction(不可能):将行添加到tableview的数组中并关闭工作表。我可以将工作表中的“确定”按钮连接到NSWindowController(以关闭工作表),也可以将其连接到NSObject(将行添加到数组)。但我都想要:-)
是否可以从NSObject调用NSWindowController中的IBAction?还是有其他方法可以做到这一点?
我是Cocao和Objective-C的初学者,所以请保持温柔:-)
最佳答案
如果您的工作表是带有NSPanel的笔尖/笔尖,则关闭它的调用就是[panel close];假设窗口控制器具有面板的属性,则可以将关闭代码放在添加行IBAction的末尾。或者,您也可以根据需要让IBAction本身调用另一个方法。
如果您的面板是运行模式的,则可能还需要stopModal。 (如果在面板关闭后一切都保持冻结状态,则需要这样做;否则请不要介意。)
假设您的数据源HopBill是窗口控制器的属性,则您在窗口控制器中编写的任何IBAction都可以访问hopBill;它可以满足您的所有需求。
因此,将一个IBAction添加到窗口控制器,然后将面板的OK按钮连接到它。那应该起作用。
至于从笔尖中的控件之外的其他地方调用IBAction,可以的。使用对控件的引用作为发送方arg;如果IBAction不使用发送方arg,则使用nil。
您也可以通过编程方式创建面板,或使用NSAlert。但听起来您当前的设置更简单-因此更好。
看一下用于应用程序控制器的h文件:Apple's ClockControl example
NSMutableArray * appointments属性是NSTableViewDataSource协议方法将使用的实际数据源。 IBAction“ addAppointment”可以直接访问“约会”:[self.appointments addObject:whatever atIndex:whatever];
ClockControl示例可以修改为使用HopBill。您将在顶部导入其声明:#import“ HopBill.h”然后,它将声明HopBill * hopBill;而不是“ appointments”属性。 “ addApointment”将像这样访问HopBill的可变数组(aHopBill):[self.hopBill.aHopBill addObject:whatever atIndex:whatever];
关于cocoa - 在不同的类中调用IBAction,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6310677/