这是我设置委托的第一个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")
}
}
每当我尝试传递数据时,它都不会调用该方法,并且委托不会调用。帮助急需。
答案 0 :(得分:4)
注意:我以前的回答是使用Storyboard。但由于提问者不想使用故事板,我不使用故事板替换我的答案。 [这个答案的灵感来自https://stackoverflow.com/a/41095757/3549695]
首先,删除Main.storyboard。然后在Project - >部署信息 - >主界面(选择LaunchScreen而不是'Main')
然后在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(黄色背景)。