我的viewController有一个.xib文件。它包含一个TableView和一个UIView。 UIView由一个自定义类支持 - CommentsBarView(尝试在tableView下面放置一个带有注释字段的小条)。
所以在我的文档大纲列表中我有:
“评论栏视图”的自定义类是CommentsBarView。
我有从CommentsBarView连接到文本字段和标签的出口。 (从ViewController到tableView)。
当我用控制器加载我的时候:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
我可以访问tableView属性并更改tableVIew的外观,但是,我的commentsBarView initWithCoder我无法在textView和标签上设置文本值:
- (id) initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
[self.commentTextView setText:@"Helo, World!"];
[self.characterCountLabel setText:@"200"];
}
return self;
}
似乎这些属性在initWithCoder时不可用。
如果我手动从我的控制器initWithNibName访问self.commentsBar.label.text = 200,则没有问题。
我是否遇到了尚未准备好视图的计时问题,或者我是否可以在viewControllers视图中嵌套视图并让它由自定义UIView子类支持?
IB让我感到困惑。
感谢您给予的任何帮助。
答案 0 :(得分:2)
从XIB文件加载时,IBOutlets尚未准备好在未归档的对象的init
方法中。
您需要覆盖CommentsBarView中的awakeFromNib
才能访问已就绪且已连接的IBOutlet。
答案 1 :(得分:0)
一旦你习惯了IB,它就会变得更好。由于Cocoa是MVC(模型 - 视图 - 控制器),您可能不应该创建UIView子类并将UIView设置为它。你应该把UIView放回到UIView。如果我需要自定义外观,我通常将UIView子类化。例如;如果你希望它有一个渐变,那么将UIView子类化的好时机。然后,您可以将子类重用于任何希望显示渐变的UIView。
在您的情况下,您正试图“控制”UITextView和UILabel。您可以将UITextView和UILabel的插座直接连接到您的UIViewController(文件所有者)。在这种情况下,这就是MVC的“控制器”。将您的UIView想象成一个容器,它只是为这个例子保留了两个控件。现在您可以使用viewDidLoad方法或UIViewController的其他方法来设置UITextView和UILabel的值。通常是UIVeiwController解释Cocoa中的Model数据并将数据放在需要的位置。这不是一个坚如磐石的规则,而是一个好的规则。