如何在UINavigationController中使用协议和委托

问题描述 投票:0回答:1

我有一个Welcome控制器作为基础。它根据用户单击的按钮以模态形式显示LoginSignup控制器。现在,一旦用户在Login控制器中按下登录,我便关闭Login控制器,并通知Welcome控制器该用户按下了登录。我使用委托和协议进行此操作。

问题:现在的问题是我的Signup控制器没有注册按钮。而是将用户定向到SecondSignup控制器,并将用户定向到ThirdSignup控制器-UINavigationController的所有部分。该ThirdSignup控制器中的注册按钮如何通知Welcome控制器用户已按下注册?为避免混淆,我在下面指定了层次结构

这是层次结构

  • 欢迎->登录
  • 欢迎->注册-> SecondSignUp-> ThirdSignUp
protocol SignupDelegate{
      func signupButtonPressed()
}

In ThirdSignUp

class ThirdSignupController {
      var delegate: SignupDelegate!

      @objc func handleSignup{
         delegate.signupButtonPressed()
         self.dismiss()
      }
}

在欢迎控制器中

class WelcomeController: SignupDelegate {

      @objc func handleSignupButtonPressed(){
         let signupController = UINavigationController(rootViewController: SignupController())
         self.present(signupController, animated: true)
         // ****
         // **** Where do I set the delegate? I am not referencing ThirdSignupController()****
         // ****
      }

      func signupButtonPressed(){
         print("User has pressed sign up button in ThirdSignupController")
      }      
}
`
ios swift uinavigationcontroller
1个回答
1
投票

最简单的解决方案就是通过所有视图控制器进行委托,直到第三个为止。因此,在每个视图控制器(delegateSignUpSecondSignUp)中定义一个ThirdSignUp属性,并在显示第一个注册控制器时,将委托分配为Welcome视图控制器。例如

// WelcomeController.swift
let signupController = UINavigationController(rootViewController: SignupController())
signUpController.delegate = self

[现在SecondSignUpThirdSignUp都在像这样呈现它们之前传递了委托:

nextViewController.delegate = self.delegate

并且到此结束时,您应该将ThirdSignUp视图控制器的委托设置为Welcome视图控制器。

在旁注中,最好将委托用作weak引用,以避免保留周期和内存泄漏,尤其是在通过多个控制器使用相同的引用时,因此请像下面这样定义委托属性:

weak var delegate: SignUpDelegate

为此,请将您的协议定义为:

protocol SignUpDelegate: AnyObject { ... }

© www.soinside.com 2019 - 2024. All rights reserved.