使用自定义类设置/实例化IB子视图

时间:2012-01-24 12:27:17

标签: ios uiview uiviewcontroller interface-builder

我的viewController有一个.xib文件。它包含一个TableView和一个UIView。 UIView由一个自定义类支持 - CommentsBarView(尝试在tableView下面放置一个带有注释字段的小条)。

所以在我的文档大纲列表中我有:

  1. 视图
    • 的tableView
    • 评论栏视图
      • 的UITextView
      • 的UILabel
  2. “评论栏视图”的自定义类是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让我感到困惑。

    感谢您给予的任何帮助。

2 个答案:

答案 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数据并将数据放在需要的位置。这不是一个坚如磐石的规则,而是一个好的规则。