【问题标题】:Issue Connecting tableView to Data Source in .XIB在 .XIB 中将 tableView 连接到数据源的问题
【发布时间】:2013-08-15 14:46:53
【问题描述】:

所以我试图将 tableView 组件连接到通过 .xib 用户界面创建的 UIViewController。我得到了经典的-[UIView tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x1f544cb0,我猜测我连接错误或者正在做一些我不应该使用界面构建器做的事情。我搜索了谷歌和堆栈溢出,发现了类似的问题,但没有对我的情况有所帮助的答案。我一直在努力解决这个问题,希望这里有人能提供帮助。当控制器是 UITableViewController 时,我只通过情节提要或使用 .xib 完成此操作。通常我只会使用 UITableViewController 但我可能需要在视图底部添加一个工具栏,以便该选项不可行。以下是我创建课程的步骤,如果我做错了什么,请告诉我

我首先使用 XIB 为用户界面创建文件:

然后我将表格视图组件添加到 XIB:

在 LeftMenuViewController.h 中,我添加以下代码行来告诉允许该类用作 UITableViewDelegate 和 UITableViewDataSource:

@interface LeftMenuViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

然后我将表格视图组件连接到代理和数据源,方法是控制从组件拖动到文件所有者标题并选择代理和数据源,如图所示:

然后我将以下代码行添加到 LeftMenuViewController.m 以提供所需 TableView 委托方法的定义:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 5;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 48;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell;
    return cell;
}

此过程会导致应用抛出 NSInvalidArgumentException,从而产生 [UIViewController tableView:numberOfRowsInSection:]: unrecognized selector 错误。我究竟做错了什么?我尝试过或推荐过的一切都没有奏效。

【问题讨论】:

  • 确保您在界面生成器的 Identity Inspector 中指定了视图控制器类。
  • 不是直接回答您的问题,但考虑使用故事板嵌入 segue 让您的 toolbar and table view 并坚持使用 UITableViewController

标签: ios xcode uitableview xib


【解决方案1】:

错误是在您的错误消息[UIViewController tableView:numberOfRowsInSection:]: unrecognized selector 中引用UIViewController,这意味着尚未设置文件所有者(它应该引用您的视图控制器子类,而不是UIViewController 本身)。您已经在您的 NIB 中正确指定了委托和数据源,所以我想知道您是如何实例化您的视图控制器的。

你应该用类似的东西来实例化它:

SecondViewController *controller = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
[self presentViewController:controller animated:YES completion:nil];

或者,如果 NIB 名称与控制器名称不匹配:

SecondViewController *controller = [[SecondViewController alloc] initWithNibName:@"MyNibName" bundle:nil];
[self presentViewController:controller animated:YES completion:nil];

【讨论】:

  • 嘿,感谢 [[UIViewController alloc] initWithNibName:@"LeftMenuViewController" bundle:nil]; 的帮助,我需要它是 [[LeftMenuViewController alloc] initWithNibName:@"LeftMenuViewController" bundle:nil]; 几乎完全符合您上面所说的谢谢! @Rob
【解决方案2】:

在占位符部分的 NIB 文件中单击文件所有者,并确保自定义类设置为 LeftMenuViewController 或您命名的任何名称。

【讨论】:

  • 该类设置为 LeftMenuViewController 会不会是别的东西? @codeInOrange
  • @ScottOBot 应该是你创建的子类的名字,LeftMenuViewController 或者 LeftViewController,你提到了两个名字
  • 对不起,LeftViewController 是一个错字将编辑! @codeInOrange
  • @codeInOrange 我认为NIB中的文件所有者类设置仅由IB在创建出口和操作时使用,但实际所有者是在运行时实例化视图控制器及其NIB时确定的。但你说得对,问题在于所有者是谁。
【解决方案3】:

在 viewDidLoad 中:

self.tableView.delegate = self;

【讨论】:

  • 天哪,我不敢相信我忘记了!但是,在将 UITableView 属性添加到 .h 并按照上面的说明将委托分配给控制器之后,应用程序现在会抛出 NSUnknownKeyException 并出现以下错误 [<UIViewController 0x1f5d52b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key menuTable.。这可能是什么原因造成的? @Abdullah Shafique
  • @ScottOBot 如果您正确地实例化了您的视图控制器,并将其与 NIB 相关联,如果您将 NIB 中的委托和数据源设置为“文件所有者”。实例化视图控制器时配置“文件所有者”。
  • 我认为这是您在上述解决方案中提到的实例化问题我正在测试一些东西并将发布解决方案!感谢大家的帮助! @Rob
猜你喜欢
  • 2013-05-23
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多