我有一个有几个IBOtlets的课程:
@interface MainDreamer : NSWindow <NSWindowDelegate>
{
IBOutlet NSTextField *dreamField;
IBOutlet NSTableView *dreamTable;
IBOutlet NSImageView *dreamview;
IBOutlet NSMutableArray *dreamlist;
IBOutlet NSMutableArray *dataset;
}
一切都很好,但仅限于mouseUp事件处理程序:
- (void) mouseUp:(NSEvent *)theEvent{
[super mouseUp:theEvent];
long index = [dreamTable selectedRow];
Dream *dr = [dataset objectAtIndex:index];
dr.dreampicture = dreamview.image;
[dataset replaceObjectAtIndex:index withObject:dr];
}
所有这些都变成了NULL。
如何在事件处理程序中访问IBOutlets?
答案 0 :(得分:1)
如何在事件处理程序中访问IBOutlets?
你已经拥有它。 Outlets只是实例变量(或属性,如果你这样声明它们);出口或响应方法没有什么特别之处,导致一方不能在另一方工作。
那么,为什么您的网点在代码的某些部分显示为关联,并在其他部分中保留nil
?
通常,这是因为您在nib 中创建了一个MainDreamer对象,并且在代码中创建了一个,或者您已经在两个单独的nib中创建了它。
无论哪种方式,都会产生同一类的两个对象。它们不是同一个对象,一个是连接的,另一个没有。您点击的那个不是您创建的并且连接在笔尖(或其中一个笔尖)中。
证明这一点的方法是在self
方法和您找到要连接的网点的任何地方记录mouseUp:
。我希望你能找到self
的不同值:正如我所说,两个对象。
解决方案是删除其中一个实例并更改其所有用途,而不是使用另一个实例。如果要在代码中创建其中一个对象,那么应删除该对象,而不是使用nib中的对象。
答案 1 :(得分:0)
如果mouseUp
是MainDreamer对象中的方法,则属性应该可用。您确定已正确连接Interface Builder中的所有插座吗?尝试将此添加到您的对象:
- (void)awakeFromNib {
NSLog("table: %@", dreamTable);
NSLog("view: %@", dreamview);
NSLog("dataset: %@", dataset);
}
如果他们是null
,则说明他们没有正确连接。