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

我基本上试图重新创建whatsapp.我的MainVC有一个TableView,它显示所有当前的对话,并有一个推送到ChatVC的segue以显示整个对话.

当用户想要开始新对话时,他们单击右上角的按钮,UserListVC来自底部并显示用户列表.

我的想法是当用户点击用户时“UsersListVC”解散(显示mainVC)并调用一个函数来打开ChatVC.但是,在MainVC的这个dimiss之后,我还没能成功调用函数.

《ios – NavigationController不会从函数调用swift推送》

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

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直接segue到ChatVC

最佳答案 这里有很多答案,我想我应该使用委托模式为这些类型的问题添加解决方案.

使用委托,您可以从UsersListVC调用MainVC中的函数,这使得更容易转到ChatVC,并且在将所选用户传递给ChatVC时也会有所帮助.

要创建委托模式,您:

>创建一个协议,指定您的委托类必须实现的功能,通常我在委托类上面执行此操作,因此MainVC.

protocol UsersListDelegate: class {

    func newConversationCreated(withUser user: AnyObject)

}

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

class MainVC: UIViewController, UsersListDelegate {

    func newConversationCreated(withUser user: AnyObject) {

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

    }

}

>在UsersListVC中创建一个变量来保存委托类

class UsersListVC: UIViewController {

    weak var delegate: UsersListDelegate!

}

>当您从MainVC呈现UsersList时,将委托变量设置为MainVC(self),例如,如果您转到UsersList,则可以在准备segue时完成此操作.

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)

}

您的委托模式现已完成.要在创建新会话并关闭UserListsVC时调用委托功能,可以这样做

    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不用担心.

点赞