如何快速执行条件segue操作?

Posted

技术标签:

【中文标题】如何快速执行条件segue操作?【英文标题】:How to perform conditional segue operation in swift? 【发布时间】:2019-10-07 02:37:26 【问题描述】:

我正在尝试按照下面的代码执行条件转场,如果用户 ID 仅与当前用户 ID 匹配,则执行转场但它没有按要求发生,它执行转场而不执行条件语句, 调用 func toChatView 条件必须为真

按钮位于表格视图控制器中的表格单元格中,必须从中调用操作

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


        cell.itemLikebutton.tag = indexPath.row
        cell.itemLikebutton.addTarget(self, action: #selector(likeaction1(_:)), for: .touchUpInside)


        cell.chatButton.tag = indexPath.row
        cell.chatButton.addTarget(self, action: #selector(toChatView(_:)), for: .touchUpInside)




            cell.set(comment: comments[indexPath.row])

        return cell


    

       @IBAction func toChatView(_ sender: Any) 
        var currentUserId = Auth.auth().currentUser!.uid
        if currentUserId == userId1 || currentUserId == UserId2

            performSegue(withIdentifier: "toMessageRoom", sender: self)

        
        else
            self.view.makeToast("You are not authorized for this chatroom")

        


    

现在我在准备函数中遇到了这个错误

else if (segue.identifier == "toMessageRoom")

            let chatbutton = sender as! UIButton
            let comment = comments[chatbutton.tag]
            var commentKey1 = comment._documentId
           var commentUserID  =  comment._commentAuthorId
            var messageRoomId = postId + postAuthorId + commentKey1! + commentUserID!
                var vc = segue.destination as! ChatViewController
                vc.MessageRoomPostId = postId
            vc.MessageRoomCommentId = commentKey1!
            vc.messageRoomIdFinal = messageRoomId

                print(postId +  "Check Message Configuration" + commentKey1!)


        

错误是

无法将“BlogApp2.CommentListViewController”(0x10b31d280) 类型的值转换为“UIButton”

【问题讨论】:

显然条件成立。 @matt 并非在所有情况下,在执行 segue 后,它都会在不为真时执行条件的 toast 消息 您是否将 segue 链接到情节提要中的按钮(而不是视图控制器)?如果是这样,那么当点击按钮时,segue 将始终触发。 @shim 是的,我将按钮从 tablecell 链接到目标视图控制器 【参考方案1】:

将您的 segue 从源视图控制器链接到目标视图控制器,而不是从您的按钮/单元格链接,以便在点击操作发生时它不会自动触发 segue。

将 segue 直接链接到按钮(等)便于快速触发 segue,而无需调用 performSegue 的其他代码,但如果您需要有条件地触发 segue,则不能使用它。

确保您的 IBAction 方法也链接到相应的按钮。根据您单元格中的内容,您可能希望使用 UITableViewDelegate 方法 tableView(_:didSelectRowAt:) 而不是 IBAction。

另外,在您的 performSegue 调用中将 self 更改为 sender,以便它将按钮而不是视图控制器发送到 prepareForSegue 方法。

【讨论】:

@shim 我已经更新了条件为真时的错误,数据也必须传递给目标视图控制器 如果您将self(即您的视图控制器)作为performSegue 中的发件人发送,您为什么要尝试将其转换为按钮?您可以将self 更改为sender【参考方案2】:

改变

performSegue(withIdentifier: "toMessageRoom", sender: self)

performSegue(withIdentifier: "toMessageRoom", sender: sender)

【讨论】:

这不是一个完整的回应;它只解决了问题的后续部分,我已经在 cmets 中解释了。

以上是关于如何快速执行条件segue操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何制作 Segue Pass 数据并且仅在满足某些条件时执行

多个视图控制器 segue 并快速执行功能

如何在触发退出 segue 之前执行操作?

如何以编程方式执行Unwind segue?

如何使用 CloudKit 查询条件 segues?

在特殊的 if else 条件下快速触发 Segue