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

我正在Swift上开发一个应用程序,主要是告诉人们各种货币比特币的价格。 要select货币,用户从视图控制器中的列表中select一个UITableView。 这是currencyViewController,它是从我的主屏幕,viewController呈现。

我想要发生的是,当用户closurescurrencyViewController,它将一个string传递到主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中的variables。

它给出错误“无效的逃逸序列在文字”

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

  1. 从viewController的variables不能从currencyViewController“看到”。 如果是这样,我怎么能从CurrencyViewController修改CurrencySelector的文本?

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

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

2 – “prepareForSegue”被称为当你通过继续推新的视图控制器,但不是当你解雇它。 不得要求解雇。

1 – 一个好办法是做代表模式。

所以主视图控制器将是currencyViewController的委托,并且当控制器被解散时会收到一条消息。

在您准备委托的currencyViewController文件的开始:

 protocol CurrencyViewControllerDelegate { func currencyViewControllerDidSelect(value: String) } 

并向currencyViewController添加一个variables:

 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; 

当用户selectcurrencyViewController中的值时,只需在代理中调用该函数即可:

 self.delegate?.currencyViewControllerDidSelect("stuff") 

也许有点复杂,但它是一个非常有用的模式:)这里是一个很好的教程,更多的信息,如果你想要它:

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

您必须使用parantheses来评估string中的variables,即println("\(currencySelected)")

要访问第二个视图控制器(即segue的目的地)的variables,你必须得到一个引用:

 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) } }