为.xib视图设置ViewController

时间:2019-04-20 08:53:28

标签: ios swift uiviewcontroller xib

我既不是iOS开发人员,也不是敏捷开发人员,但请忍受以下内容:

我目前正在尝试实现一个简单的iOS应用,但在理解应该如何为这些UIView设置自定义UIView和ViewController方面遇到困难。

我正在使用UIScrollView,其中包含的项目比仅图像要复杂一些,这就是我使用自定义视图的目的。 我所做的是:

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

created the view and the corresponding "CustomView" class

view is now of type "CustomView"

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

我该怎么做?

我需要添加某种childViewController吗?

我真的很茫然,大多数博客文章和SO示例都无法正常工作和/或已过时,而且我不确定是否将整个View-ViewController模式弄错了。

1 个答案:

答案 0 :(得分:0)

假设您有两个视图控制器MainViewControllerTableViewController。 TableVC的主视图将成为MainVC的主视图的子视图。另外,您希望返回到MainVC,在TableVC中选择了哪个单元格。

一种解决方案是(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
    }
}

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