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



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

我想做的是,当用户解除currencyViewController时,它会将一个字符串传递给主视图控制器中的UIButton。

下面是应该传递数据的prepareForSegue函数:

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "presentCurrency") {
        currencySelector.setTitle("currencySelected", forState: UIControlState.Normal)
    }
}

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

它给出错误"文本中的无效转义序列"

因此,我将其缩小到两个问题之一:

  1. 无法从currencyViewController"查看"viewController中的变量。如果是,我如何从CurrencyViewController修改CurrencySelector的文本?

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

这是怎么回事?谢谢,很抱歉,我只是一个敏捷的新手。

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

您必须使用参数来评估字符串中的变量,即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)
    }
}

最新更新