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

时间:2015-06-14 15:18:59

标签: ios iphone swift uinavigationcontroller segue

在开始之前,请允许我说我已经看过一篇关于此问题的热门帖子:Passing Data between View Controllers

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

我在UINavigationController中,因此使用push segue。

我已经确认我的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 screen shot with code and error

1 个答案:

答案 0 :(得分:3)

有几件事:

1:将prepareForSegue更改为

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

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

var text:String!

3:更改FacesViewController viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()

    balanceLabel.text = text
}

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

证明它有效:

enter image description here

4:如果要为余额显示两位小数,可以将字符串创建更改为(https://stackoverflow.com/a/24102844/2442804之后):

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

导致:

enter image description here