我有一个Welcome控制器作为基础。它根据用户单击的按钮以模态形式显示Login或Signup控制器。现在,一旦用户在Login控制器中按下登录,我便关闭Login控制器,并通知Welcome控制器该用户按下了登录。我使用委托和协议进行此操作。
问题:现在的问题是我的Signup控制器没有注册按钮。而是将用户定向到SecondSignup控制器,并将用户定向到ThirdSignup控制器-UINavigationController的所有部分。该ThirdSignup控制器中的注册按钮如何通知Welcome控制器用户已按下注册?为避免混淆,我在下面指定了层次结构
这是层次结构
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")
}
}
`
最简单的解决方案就是通过所有视图控制器进行委托,直到第三个为止。因此,在每个视图控制器(delegate
,SignUp
和SecondSignUp
)中定义一个ThirdSignUp
属性,并在显示第一个注册控制器时,将委托分配为Welcome
视图控制器。例如
// WelcomeController.swift
let signupController = UINavigationController(rootViewController: SignupController())
signUpController.delegate = self
[现在SecondSignUp
和ThirdSignUp
都在像这样呈现它们之前传递了委托:
nextViewController.delegate = self.delegate
并且到此结束时,您应该将ThirdSignUp
视图控制器的委托设置为Welcome
视图控制器。
在旁注中,最好将委托用作weak
引用,以避免保留周期和内存泄漏,尤其是在通过多个控制器使用相同的引用时,因此请像下面这样定义委托属性:
weak var delegate: SignUpDelegate
为此,请将您的协议定义为:
protocol SignUpDelegate: AnyObject { ... }