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

Posted

技术标签:

【中文标题】快速从另一个视图控制器修改一个变量【英文标题】:Modifing one variable from another view controller swift 【发布时间】:2014-10-12 15:25:52 【问题描述】:

我正在用 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 是主 viewController 中的 UIButton,currencySelected 是第二个视图控制器 currencyViewController 中的变量。

它给出了错误“Invalid Escape Sequence In Literal”

所以,我将其缩小到以下两个问题之一:

    无法从 currencyViewController “看到”来自 viewController 的变量。如果是这样,如何从 CurrencyViewController 修改 CurrencySelector 的文本?

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

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

【问题讨论】:

如果你想在返回第一个控制器时调用 prepareForSegue,你需要返回一个 unwind segue。 【参考方案1】:

2 - 当您通过 segue 推送新的视图控制器时调用“prepareForSegue”,但在您关闭它时不会调用。解雇时不会调用任何转接。

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

【讨论】:

对于一个模式来说可能有点复杂,但它确实很酷,并且展示了 ios 开发中的一些强大功能。【参考方案2】:

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

    

【讨论】:

以上是关于快速从另一个视图控制器修改一个变量的主要内容,如果未能解决你的问题,请参考以下文章

快速从另一个视图控制器更改 webview 的 url

快速从另一个访问 Viewcontroller 的实例

从另一个视图控制器访问变量。迅速

从另一个视图控制器中的类中快速绘制形状(以编程方式)

如何在没有任何推送序列的情况下快速从另一个视图控制器访问方法?

从另一个视图控制器更新 UIPageControl