gpt4 book ai didi

ios - 如何在 UINavigationController 中使用协议(protocol)和委托(delegate)

转载 作者:行者123 更新时间:2023-11-28 23:23:55 28 4
gpt4 key购买 nike

我有一个欢迎 Controller 作为基础。它根据用户单击的按钮以模态方式呈现登录注册 Controller 。现在,一旦用户在 Login Controller 中按下登录,我就会关闭 Login Controller 并通知 Welcome Controller 用户按下了登录。我使用委托(delegate)和协议(protocol)来执行此操作。

问题:现在的问题是我的注册 Controller 没有注册按钮。相反,它会将用户定向到 SecondSignup Controller ,然后定向到 ThirdSignup Controller - UINavigationController 的所有部分。此 ThirdSignup Controller 中的注册按钮如何通知 Welcome Controller 用户已按下注册?为了避免混淆,我指定了下面的层次结构

这是层次结构

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

在 ThirdSignUp 中

class ThirdSignupController {
var delegate: SignupDelegate!

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

在欢迎 Controller 中

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")
}
}
`

最佳答案

最简单的解决方案就是通过所有 View Controller 进行委托(delegate),直到第三个。
因此,在每个 View Controller (SignUpSecondSignUpThirdSignUp)中定义一个 delegate 属性,并且在呈现第一个 View Controller 时注册 Controller ,将委托(delegate)分配为 Welcome View Controller 。例如

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

现在,对于 SecondSignUpThirdSignUp 来说,在呈现它们之前传递委托(delegate),如下所示:

nextViewController.delegate = self.delegate

到此结束时,您应该将 ThirdSignUp View Controller 的委托(delegate)设置为 Welcome View Controller 。

顺便说一句,最好将委托(delegate)用作弱引用,以避免循环引用和内存泄漏,特别是在通过多个 Controller 使用相同引用时,因此请像这样定义委托(delegate)属性:

弱变量委托(delegate):SignUpDelegate

为了实现这一点,请将您的协议(protocol)定义为:

协议(protocol) SignUpDelegate: AnyObject { ... }

关于ios - 如何在 UINavigationController 中使用协议(protocol)和委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59186714/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com