从 xib 调用 viewController

Posted

技术标签:

【中文标题】从 xib 调用 viewController【英文标题】:Call viewController from xib 【发布时间】:2016-01-19 18:24:08 【问题描述】:

我有一个包含底部栏视图的 .xib。它有一个显示视图的按钮。我几乎在每个视图控制器中都使用了那个底栏,即使搜索了两个多小时,我也无法让它工作。

在底部栏中单击工作正常(NSLog 显示当我单击它们时正在调用按钮操作),但我找不到做我想做的事情的方法。该按钮需要在特定框架中显示 6-7 行的 UITableViewController,因此我不想完全使用屏幕。

|------|
|      |
|      |
|      |
|      |
|______|
|+_____|

|------|
|      |
|      |
|------|
| here |
|______|
|+_____|

上图中,“+”号为按钮,需要在底栏上方标有“这里”的位置显示UITableViewController

我是 ios 新手,正因为如此,我的头撞到了墙上。

提前致谢!

【问题讨论】:

有几种不同的方法可以让它工作。一种是使用child view controllers。一种更惯用的方法是使用 UIPopoverController,尽管它有自己的 UI,并且比手动操作提供的控制更少。 【参考方案1】:

UITableViewController 期望使用整个屏幕。我不认为这是你想要的。

我只需创建一个 UIView 子类并向其中添加一个 UITableView。然后,您可以将自定义视图作为子视图添加到当前视图。您的子类可以是数据源和委托,因此它可以完全独立,因此您可以在应用程序的任何位置使用它。如果您想检测在表格视图之外点击以关闭自定义视图,它也可以是全屏大小。只需将 backgroundColor 设为 clearColor 并添加手势识别器即可检测点击。

【讨论】:

真的谢谢你,你让我从另一个角度看到了这一点,而且效果很好。谢谢楼主【参考方案2】:

我认为您可能有一些比使用UITableViewController 更好的选择,但还是这样:

您基本上想添加一个子视图控制器。可以这样完成(这将在Swift 中,但我也可以添加ObjC 版本):

func buttonTap(sender: UIButton) 
    let viewController = UITableViewController(style: .Plain)
    viewController.willMoveToParentViewController(self)

    self.addChildViewController(viewController)
    viewController.view.frame = CGRectMake(0, 0, self.view.bounds.width, self.view.bounds.height * 0.5)
    self.view.addSubview(viewController.view)

    viewController.didMoveToParentViewController(self)

这称为创建container view controller,非常常见(UIPageViewControllerUINavigationController、...都使用这种机制)。

但是,由于我不太喜欢UITableViewControllers,我建议创建一个简单的UITableView 并将其添加为子视图。至于delegatedataSource,两者都可以分离到单独的类(和文件)中,这样可以避免实现臃肿。

【讨论】:

以上是关于从 xib 调用 viewController的主要内容,如果未能解决你的问题,请参考以下文章

从 xib 内的按钮单击调用 IBAction 时出错

通过 loadNibNamed() 从 xib 加载按钮从未调用

如何通过推送从 xib 转换到 ViewController

在情节提要中调用 xib

initWithNibName 调用了两次或加载了错误的 xib

Xib 自定义 UIView 的实例化