Swift 4委托不适用于Tabbar控制器

时间:2019-08-17 08:08:39

标签: ios swift uitabbarcontroller protocols

我有一个带有4个视图的标签栏视图控制器,我在第4个视图上设置了一个协议,并使第一个视图符合该协议。当我从第4个视图调用委托方法时,它不起作用,并且第1个和第4个视图控制器之间没有隔离。

我已经定义了协议     并设置weak var delegate: delegateProtocol?     然后在第一个视图控制器中执行以下操作

class VC1: delegateProtocol {
    viewdidLoad(){
    var vc4 = VC4()
    VC4.delegate = self
  }

这是第4个视图控制器的代码段

protocol SettingsDelegate: class {
    func locationDidSet(location: CLLocation)
}


class VC4: UIViewController {


  weak var delegate: SettingsDelegate?
 let controller = LocationPickerViewController()
 let navigationController = UINavigationController(rootViewController: controller)
 present(navigationController, animated: true, completion: nil)
  controller.completion = { location in
                self.location = location?.title ?? "Not found"
                defaults.set(location: location!.location, forKey: "location")
                self.tableView.reloadData()
                self.delegate?.locationDidSet(location: location!.location)
            }

这是第一个ViewController的代码段

class MainVC: UIViewController, SettingsDelegate {
    func locationDidSet(location: CLLocation) {
        print(location.coordinate.latitude)
    }

  override func viewDidLoad() {
        super.viewDidLoad()
        settingVC = SettingsVC()
        settingVC?.delegate = self
}
}

1 个答案:

答案 0 :(得分:2)

MainVC的{​​{1}}中,您将创建一个新的viewDidLoad实例,并将SettingsVC分配给该实例的属性。而不是标签栏控制器的实际第四视图控制器。

self数组中获取第四个视图控制器实例,并将tabBarController?.viewControllers分配给其self属性

// MainVC

delegate

如果视图控制器嵌入在导航控制器中。

//更新

override func viewDidLoad() {
  super.viewDidLoad()
  if let settingVC = self.tabBarController?.viewControllers?.first(where: { $0 is SettingsVC }) as? SettingsVC {
    settingVC.delegate = self
  }
}