如何在没有storyboard的情况下创建ViewControllers并将其设置为另一个的委托?

时间:2017-05-24 13:41:29

标签: swift uiviewcontroller delegates programmatically-created

这是我设置委托的第一个VC:

class DiscoverVC: UIViewController, SetLocationDelegate {
    var name = ""
    let loc = LocationVC()
     override func viewDidLoad() {
        super.viewDidLoad()
        self.loc.delegate = self
     }

      func getLocation(loc: String) {
        self.name = loc
        self.tableView.reloadData()
    }
 }

这是第二个视图控制器,我通过委托获取数据:

protocol SetLocationDelegate: class {
    func getLocation(loc: String)
}

class LocationVC: UIViewController {

    weak var delegate: SetLocationDelegate?
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate?.getLocation(loc: "Sam")
    }
}

每当我尝试传递数据时,它都不会调用该方法,并且委托不会调用。帮助急需。

1 个答案:

答案 0 :(得分:4)

注意:我以前的回答是使用Storyboard。但由于提问者不想使用故事板,我不使用故事板替换我的答案。 [这个答案的灵感来自https://stackoverflow.com/a/41095757/3549695]

首先,删除Main.storyboard。然后在Project - >部署信息 - >主界面(选择LaunchScreen而不是'Main')enter image description here

然后在AppDelegate.swift上使用以下内容修改didFinishLaunching:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    window = UIWindow(frame: UIScreen.main.bounds)
    let discoverVC = DiscoverVC() as UIViewController
    let navigationController = UINavigationController(rootViewController: discoverVC)
    navigationController.navigationBar.isTranslucent = false
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()

    return true
}

DiscoverVC.swift看起来像这样:

import UIKit

class DiscoverVC: UIViewController, SetLocationDelegate {

    var name = ""

    // to instantiate LocationVC once only for testing
    var notVisted = true

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = .yellow 
        loadLocationVCOnlyOnce()
    }

    func loadLocationVCOnlyOnce() {
        // only visit one
        guard notVisted else { return }

        let locationVC = LocationVC()
        locationVC.delegate = self 
        self.navigationController?.pushViewController(locationVC, animated: true)

    }

    func getLocation(loc: String) {
        self.name = loc
        print(name)
    }
}

LocationVC看起来像这样:

import UIKit

protocol SetLocationDelegate: class {
    func getLocation(loc: String)
}

class LocationVC: UIViewController {

    weak var delegate: SetLocationDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = .cyan 
        self.delegate?.getLocation(loc: "Sam")


    }

}

启动时,它会自动从DiscoverVC(黄色背景)移动到LocationVC(青色背景)。

然后单击顶部的“后退”按钮后,您将在控制台中看到“Sam”。并且您的视图返回到DiscoverVC(黄色背景)。