我不是iOS开发人员,也不是快速的开发人员,但请耐心等待:
我目前正在尝试实现一个简单的iOS应用程序,但我很难理解我应该如何为那些UIViews设置自定义UIViews和ViewControllers。
我使用的UIScrollView包含的项目比图像更复杂,这就是我使用自定义视图的内容。我做的是:
现在我想要一个ViewController,它在渲染时控制类(例如对更改的textField
作出反应)。我无法管理来自我的主ViewController的所有内容,因为它会变得太大(例如需要管理的3个scrollViews * 5子视图)。我想要一个为每个子视图使用ViewControllers的解决方案(如果他们自己也有子视图)。
我怎么做?
我需要添加某种childViewController吗?
我真的很茫然,大多数博客帖子和SO示例根本不起作用和/或过时,我不确定我是否得到了整个View - ViewController模式错误。
假设你有两个视图控制器,MainViewController
和TableViewController
。 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
}
}
这显然是未经测试的代码,但它基于产品代码。这是一个帮助您入门的shell。