为表视图控制器创建nib文件

Sen*_*ful 4 iphone interface-builder uitableview

我试图遵循iPhone OS表视图编程指南,但是在创建一个从nib文件加载其数据的新表视图控制器时遇到了问题.

具体来说,我试图按照这一部分中的步骤操作:

如果您希望从nib文件加载由自定义表视图控制器管理的表视图,则必须执行以下操作:

  1. 在Interface Builder中,创建一个空的Cocoa Touch nib文件(File> New).
  2. 将UITableViewController对象从Interface Builder库拖到nib文档窗口中.
  3. 将nib文件以适当的名称保存在项目目录中,并在出现提示时,选择要添加nib文件的项目.
  4. 在nib文档窗口中选择Table View Controller,然后打开检查器的Identity窗格.将类设置为自定义表视图控制器类.
  5. 在nib文档窗口中选择File's Owner,并将其类标识设置为自定义表视图控制器类.
  6. 在Interface Builder中自定义表视图.
  7. 在nib文档窗口中选择表视图控制器,打开检查器的"属性"窗格,然后在"笔尖名称"字段中输入(或选择)nib文件的名称.

所以我在Xcode中创建了一个新的UITableViewController子类(称为"MyTableViewController"),然后我进入IB并按照这些步骤操作.我确保将所有Class属性链接到与我在Xcode中创建的UITableViewController子类相同的名称,就像它在步骤中所说的那样.

但现在我在IB中收到以下警告:

"我的表视图控制器"具有"视图"和"笔尖名称"属性集.不支持此配置.

当我运行应用程序并推送表视图控制器时,它会出现,但似乎根本没有从nib文件加载任何内容(例如,我将alpha设置为0而不是1).

知道我做错了什么吗?

谢谢您的帮助.


以下是一些可以帮助您更好地了解情况的信息.

我注意到创建UITableViewController与模板之间存在一些差异(例如,通过创建新的基于导航的应用程序)而不是自己创建一个(例如,按照上面的步骤).我将分别将每个引用为TemplateNib和CustomNib,以便更容易理解差异.

在TemplateNib中,它在文档窗口中具有以下对象:

  • 文件的所有者
  • 急救人员
  • 表视图

在CustomNib中,它在文档窗口中具有以下对象:

  • 文件的所有者
  • 急救人员
  • 我的自定义表视图控制器
    • 表视图

另一个区别是文件所有者链接...

TemplateNib的文件所有者:

  • 奥特莱斯
  • tableView - >表视图
  • 查看 - >表视图
  • 引用Outlets
  • dataSource - >表视图
  • 委托 - >表视图

CustomNib文件的所有者:

  • 奥特莱斯
  • 查看 - >(没有)

CustomNib我的表视图控制器:

  • 奥特莱斯
  • view - > Table View(这是灰色的,所以你不能删除它)
  • 引用Outlets
  • dataSource - >表视图
  • 委托 - >表视图

更新:

我尝试通过以下步骤模仿模板创建的.xib文件:

  1. 在Interface Builder中创建一个空文件.
  2. 将File的Owner设置为从UITableViewController继承的类.
  3. 在文档窗口中添加了表视图.
  4. 设置Table View的dataSource并委托给File的Owner.
  5. 将文件的所有者视图设置为表视图.
  6. UITableView类型的Identity窗格中添加了tableView propery .
  7. 将File的Owner tableView属性(我刚刚创建的)设置为Table View.

但是,这似乎仍然没有从NIB文件加载它.(我也从来没有在任何地方设置NIB文件的名称......有什么地方我需要设置它或者它是否寻找具有相同名称的文件?).

然后我尝试重写initWithNibName从nib文件的名称加载,现在它似乎从nib文件加载它.但是,如果我查看TemplateNib表视图控制器的.m文件,它不需要重写此方法,为什么呢?我仍然认为我这样做是错误的,因为编程指南没有提到任何关于这样做的事情.


更新:

我尝试使用diff工具比较两个.xib文件,两者之间的唯一显着差异似乎是:

<string key="superclassName">UITableViewController</string>
// and:
<reference key="NSSuperview"/>
Run Code Online (Sandbox Code Playgroud)

我在原始文件中看不到任何对Nib文件的引用,是否还有其他文件我应该检查?


更新:

看起来像是从nib文件加载TemplateNib的东西是MainWindow.xib(模板给出的默认名称),RootViewController添加了NIB Name属性,其值为"RootViewController".此外,它的类设置为"RootViewController".

我尝试在RootViewController上的initWithNibName:bundle:和initWithStyle:中放置一个断点,然而,它永远不会到达那里.我有点想知道当你在MainWindow.xib中设置它时如何创建TableViewController.

我还尝试将我的自定义表视图控制器添加到MainWindow.xib,设置类和nib名称,希望它将从我指定的nib文件加载它,但它甚至不调用iniWithNibName.

Sen*_*ful 7

  1. 在Xcode中创建一个TableViewController.
  2. 在Interface Builder中创建一个空的nib文件.
  3. 从步骤1将File的Owner Class属性设置为TableViewController.
  4. 将TableView添加到空的nib文件中.
  5. 将File的Owner视图属性设置为步骤4中的TableView.
  6. 根据需要自定义IB中的TableView.
  7. 在Xcode中覆盖您创建的TableViewController的initWithNibName:bundle:方法,并使用类似于以下内容的代码:


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:@"MyNibName" bundle:nibBundleOrNil]) {
        // Custom initialization
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)