【问题标题】:Setup/instantiation of IB subview with custom class使用自定义类设置/实例化 IB 子视图
【发布时间】:2012-01-24 12:27:17
【问题描述】:

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

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

  1. 查看
    • 表格视图
    • cmets 栏视图
      • UITextView
      • UILabel

“cmets bar view”的自定义类是 CommentsBarView。

我有从 CommentsBarView 内连接到文本字段和标签的插座。 (以及从 ViewController 到 tableView)。

当我加载我的控制器时:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

我可以访问 tableView 属性并更改 tableVIew 的外观,但是,从我的 cmetsBarView 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.cmetsBar.label.text = 200,则没有问题。

我是否遇到了视图尚未准备好的时间问题,或者我不能在 viewControllers 视图中嵌套视图并让它得到自定义 UIView 子类的支持?

IB 让我有点困惑。

感谢您提供的任何帮助。

【问题讨论】:

    标签: ios uiview uiviewcontroller interface-builder


    【解决方案1】:

    从 XIB 文件加载时,IBOutlets 未在被取消归档对象的 init 方法中准备好。

    您需要在您的 CommentsBarView 中覆盖 awakeFromNib 才能访问准备就绪且已连接的 IBOutlets。

    【讨论】:

    • 谢谢,事情就是这样。
    【解决方案2】:

    一旦你习惯了 IB,它就会变得更好。由于 Cocoa 是一个 MVC(模型-视图-控制器),您可能不应该创建 UIView 子类并将您的 UIView 设置为它。您可能应该将 UIView 放回 UIView。如果我需要自定义外观,我通常将 UIView 子类化。例如;如果您希望它具有渐变,则子类化 UIView 的好时机。然后,您可以将您的子类重用于您希望显示渐变的任何 UIView。

    在您的情况下,您正试图“控制” UITextView 和 UILabel。您可以改为将 UITextView 和 UILabel 的插座直接连接到 UIViewController(文件所有者)。在这种情况下,这就是 MVC 的“控制器”。把你的 UIView 想象成一个容器,它只是保存这个例子的两个控件。现在,您可以使用 UIViewController 的 viewDidLoad 方法或其他方法来设置 UITextView 和 UILabel 的值。通常是 UIVeiwController 解释来自 Cocoa 中的模型的数据并将数据放置在需要的位置。这不是一个坚如磐石的规则,而是一个很好的规则。

    【讨论】:

    • 您好,Rob,感谢您的回复。如果 IB 不提供封装自定义视图组的可能性,我永远不会考虑使用它。原来我只是太早地访问了元素,我当然不能指望它们在调用 viewDidLoad 之前准备好。
    • 是的,时间就是这方面的一切。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多