从另一个视图控制器swift修改一个变量

时间:2014-10-12 15:25:53

标签: ios swift pushviewcontroller

我正在Swift中开发一个应用程序,用一个主旨,告诉人们各种货币的比特币价格。要选择货币,用户可以从具有UITableView的视图控制器中的列表中进行选择。这是currencyViewController,它来自我的主屏幕viewController。

我想要发生的是,当用户解雇currencyViewController时,它会将一个字符串传递给主viewController中的UIButton。

这里是应传递数据的prepareForSegue函数:

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "presentCurrency") {

        currencySelector.setTitle("\currencySelected", forState: UIControlState.Normal)

    }
}

CurrencySelector是主viewController中的UIButton,而currencySelected是第二个视图控制器中的变量currencyViewController。

它在文字"

中给出了错误"无效的转义序列

所以,我把它缩小到两个问题之一:

  1. 来自viewController的变量无法见到""来自currencyViewController。如果是这样,我如何从CurrencyViewController修改CurrencySelector的文本?

  2. 出于某种原因,当用户退出推送的CurrencyViewControler时,不会调用prepareForSegue。

  3. 这里发生了什么?谢谢,道歉 - 我只是一个快速的新手。

2 个答案:

答案 0 :(得分:14)

2 - 当你通过segue推送一个新的视图控制器时调用“prepareForSegue”,但是当你解除它时不会。解雇后不会被称为segue。

1 - 执行此操作的好方法是委托模式。

因此主视图控制器将成为currencyViewController的委托,并在该控制器被解除时收到消息。

在currencyViewController文件的开头,您准备了委托:

protocol CurrencyViewControllerDelegate {
  func currencyViewControllerDidSelect(value: String)
}

并向currencyViewController添加变量:

var delegate : CurrencyViewControllerDelegate?

现在,mainViewController必须符合该协议并回答该功能:

class MainViewController : UIViewController, CurrencyViewControllerDelegate {
  //...  

  func currencyViewControllerDidSelect(value: String)  {
    //do your stuff here
  }
}

一切都准备好了。最后一步,在prepareForSegue(MainViewController)中,您将设置currencyViewController的委托:

var currencyVC = segue.destinationViewController as CurrencyViewController
currencyVC.delegate = self;

当用户选择currencyViewController中的值时,只需在委托中调用该函数:

self.delegate?.currencyViewControllerDidSelect("stuff")

可能有点复杂,但这是一个非常有用的模式:)如果您需要,这里有一个很好的教程和更多信息:

http://www.raywenderlich.com/75289/swift-tutorial-part-3-tuples-protocols-delegates-table-views

答案 1 :(得分:4)

您必须使用parantheses来评估字符串中的变量,即println("\(currencySelected)")

要访问第二个视图控制器中的变量(作为segue目标的变量),您必须获得对它的引用:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "presentCurrency") {
        let currencyViewController = segue.destinationViewController as CurrencyViewController // the name or your class here

        currencySelector.setTitle("\(currencyViewController.currencySelected)", forState: UIControlState.Normal)

    }
}