简体   繁体   中英

Setting up a ViewController for a .xib view

I am neither an iOS developer, nor a swift developer, but please bear with me:

I am currently trying to implement a simple iOS app but I have difficulties understanding how exactly I am supposed to set up custom UIViews and ViewControllers for those UIViews.

I am using a UIScrollView that is containing items a little bit more complex than just images, thats what I use custom views for. What I did was:

  • I created a .xib file, the view itself. I added some elements (here it is only a textfield, for simplicity's sake).
  • I created a cocoa touch class "CustomView" that inherits from UIView and set my view up to be of that class (inside the class I just set up elements and such).

创建了视图和相应的“CustomView”类

视图现在是“CustomView”类型

Now I want a ViewController that controls the class whenever it is rendered (for example reacting to the changing textField ). I cant manage everything from my main ViewController, because it would get too big (eg 3 scrollViews * 5 subviews that need to be managed). I want a solution that uses ViewControllers for each subview (in case they themselves will have subviews, too).

How do I do that?

Do I need to add some sort of childViewController?

I really am at loss, most of the blog posts and SO examples simply do not work and/or are outdated and I am unsure about whether or not I got the whole View - ViewController pattern wrong.

Let's say you have two view controllers, MainViewController and TableViewController . TableVC's main view is to be a subview of MainVC's main view. In addition, you wish to pass back to MainVC which cell was selected in TableVC.

A solution is (a) make TableVC be a child to MainVC and (b) make MainVC be a delegate for 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
    }
}

This is obviously untested code, but it is based on product code. This is meant to be a shell to help you get started.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM