通过Interface Builder在自定义对象上设置属性

时间:2009-08-18 17:22:20

标签: objective-c cocoa cocoa-touch

我有一个自定义的UITableViewController子类,我在nib文件中的两个地方使用它。如果我希望这两个实例的行为略有不同,我该怎么办?当然在代码中我可以根据BOOL的值选择一种行为或另一种行为,但是如何从Interface Builder中设置BOOL,而不必编写Interface Builder插件?

5 个答案:

答案 0 :(得分:7)

从Xcode 6开始,有一种新方法可以做到这一点。您现在可以为视图属性提供IBInspectable属性,然后您可以像使用标准视图一样在IB中编辑这些属性。

例如:

@property (nonatomic, strong) IBInspectable BOOL

Apples文档中的更多详细信息(也适用于新属性IBDesignable):https://developer.apple.com/library/ios/recipes/xcode_help-IB_objects_media/chapters/CreatingaLiveViewofaCustomObject.html

答案 1 :(得分:3)

"用户定义的运行时属性"在身份检查器中可能正是您正在寻找的。这个seems to be new从Xcode 4.2开始。

不幸的是,Apple Developer网站上似乎没有关于此功能的文档(任何?)。我能够将它用于一个简单的属性集。

答案 2 :(得分:2)

据我所知,如果不编写IB插件,就无法在IB中设置参数。

那就是说,你还有两个选择。

如果它像单个BOOL一样简单,那么最好将它作为MyCustomViewController类的属性,并在初始化后在代码中设置它:

customViewController = [[MyCustomViewController alloc]initWithNibName:@"CustomViewController" bundle:nil];
[customViewController setFunky:YES];

另一种选择是为MyCustomViewDelegate创建协议。如果您不熟悉协议,您的标题将如下所示:

@class MyCustomViewController;

@protocol MyCustomViewDelegate
@required
-(BOOL)customViewShouldBeFunky:(MyCustomViewController*)customView;
@end

@interface MyCustomViewController : UIViewController {
  NSObject<MyCustomViewDelegate>  *delegate;
}
@property (readwrite, retain) IBOutlet NSObject<MyCustomViewDelegate> *delegate;
@end

由于它是IBOutlet,您可以像在Interface Builder中的任何其他委托一样连接委托。

当您需要确定视图的行为方式时,请致电[delegate customViewShouldBeFunky:self]

答案 3 :(得分:0)

有两个子类可能更容易,并且更容易记录。

答案 4 :(得分:0)

以下是覆盖属性并在自定义类中设置它们的示例,这可能会有所帮助。在调用awakeFromNib之前,属性代码将起作用。因此,您可以根据用户在awakeFromNib中的决策权来决定您要做什么。

https://stackoverflow.com/a/31094561/1699210