【问题标题】:Storyboard add a custom view which has xib file has no subviews故事板添加具有 xib 文件的自定义视图没有子视图
【发布时间】:2015-04-22 06:25:52
【问题描述】:

我用 xib 文件创建了一个自定义的UIViewA,它可以通过以下方式正确加载:


    NSArray *starsNib = [[NSBundle mainBundle] loadNibNamed:@"nibName" owner:nil options:nil];
    A *starsView = starsNib[0];
    [self.view addSubview:starsView];

然后在我的故事板文件中,我将此自定义视图 A 添加到 UITableViewCellcontentView。加载 tableview 时,我发现自定义视图 A 没有添加到 xib 文件中的子视图。我还发现当 A 的 initWithCoder: 返回时,它没有子视图。
顺便说一句,在 xib 文件中,我已将 parent viewfile's owner 设置为自定义视图 A 类。
我想知道为什么会发生这种情况以及为什么initWithCoder: 返回时没有加载子视图?

【问题讨论】:

    标签: ios uiview storyboard loadnibnamed


    【解决方案1】:

    因为视图是从情节提要加载的,而不是从 XIB 加载的。在情节提要中,视图是空的。

    您应该从情节提要中删除视图并将其加载到代码中,可能是在单元格被实例化时,因为每个单元格只需要执行一次。

    【讨论】:

    • 啊~忘了initWithCoder: 也可以被SB调用。但是,除了“加载代码”之外,我仍然想知道有没有办法实现这一点?
    • IIRC 你只能将控制器导入故事板,而不是视图,虽然这不是我做的,所以我不记得确切...
    【解决方案2】:

    您可以使用 Xib 创建自定义 tableViewCell,它的文件所有者是您的自定义 UITableViewCell 类,然后您可以使用 cellForRowAtIndexPath: 方法,如

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
        if (cell == nil) {
            // Load the top-level objects from the custom cell XIB.
            NSArray * starsNib = [[NSBundle mainBundle] loadNibNamed:@"nibName" owner:self options:nil];
            cell = starsNib[0];
        }
        return cell;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-12
      • 2014-11-08
      • 2011-06-28
      • 1970-01-01
      • 2013-08-04
      • 2014-02-04
      • 2016-06-18
      • 2013-04-07
      • 1970-01-01
      相关资源
      最近更新 更多