【问题标题】:Setting up a ViewController for a .xib view为 .xib 视图设置 ViewController
【发布时间】:2019-09-10 07:35:55
【问题描述】:

我既不是 iOS 开发者,也不是 swift 开发者,但请多多包涵:

我目前正在尝试实现一个简单的 iOS 应用程序,但我很难理解我应该如何为这些 UIViews 设置自定义 UIViews 和 ViewControllers。

我使用的 UIScrollView 包含比图像更复杂的项目,这就是我使用自定义视图的目的。 我所做的是:

  • 我创建了一个 .xib 文件,即视图本身。我添加了一些元素(为了简单起见,这里只是一个文本字段)。
  • 我创建了一个继承自 UIView 的可可触摸类“CustomView”,并将我的视图设置为该类(在类中我只是设置了元素等)。

现在我想要一个 ViewController 来控制类,无论何时呈现(例如对不断变化的textField 做出反应)。 我无法从我的主 ViewController 管理所有内容,因为它会变得太大(例如 3 个滚动视图 * 5 个需要管理的子视图)。 我想要一个为每个子视图使用 ViewControllers 的解决方案(以防它们自己也有子视图)。

我该怎么做?

我需要添加某种 childViewController 吗?

我真的很茫然,大多数博客文章和 SO 示例根本不起作用和/或已经过时,我不确定我是否弄错了整个 View - ViewController 模式。

【问题讨论】:

  • 据我了解,您想将许多带有滚动视图的视图控制器插入到另一个滚动视图中,对吗?
  • 我试图使问题尽可能笼统,但例如,这与我正在尝试做的事情非常相似。事实上,我有一个滚动视图,其中包含一些更复杂的项目,因此需要某种单独的控制器。我确实有一个滚动视图,其中包含控制包含自定义视图的滚动视图的项目。不仅我不知道如何处理我的具体问题,而且我对 MVC 和 swift 的了解太少,无法为这些情况提出一个通用的、适用的模式。
  • supereasyapps.com/blog/2014/12/15/…查看此链接,对您有帮助
  • 感谢您的链接,这似乎是一个很棒的资源,但他没有为他的自定义视图构建一个 ViewController。我见过人们将方法放入他们的CustomView 类中以对事件做出反应,但恕我直言,这不是有效的 MVC,因为视图也可以控制(模型应该对视图一无所知,反之亦然)。正如我所说,我在网上找到的任何资源都没有帮助我,但也许我正在尝试实现一些我不应该尝试实现的东西......

标签: ios swift uiviewcontroller xib


【解决方案1】:

假设您有两个视图控制器,MainViewControllerTableViewController。 TableVC 的主视图是 MainVC 主视图的子视图。此外,您希望将 TableVC 中选择的单元格传回 MainVC。

一种解决方案是 (a) 让 TableVC 成为 MainVC 的子代,并且 (b) 让 MainVC 成为 TableVC 的代表。

TableViewController:

protocol TableVCDelegate {
    func cellSelected(sender: TableViewController)
}

class TableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    // please note that you can do delegation differently,
    // this way results in crashes if delegate is nil!

    var delegate:TableVCDelegate! = nil
    var someValue = ""

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        // set someValue to contents in the selected cell or it's data source

        someValue = "Hello World!"
        delegate.cellSelected(sender: self)

    }
}

MainViewController:

class MainViewController: UIViewController, TableVCDelegate {

    let tableVC = TableViewController()

    override func viewDidLoad() {

        // make tableVC be a child of this VC

        addChild(tableVC)
        tableVC.didMove(toParent: self)
        tableVC.delegate = self

        // position tableVC.view

        tableVC.view.translatesAutoresizingMaskIntoConstraints = false

    }

    func cellSelected(sender: TableViewController) {
        print(sender.someValue)  // this should send "Hello World!" to the console
    }
}

这显然是未经测试的代码,但它是基于产品代码的。这是一个帮助您入门的外壳。

【讨论】:

    猜你喜欢
    • 2014-01-20
    • 2011-09-22
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    相关资源
    最近更新 更多