如何在swift中执行条件segue操作?
How to perform conditional segue operation in swift?
我正在尝试按照以下代码执行条件转场,如果用户 ID 与当前用户 ID 匹配,则仅执行转场但未按要求发生,它执行转场而不执行条件语句,调用函数 toChatView 条件必须为真
按钮位于 table 视图控制器的 table 单元格中,必须从那里调用操作
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")
}
}
现在我在 prepare func 中收到此错误
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!)
}
错误是
Could not cast value of type 'BlogApp2.CommentListViewController' (0x10b31d280) to 'UIButton'
Link 你从源视图控制器到目标视图控制器的 segue,而不是从你的 button/cell,这样它不会在点击操作发生时自动触发 segue。
Link 将 segues 直接连接到按钮(等)对于快速触发 segues 非常方便,而无需调用 performSegue
的额外代码,但如果您需要有条件地触发 segues,则不能使用它。
确保您的 IBAction
方法也链接到适当的按钮。根据您的单元格中的内容,您可能希望使用 UITableViewDelegate
方法 tableView(_:didSelectRowAt:)
而不是 IBAction。
在您的 performSegue
调用中将 self
更改为 sender
,这样它将按钮而不是视图控制器发送到 prepareForSegue
方法。
改变
performSegue(withIdentifier: "toMessageRoom", sender: self)
至
performSegue(withIdentifier: "toMessageRoom", sender: sender)
我正在尝试按照以下代码执行条件转场,如果用户 ID 与当前用户 ID 匹配,则仅执行转场但未按要求发生,它执行转场而不执行条件语句,调用函数 toChatView 条件必须为真
按钮位于 table 视图控制器的 table 单元格中,必须从那里调用操作
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")
}
}
现在我在 prepare func 中收到此错误
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!)
}
错误是
Could not cast value of type 'BlogApp2.CommentListViewController' (0x10b31d280) to 'UIButton'
Link 你从源视图控制器到目标视图控制器的 segue,而不是从你的 button/cell,这样它不会在点击操作发生时自动触发 segue。
Link 将 segues 直接连接到按钮(等)对于快速触发 segues 非常方便,而无需调用 performSegue
的额外代码,但如果您需要有条件地触发 segues,则不能使用它。
确保您的 IBAction
方法也链接到适当的按钮。根据您的单元格中的内容,您可能希望使用 UITableViewDelegate
方法 tableView(_:didSelectRowAt:)
而不是 IBAction。
在您的 performSegue
调用中将 self
更改为 sender
,这样它将按钮而不是视图控制器发送到 prepareForSegue
方法。
改变
performSegue(withIdentifier: "toMessageRoom", sender: self)
至
performSegue(withIdentifier: "toMessageRoom", sender: sender)