为 Swift 中的 Segue 做准备
Posted
技术标签:
【中文标题】为 Swift 中的 Segue 做准备【英文标题】:Prepare for Segue in Swift 【发布时间】:2014-07-25 07:05:37 【问题描述】:我正面临错误消息:
"UIStoryboardSegue does not have a member named 'identifier'"
这是导致错误的代码
if (segue.identifier == "Load View")
// pass data to next view
在 Obj-C 上可以这样使用:
if ([segue.identifier isEqualToString:@"Load View"])
// pass data to next view
我做错了什么?
【问题讨论】:
错误是否在UIStoryboardSegue的末尾有问号 请显示您正在使用的整个功能。 【参考方案1】:这似乎是由于UITableViewController
子类模板中的问题。它带有 prepareForSegue
方法的一个版本,需要您解开 segue。
将您当前的 prepareForSegue
函数替换为:
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)
if (segue.identifier == "Load View")
// pass data to next view
这个版本隐式解包参数,所以你应该没问题。
【讨论】:
@Fogmeister 我注释掉了模板提供的版本并开始输入prepareForSegue
,自动完成向我建议了强制解包参数的版本。谁知道...【参考方案2】:
斯威夫特 4、斯威夫特 3
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if segue.identifier == "MySegueId"
if let nextViewController = segue.destination as? NextViewController
nextViewController.valueOfxyz = "XYZ" //Or pass any values
nextViewController.valueOf123 = 123
【讨论】:
【参考方案3】:我认为问题是你必须使用 !解绑标识符
我有
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?)
if segue!.identifier == "Details"
let viewController:ViewController = segue!.destinationViewController as ViewController
let indexPath = self.tableView.indexPathForSelectedRow()
viewController.pinCode = self.exams[indexPath.row]
我的理解是没有 !你只是得到一个真值或假值
【讨论】:
不,你没有。标识符是 segue 的强制解包属性。 @Fogmeister 所以使用 Xcode 提供的模板似乎没有展开 是的,看起来子类的模板是错误的。【参考方案4】:对于 Swift 2.3、swift3 和 swift4:
在 didSelectRowAtindexPath 处创建一个执行 Segue
例如:
self.performSegue(withIdentifier: "uiView", sender: self)
之后创建一个 prepareforSegue 函数来捕获 Destination segue 并传递值:
例如:
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if segue.identifier == "uiView"
let destView = segue.destination as! WebViewController
let indexpath = self.newsTableView.indexPathForSelectedRow
let indexurl = tableDatalist[(indexpath?.row)!].link
destView.UrlRec = indexurl
//let url =
您需要在目标视图控制器中创建一个名为 UrlRec 的变量
【讨论】:
【参考方案5】:斯威夫特 1.2
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!)
if (segue.identifier == "ShowDeal")
if let viewController: DealLandingViewController = segue.destinationViewController as? DealLandingViewController
viewController.dealEntry = deal
【讨论】:
as
后面的?
是什么意思?
@Deekor destinationViewController 是可选的,而 as?如果它是被强制转换的类型,则强制转换一个可选项。因为它是一个 if let,所以我们只在可选项是 DealLandingViewController 时才让赋值发生,否则我们的条件评估为 false。这是 swift 的语言特性。【参考方案6】:
为 Swift 4.2 和 Swift 5 中的 Segue 做准备。
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if (segue.identifier == "OrderVC")
// pass data to next view
let viewController = segue.destination as? MyOrderDetailsVC
viewController!.OrderData = self.MyorderArray[selectedIndex]
如何在特定事件(如按钮点击等)上调用 segue:
performSegue(withIdentifier: "OrderVC", sender: self)
【讨论】:
【参考方案7】:这是您可以使用此函数的一种方式,当您想要访问另一个类的变量并根据该变量更改输出时。
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
let something = segue.destination as! someViewController
something.aVariable = anotherVariable
【讨论】:
【参考方案8】:如果您没有使用具有不同标识符的相同目标视图控制器,则代码可以比其他解决方案更简洁(并避免在其他一些答案中使用as!
):
override func prepare(for segue: NSStoryboardSegue, sender: Any?)
if let myViewController = segue.destinationController as? MyViewController
// Set up the VC
【讨论】:
【参考方案9】:更改右侧面板中带有 id 的部分中的 segue 标识符。图标以匹配您在条件中使用的字符串。
【讨论】:
【参考方案10】:override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?)
if(segue!.identifier)
var name = segue!.identifier;
if (name.compare("Load View") == 0)
您不能将标识符与 == 进行比较,您必须使用 compare() 方法
【讨论】:
这是一个错误的说法:Swift 中的字符串符合Equatable
协议,并且中缀运算符“==”被覆盖,因此实际上表达式a == b
与a.isEqual(b)
.
您正在将字符串与 NSString 进行比较,它们是不同的,无论上述代码如何工作。 string 没有名为 .isEquals 或 .isequalsto 的方法
NSString 和(Swift 的)String 在幕后自动桥接。在操场上亲自尝试一下:let native = "Hello World"; let bridged = native as NSString
现在输入native == bridged
(这会产生true
)。现在输入bridged.dynamicType.description()
(这会产生乱码)和native.dynamicType.description()
,这会产生REPL错误,因为String.Type没有响应description()。以上是关于为 Swift 中的 Segue 做准备的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中为嵌入式 tableView 中的 segue 做准备
如果 segue.identifier == "showChildFiles" 当 segue 标识符看起来正确时,Swift 3 准备 segue 不通过