无法将 UITableViewController 连接到在 xib 中创建的 UITableView

Posted

技术标签:

【中文标题】无法将 UITableViewController 连接到在 xib 中创建的 UITableView【英文标题】:Can't hook up UITableViewController to a UITableView created in a xib 【发布时间】:2014-08-19 22:33:14 【问题描述】:

是的另一个 UITableView 问题。我有一个MainPageController,它是UIViewController 的子类,并且我在界面生成器中将UITableView 拖到了我的xib 中。我创建了一个单独的控制器(没有 xib)专门用于处理 UITableView 和其他 UITableViews 之类的。假设它被命名为CustomTableViewController。它是UITableViewController 的子类并符合UITableViewDataSource

现在,在我的MainPageController 中,我想创建一个CustomTableViewController 的实例并让它“控制”我在 MainPageController 的 xib 中拥有的 UITableView 的实例。如何才能做到这一点?我对我的 CustomTableViewController 上的 tableView 属性以及如何让 myTableViewmyCustomTableViewController 相互连接感到困惑。

我尝试过myTableView.dataSource = myCustomTableViewController; 之类的方法,但似乎没有任何反应。我的 dataSource 方法甚至没有被调用。

我之所以遵循这个设计,是因为我想将自定义控制器重用于我将在其他页面上使用的其他表格视图。

【问题讨论】:

【参考方案1】:

我对此进行了测试,发现它有效。这是应该做的-

1) 在 MainPageController 中,创建一个 IBOutlet 属性 tableView 并将其与 MainPageController xib 挂钩。

2) 在 MainPageController 中,在 viewDidLoad 中创建 CustomTableViewController 的实例,并将数据源设置为 CustomTableViewController 实例 -

self.myCustomTableTableViewController = [[CustomTableViewController alloc] init];
self.tableView.dataSource = self.myCustomTableTableViewController;

这应该足以实现您所描述的。

MainPageController.h

    #import <UIKit/UIKit.h>

    @interface MainPageController : UIViewController

     @property (strong, nonatomic) IBOutlet UITableView *tableView;

   @end

MainPageController.m

   #import "MainPageController.h"
   #import "CustomTableViewController.h"
   @interface ViewController ()
   @property (strong, nonatomic) CustomTableViewController *customTableViewController;

   @end

   @implementation MainPageController

   - (void)viewDidLoad
   
       [super viewDidLoad];
       // Do any additional setup after loading the view, typically from a nib.
       self.customTableViewController = [[CustomTableViewController alloc] init];
       self.tableView.dataSource = self.customTableViewController;
   
   @end

【讨论】:

成功了。我仔细检查了我是否在界面生成器中连接了我的插座,当然我忘记了! 为什么 CustomTableViewController 连接到 IBOutlet?它是连接到 xib 中的任何东西还是只是 UITableView?【参考方案2】:

UITableViewController 的 _tableView 是固有的。即使您使用 xib 创建一个新类,您也会注意到整个视图是一个表格视图。当您将 UITableView 拖入您的 xib 文件或情节提要中的控制器时,您只是创建了一个自定义 UITableView,并且您无法告诉它响应另一个控制器。我现在能想到的最简单的模式是这样的:

    CustomTableViewController 应该是 UIViewController 的子类。在其中定义所有数据源函数。不要使用 xib。

    因为它是一个 UIViewController,你可以为 tableView 添加一个 IBOutlet。在创建 MainPageController 的 sublass 时,使其成为 CustomTableViewController 的子类,并设置 tableView 出口。

    在 IB 中,将 ViewController 内的 UITableView 的数据源和委托设置为类。它应该符合,因为它是 CustomTableViewController 的子类。

【讨论】:

我的主页控制器已经继承了另一个对象。当然这会起作用,但我的目标是不要将 mainpagecontroller 和 tableview 紧密耦合。我想让它可重复使用。 在这种情况下,您可以实例化一个 customTableViewController 并以编程方式将其 tableView 添加到子视图中。您不能在属于不同控制器的 IB 控制器中添加子视图。您可以实例化来自其他 UIView(例如,UITableView 的子类)的子视图,但它们不会具有属于您的 CustomTableViewController 内的 tableViewDelegate 函数。

以上是关于无法将 UITableViewController 连接到在 xib 中创建的 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

我无法让 UITableViewController 显示任何数据

iOS:尝试将导航栏添加到模态 UITableViewController

在 UITableViewController 之外使用 NSFetchedResultsController

UIViewController 无法查看 UITableViewController

UITableViewController - 禁用选择

无法更改 UITableViewController 颜色背景