Swift 4 委托不适用于标签栏控制器

用户9204495

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

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

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

这是第四个视图控制器的片段

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
}
}
拉杰什·库马尔

MainVC'sviewDidLoad您正在创建一个新SettingsVC实例并分配self给该实例的属性。不是标签栏控制器的实际第四个视图控制器。

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

//主VC

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

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

//更新

if let settingsNavVC = self.tabBarController?.viewControllers?.first(where: { $0 is UINavigationController }) as? UINavigationController, 
    let settingsVC = settingsNavVC.rootViewController as? SettingsVC {
        settingsVC.delegate = self
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Swift 4:导航控制器不必要的循环

Swift 4标签属性

获取选定的索引标签栏控制器Swift

数组追加不适用于Swift

NSKeyedUnarchiver不适用于Swift 3

Swift 4-带标签栏和导航控制器的3D Touch快速动作

Swift 4包含方法不适用于诸如“ as”之类的简短单词

Swift 4编程语言,inout参数不适用于FunctionType作为Paramter

蒸气不适用于xcode 9和swift 4

无法在iOS 11,Swift 4中的特定视图控制器中隐藏状态栏

从集合视图单元中拖动可在iPad模拟器上使用,但不适用于iPhone模拟器或Swift 4中的真实设备

时间格式(hh:mm a)在Swift 4中不适用于iOS 11.1.1

在Swift 4中的视图控制器之间传递数据

Swift 4-如何覆盖选项卡栏将打开视图控制器

uinavigation控制器委托不适用于MFSideMenu

Swift If语句不适用于UILabel

Swift-委托的访问控制器

应该自动旋转不适用于导航控制器swift 2

使用标签栏控制器-> 导航控制器-> 视图层次结构-iOS Swift 从应用程序委托呈现视图

在 swift 4 中显示和关闭视图控制器

以编程方式打开视图控制器场景 (Swift 4)

Bootstrap 4 导航栏不适用于 angular 5

适用于 iOS 的 Spring RestTemplate (Swift 4)

如何在 swift 4 中访问应用程序委托中的视图控制器功能

Swift 4 Delegate 不适用于 childViewController

Swift 4 弹出到视图控制器:导航方法

Firebase OTP 仅适用于某些设备 - Swift 4

导航栏切换器不适用于 Bootstrap 4

NSPredicate 不适用于 Swift (CoreData)