Как отключить модальные и одновременно отправить данные и выполнить переход - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть приложение чата, и я хочу перейти от моего ChatController к newMessageVC с помощью модального перехода.В newMessageVC все мои контакты показаны в виде таблицы.При нажатии на контакт newMessageVC должен быть отклонен, а выбранный контакт должен быть отправлен в ChatController.В этот момент ChatController должен выполнить переход к ChatVC, чтобы показать новый чат с пользователем, на которого нажали.Как я могу это сделать?

Я попробовал следующий код:

newMessageVC закрывается и вызывается функция showChatVC (она показывает оператор печати), но затем возникает ошибка, хотя sege делаетсуществовать.Существует переход от ChatController к ChatVC с именем "showChatVC"

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<WeAreFriends.ChatController: 0x7fd760e22e80>) has no segue with identifier 'showChatVC''
class ChatController : UITableViewController {

    //MARK: - Outlets

    @IBOutlet weak var MessageTableView: UITableView!


    //MARK: - Properties

    var messages = [MessageModel]()

    //Mark: - Init View Lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()

        configureNavigationBar()
    }


    //MARK: - Navigation Bar

    func configureNavigationBar() {
        navigationItem.title = "Messages"
         navigationController?.navigationBar.barTintColor = Defaults.hexStringToUIColor(hex: "#006D79")
        let textAttributes = [NSAttributedString.Key.foregroundColor: Defaults.hexStringToUIColor(hex: "#FFAA01")]
        navigationController?.navigationBar.titleTextAttributes = textAttributes
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(handleNewMessage))
    }

    @objc func handleNewMessage(){
        performSegue(withIdentifier: "showNewMessage", sender: self)
    }

    //MARK: - Show ChatVC

    func showChatVC(forUser user: UserModel){
        print("Shooow, jihaaaaa")
        let messageController = MessageController()
        messageController.user = user
        performSegue(withIdentifier: "showChatVC", sender: self)

    }

    //MARK: - Prepare for segue

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showNewMessage" {
            let destinationVC = segue.destination as! NewMessageController
            destinationVC.chatController = ChatController()
        }

    }

    //MARK: - Table Config

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return messages.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MessagesTableViewCell", for: indexPath) as! MessagesTableViewCell

        return cell
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("did select row")
    }
}

newMessageVC:

class NewMessageController: UITableViewController {

    //MARK: - Outlets

    @IBOutlet var NewMessageTableView: UITableView!

    //MARK: - Var/let

    var users = [UserModel]()

    var chatController : ChatController?

    //Mark: - Init View Lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()

        configureNavigationBar()
        fetchUser()
    }

    //MARK: - User laden

    func fetchUser(){
        UserApi.shared.observeUsersButCurrentUser { (user) in
            self.users.append(user)
            self.NewMessageTableView.reloadData()
        }
    }

    //MARK: - Navigation Bar

    func configureNavigationBar() {
        navigationItem.title = "New Message"
        navigationController?.navigationBar.barTintColor = Defaults.hexStringToUIColor(hex: "#006D79")
        let textAttributes = [NSAttributedString.Key.foregroundColor: Defaults.hexStringToUIColor(hex: "#FFAA01")]
        navigationController?.navigationBar.titleTextAttributes = textAttributes
    }

    //MARK: - Tableview Config
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return users.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "NewMessageTableViewCell", for: indexPath) as! NewMessageTableViewCell

        cell.user = users[indexPath.row]

        return cell
    }

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

        self.dismiss(animated: true) {

            let user = self.users[indexPath.row]
            self.chatController!.showChatController(forUser: user)
        }
    }

}

Что я делаю не так?

1 Ответ

0 голосов
/ 12 апреля 2019

Заменить

destinationVC.chatController = ChatController()

на

destinationVC.chatController = self

Поскольку ChatController() - это новый другой экземпляр без прикрепленного макета раскадровки, поэтому никаких переходов и, следовательно, сбоя


func showChatVC(forUser user: UserModel){ 
    performSegue(withIdentifier: "showChatVC", sender:user) 
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showNewMessage" {
        let destinationVC = segue.destination as! NewMessageController
        destinationVC.chatController = ChatController()
    }
    else if segue.identifier == "showChatVC" {
        let destinationVC = segue.destination as! ChatVC
        destinationVC.user = sender as! UserModel
    }
}

Также сделать

weak var chatController : ChatController?

Чтобы не вызывать циклов сохранения

...