在 Xcode 10 中添加自定义 UITableViewController Header

Adding a custom UITableViewController Header in Xcode 10

我正在关注 iOS 编程大书呆子牧场指南第 4 版。我使用的是 Xcode 10.0,而本书使用的是 Xcode 5.0,我一直在部署到第 6 代 iPad 运行ning iOS 11.0。我在第 9 章,我正在尝试为 UITableViewController 派生的 class、ItemsViewController.

添加自定义 header 视图

我创建了一个名为 HeaderView.xib 的空用户界面文件。在该文件中,我创建了一个 UIView,其中包含来自界面构建器的两个按钮。我将文件所有者 class 类型设置为 ItemsViewController。我将 HeaderViewUIView 大小更改为自由格式,并将视图的大小调整为按钮的大小。我将 HeaderView 的背景颜色设置为清除。我还将文件所有者视图连接到界面生成器中的 UIView

在 ItemsViewController 内部,我添加了一个 IBOutlet UIView* 属性 以将 HeaderView 连接到 ItemsViewController。我编写了 - (UIView*)headerView 实例方法来加载 header 视图包。

- (UIView*)headerView
{
    if (!_headerView)
    {
        [[NSBundle mainBundle] loadNibNamed:@"HeaderView" owner:self options:nil];
    }

    return _headerView;
}

然后在 viewDidLoad 中设置 header 视图。

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"UITableViewCell"];

    UIView* header = self.headerView;
    [self.tableView setTableHeaderView:header];
}

当我部署和 运行 应用程序时,出现黑屏并显示我添加的两个按钮。如果我删除了 viewDidLoad 的最后两行,应用程序可以正常加载我制作的一些虚拟数据。

为什么 HeaderView 会覆盖所有 ItemsViewController 显示选项并显示黑屏?

这就是问题所在

I have also connected the File's Owner view to the UIView in interface builder.

由于文件所有者是您的视图控制器,因此您将覆盖 table 的现有视图。这就是为什么您只看到 header 而没有看到 table 的原因。您需要定义另一个变量,即 IBOutlet 和 link 而不是 header。