2012-05-10 35 views
3

我创造了iOS 5的应用程序,我收到以下错误:的XCode抛出SIGABRT错误,每当我跑由于IBOutletCollection

Assertion failure in -[UIRuntimeOutletCollectionConnection performConnect], /SourceCache/UIKit_Sim/UIKit-1912.3/UIRuntimeOutletCollectionConnection.m:43 

我试图调试错误,可以看到,它发生的原因我将一个项目连接到一个IBOutletCollection。

的IBOutletCollection被定义如下:

@property (strong) IBOutletCollection(BallButton) NSSet *Balls; 

NSSet *Balls; 

被定义为一个实例变量。

每当我没有将球连接到界面构建器中的集合时,应用程序将加载正常。然而,一旦任何球被添加到集合中,那么在ViewController和所有球被实例化并且在ViewController中的ViewDidLoad之前,我将得到一个错误。

它工作正常,然后我重新定位了一些图层,现在我无法摆脱这个错误。

如果任何人都可以帮助甚至为什么会发生这种情况的建议,甚至只是一个iOS 5使用IBOutletCollection的例子(如果我在设置中做了错误的事情,但我认为我没有),那么它将不胜感激。

感谢

+1

您是否合并了@属性?这是什么样子? –

+0

嗨,肯,我是用'@synthesize球'合成的。所以不要认为这是问题。我采取了忽略IBOutletCollection并使用从视图中检索项目的解决方法。对于IBOutletCollection也有困难的人,您可以使用下面的代码片段来避免使用它 – Theo

回答

0

而不是使用IBOutletCollection你可以得到一个包含所有你想要的收集和使用IBOutlet中连接它的项目的看法。然后使用:

- (NSSet *)getBallsFromView:(UIView *)view 
{ 
    NSMutableSet *balls = [[NSMutableSet alloc] init]; 
    for (UIView *subview in [view subviews]) 
    { 
     if ([subview isKindOfClass:[BallButton class]]) 
      [balls addObject:(BallButton *)subview]; 
    } 
} 

这将从视图中检索具体类型的所有项目,然后您可以简单地将它们添加到集合中。这只会获得所有项目,如果它们直接在您正在迭代的视图上。如果有一个子视图也包含你想要的项目,你将不得不递归调用这个方法。

0

IBOutletCollections应该声明为NSArray,您将它作为NSSet。它应该写为:

@property (strong, nonatomic) IBOutletCollection(BallButton) NSArray *Balls;