我基本上试图重新创建whatsapp.我的MainVC有一个TableView,它显示所有当前的对话,并有一个推送到ChatVC的segue以显示整个对话.
当用户想要开始新对话时,他们单击右上角的按钮,UserListVC来自底部并显示用户列表.
我的想法是当用户点击用户时“UsersListVC”解散(显示mainVC)并调用一个函数来打开ChatVC.但是,在MainVC的这个dimiss之后,我还没能成功调用函数.
请不要现在我没有推送任何数据我只是想让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不用担心.