在 Swift 中将数据传递给另一个 ViewController

Posted

技术标签:

【中文标题】在 Swift 中将数据传递给另一个 ViewController【英文标题】:Passing data to another ViewController in Swift 【发布时间】:2015-06-14 15:18:59 【问题描述】:

在开始之前,我先说一下我看过一篇关于此事的热门帖子:Passing Data between View Controllers

我的项目在github上https://github.com/model3volution/TipMe

我在 UINavigationController 内部,因此使用 pushsegue。

我已验证我的 IBAction 方法已正确链接,并且 segue.identifier 对应于故事板中的 segue 标识符。

如果我取出prepareForSegue: 方法,则会发生segue,但显然没有任何数据更新。

我的具体错误信息是:Could not cast value of type 'TipMe.FacesViewController' (0x10de38) to 'UINavigationController' (0x1892e1c).

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
// Get the new view controller using segue.destinationViewController.
    if segue.identifier == "toFacesVC" 
        let navController:UINavigationController = segue.destinationViewController as! UINavigationController
        let facesVC = navController.topViewController as! FacesViewController
        facesVC.balanceLabel.text = "Balance before tip: $\(balanceDouble)"
    


下面是带有代码和错误的屏幕截图。 旁注:使用 Xcode 6.3、Swift 1.2

【问题讨论】:

正如已经建议的另一条评论:在您的问题中包含代码。我现在为您这样做是因为提供在某处下载的项目可以让其他用户更轻松地帮助您。我喜欢:) +1 【参考方案1】:

有几点:

1:将您的prepareForSegue 更改为

if segue.identifier == "toFacesVC" 
    let facesVC = segue.destinationViewController as! FacesViewController
    facesVC.text = "Balance before tip: $\(balanceDouble)"

2:将字符串变量添加到您的FacesViewController

var text:String!

3:更改FacesViewControllerviewDidLoad

override func viewDidLoad() 
    super.viewDidLoad()

    balanceLabel.text = text

所有更改的原因:segue destinationViewController 是您转换到的实际 FacesViewController -> 不需要 navigationController 恶作剧。仅此一项就可以消除“大小写错误”,但是由于您尝试访问尚未设置的balanceLabel,因此会由于解包 nil 值而发生另一个错误。因此,您需要创建一个字符串变量来保存您实际要分配的字符串,然后在 viewDidLoad 中分配该文本 - 在实际分配 UILabel 的位置。

证明它有效:

4:如果您想显示余额的两位小数,您可以将字符串创建更改为类似(遵循https://***.com/a/24102844/2442804):

facesVC.text =  String(format: "Balance before tip: $%.2f", balanceDouble)

导致:

【讨论】:

我认为他希望它是“$4.00”而不是“$4.0”。我不知道如何在 Swift 中做到这一点,但在 Objective C 中,这是返回一个 NSString 对象:[NSString stringWithFormat:@"Balance before tip: $.2f", balanceDouble] 可能,不知道,但与他的实际问题无关。而且我不知道在字符串文字 \(...) 中有任何方法可以做到这一点 我知道这与 OP 的问题没有太大关系,但我只是在看屏幕截图,“$4.0”让我有点恼火。 @DDPWNAGE 好的,为了完整起见,我将包括它;) 只有在推送导航控制器时才需要访问导航控制器,例如从标签栏控制器中。当您在导航控制器/它的导航堆栈中时,您将始终访问将呈现的实际控制器。如果您需要更多信息,我很遗憾无法帮助您...

以上是关于在 Swift 中将数据传递给另一个 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

collectionView 函数 didSelectItemAt indexPath 将数据传递给下一个视图控制器

Android - 在 onCreateViewHolder(..) 中将数据传递给 ViewHolder 构造函数

在 ng-click 中将数据传递给模型

在 vue.js 应用程序中将数据传递给模态

在 jQuery 中将 JSON 数据传递给 .getJSON?

无论控制器如何,如何在 Laravel 中将数据传递给布局?