gpt4 book ai didi

ios - NavigationController 不会从函数调用 + swift 推送

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:25 24 4
gpt4 key购买 nike

我基本上是在尝试重新创建 whatsapp。我的 MainVC 有一个显示所有当前对话的 TableView,并有一个到 ChatVC 的推送转接以显示整个对话。

当用户想要开始新的对话时,他们点击右上角的按钮,UserListVC 从底部出现并显示用户列表。

我的想法是,当用户单击用户时,“UsersListVC”会消失(显示 mainVC)并调用一个函数来打开 ChatVC。但是,在从 MainVC 中删除后,我无法成功调用函数。

enter image description here

请不要现在我没有推送任何数据我只是想让 segues 正常工作

MainVC.swift

func showChatVC() {

print("FUnction called")
let showChat = ChatVC()
navigationController?.pushViewController(showChat, animated: false)

}

UsersListVC.swift

       func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
dismiss(animated: true) {
MainVC().showChatVC()
}
}

我尝试了几种不同的变体,但我似乎根本无法调用 MainVC 中的函数。我的想法是不是太固执了,以这种方式进行转场?我应该直接从 UsersListVC 到 ChatVC 吗

最佳答案

这里有很多答案,我认为我应该使用委托(delegate)模式来解决这些类型的问题。

通过委托(delegate),您可以从 UsersListVC 调用 MainVC 中的函数,这使得转至 ChatVC 变得更加容易,并且在您将所选用户传递给 ChatVC 时也会有所帮助。

要制作委托(delegate)模式,您:

  1. 创建一个协议(protocol)来指定您的委托(delegate)类必须实现的功能,通常我在委托(delegate)类之上执行此操作,所以 MainVC。

    protocol UsersListDelegate: class {

    func newConversationCreated(withUser user: AnyObject)

    }

  1. 让您的委托(delegate)类 (MainVC) 符合协议(protocol)并实现所需的功能

    class MainVC: UIViewController, UsersListDelegate {

    func newConversationCreated(withUser user: AnyObject) {

    //I'll fill this in later in my answer

    }

    }

  1. 在 UsersListVC 中创建一个变量来保存委托(delegate)类

    class UsersListVC: UIViewController {

    weak var delegate: UsersListDelegate!

    }

  1. 当您从 MainVC 呈现 UsersList 时,将委托(delegate)变量设置为 MainVC(自身),例如,如果您转至 UsersList,则可以在准备转场时完成此操作。

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if let destination = segue.destination as? UsersListVC {

    destination.delegate = self

    }

    }

    或者如果你在没有 segue 的情况下呈现它:

    func presentUsersList() {

    let userListsVC = UsersListVC()
    userListsVC.delegate = self
    self.present(userListsVC, animated: true)

    }

您的委托(delegate)模式现已完成。要在您想要创建新对话并关闭 UserListsVC 时调用委托(delegate)函数,您可以这样做

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

delegate.newConversationCreated(withUser: /*Your User Object*/)

}

并且在 MainVC 中,您可以实现 newConversationCreated 函数来:

  • 关闭用户列表
  • 创建 ChatVC
  • 将用户传递给 ChatVC
  • 出席 ChatVC

例如

    func newConversationCreated(withUser user: AnyObject) {

dismiss(animated: true) {

let showChat = ChatVC()
showChat.user = user
navigationController?.pushViewController(showChat, animated: false)

}

}

附注从 MainVC 调用 dismiss 似乎很奇怪,但这实际上是 apple 的最佳实践(请参阅此 question 中的答案以了解原因)。它会关闭 UserLists,不用担心。

关于ios - NavigationController 不会从函数调用 + swift 推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39989561/

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