事件处理程序中的NULL属性(cocoa app)

时间:2011-12-01 17:11:30

标签: objective-c macos cocoa event-handling iboutlet

我有一个有几个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?

2 个答案:

答案 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,则说明他们没有正确连接。