如何在 Swift 中通过 Segue 将数据传递到下一个视图?
Posted
技术标签:
【中文标题】如何在 Swift 中通过 Segue 将数据传递到下一个视图?【英文标题】:How to pass the data to next View via Segue in Swift? 【发布时间】:2016-08-10 01:08:39 【问题描述】:我正在使用 Swift 进行开发。
下面的图片是我的故事板。
有一个主视图。 主视图会将视图更改为扫描视图,并在按下 Scan (右栏按钮项)。
StoryBoard Segue的标识符是ScanView
我使用以下代码将数据从 Main 传递到 Scan
当按下扫描(右栏按钮项目)。
self.performSegueWithIdentifier("ScanView", sender: self)
并将数据传递给下一个视图
//prepare jumping to next page
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if (segue.identifier=="ScanView")
let desViewController = segue.destinationViewController as! ScanViewController
desViewController.myCenteralManager = myCenteralManager
它会在let desViewController = segue.destinationViewController as! ScanViewController
崩溃并显示如下错误:
Could not cast value of type 'UINavigationController' (0x3960e0a8) to 'BLEConnect.ViewController' (0x5514c).
有人可以教我如何解决这个问题吗?提前致谢。
【问题讨论】:
错误信息很清楚;您试图强制将 UINaigationController 强制转换为 ScanViewController。您可以将主视图控制器嵌入导航控制器而不是扫描视图中,否则您需要从导航控制器的 ViewControllers 属性访问扫描视图控制器。我也不喜欢从扫描视图回到主视图的那种外观。您应该使用 unwind segue,或者如果您在导航控制器中嵌入主视图控制器,则默认情况下后退按钮将在那里 【参考方案1】:错误信息非常清楚,您尝试将segue.destinationViewController
设为ScanViewController
,而实际上它是一个导航控制器。您需要先获取导航控制器,然后使用其topViewController
属性来获取目标视图控制器。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if (segue.identifier=="ScanView")
if let navController: UINavigationController = segue.destinationViewController as? UINavigationController
if let desViewController: ScanViewController = navController.topViewController as? ScanViewController
desViewController.myCenteralManager = myCenteralManager
【讨论】:
【参考方案2】:您的NavigationController
(可能)在 Interface Builder 中的位置错误。现在,当你继续时,你会去UINavigationController
,而不是你期望的ScanViewController
。这就是强制转换失败的原因,因为您试图将 UINavigationController
强制为 ScanViewController
。
要解决此问题,您应该将 MainViewController
放在 UINavigationController
中,然后直接转到您的 ScanViewController
。
This guide 准确展示了如何使用 Interface Builder、UINavigationController 和 segues 来实现您想要做的事情。
【讨论】:
【参考方案3】:您可以将您的 导航控制器 嵌入到 主 ViewController 中并像上面那样执行 segue。那应该可以解决问题。
显示错误消息是因为您输入了 Navigation Controller 而不是 Scan ViewController。
【讨论】:
以上是关于如何在 Swift 中通过 Segue 将数据传递到下一个视图?的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 2 中通过“prepareForSegue”传递数据
如何在没有 segue 的情况下在 Swift 3 中将数据从 VC 传递到另一个?
使用 Swift 3 将数据从 Modal Viewcontroller 传递到 rootController(不要 Segue)