在swift中从另一个访问Viewcontroller的实例

时间:2014-08-08 13:06:19

标签: ios uiviewcontroller swift

我正在尝试将数据从一个View Controller的文本字段传输到另一个View标签的标签。

如何从其他View Controller的代码中调用View Controller实例?我正在使用故事板,因此我从未在代码中创建View Controller的实例?是否自动创建实例?他们有什么名字?

感谢您的帮助!

3 个答案:

答案 0 :(得分:20)

1。如果包含文本字段的视图控制器可以调用(带有segue)包含标签...

的视图控制器

在项目中添加一个新的Cocoa Touch类文件,将其命名为FirstViewController并在其中设置以下代码:

import UIKit

class FirstViewController: UIViewController {

    @IBOutlet weak var textField: UITextField! // FIXME: link this to the UITextField in the Storyboard!!!

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let controller = segue.destinationViewController as! SecondViewController
        controller.text = textField.text
    }

}

在项目中添加一个新的Cocoa Touch类文件,将其命名为SecondViewController并在其中设置以下代码:

import UIKit

class SecondViewController: UIViewController {

    var text: String?
    @IBOutlet weak var label: UILabel! // FIXME: link this to the UILabel in the Storyboard!!!

    override func viewDidLoad() {
        super.viewDidLoad()

        label.text = text
    }

}

在Storyboard中,将第一个视图控制器嵌入UINavigationController。使用UIButtonUIBarButtonItem将第一个视图控制器链接到第二个视图控制器。将第一个视图控制器的名称设置为FirstViewController,将第二个视图控制器的名称设置为SecondViewController。在第一个视图控制器中创建UITextField。在第二个视图控制器中创建UILabel。将文本字段和标签链接到FirstViewControllerSecondViewController中的相应声明。


2。如果包含标签的视图控制器可以调用(带有segue)包含textfield ...

的视图控制器

在这里,这是一个完美的协议/委托案例。您可能会在StackOverflow上找到很多处理此问题的东西。但是,这是一个粗略的例子。

在项目中添加一个新的Cocoa Touch类文件,将其命名为FirstViewController并在其中设置以下代码:

import UIKit

class FirstViewController: UIViewController, DetailsDelegate {

    @IBOutlet weak var label: UILabel! // FIXME: link this to the UILabel in the Storyboard

    func updateLabel(withString string: String?) {
        label.text = string
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let controller = segue.destinationViewController as! SecondViewController
        controller.delegate = self
    }

}

在项目中添加一个新的Cocoa / Cocoa Touch类文件,将其命名为SecondViewController并在其中设置以下代码:

import UIKit

protocol DetailsDelegate: class {
    func updateLabel(withString string: String?)
}

class SecondViewController: UIViewController {

    weak var delegate: DetailsDelegate?
    @IBOutlet weak var textField: UITextField! // FIXME: link this to the UITextField in the Storyboard

    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)

        delegate?.updateLabel(withString: textField.text)
    }

}

在Storyboard中,将第一个视图控制器嵌入UINavigationController。使用UIButtonUIBarButtonItem将第一个视图控制器链接到第二个视图控制器。将第一个视图控制器的名称设置为FirstViewController,将第二个视图控制器的名称设置为SecondViewController。在第一个视图控制器中创建UILabel。在第二个视图控制器中创建UITextField。将文本字段和标签链接到FirstViewControllerSecondViewController中的相应声明。

答案 1 :(得分:13)

Imanou Petit和Oscar Swanros已经正确回答。然而,有一个替代方案,而不是" hacky"我必须使用它来在两个视图控制器之间传输数据而不用segue连接它们。

要获取应用的根视图控制器,您可以执行以下操作:

UIApplication.sharedApplication().windows[0].rootViewController

从那里你可以获得你想要的任何视图控制器。例如,如果您想要根视图控制器的第二个子视图控制器,那么您将执行:

let viewController = UIApplication.sharedApplication().windows[0].rootViewController?.childViewControllers[1] as? YourViewController
viewController?.yourProperty = newValue

请记住,这种方法相当" hacky"并且可能违反了最佳编码实践。

答案 2 :(得分:5)

您需要在视图控制器之间创建一个Segue:

  1. 在故事板上,选择ViewController A
  2. 在按住Control的同时,点击ViewController A,将蓝线拖放到ViewController B。如果ViewController A中嵌入了NavigationController,请在您放手时显示的菜单中选择“显示”。否则,请选择“存在模态。”
  3. 在故事板上选择Segue,在Utilities面板上,转到Attributes Inspector并为您的segue指定一个标识符(例如:“DetailSegue”)。
  4. 现在,当你想在ViewController A上触发segue时,你只需要打电话(可能只需按一下按钮):

    @IBAction func buttonTapped() {
        self.performSegueWithIdentifier("DetailSegue", sender: self)
    }
    

    要将值传递给ViewController B,请覆盖prepareForSegue:sender上的ViewController A方法:

    override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
        if segue.identifier == "DetailSegue" {
            var viewControllerB = segue.destinationViewController as ViewControllerB
            viewControllerB.text = self.textField.text
        }
    }
    

    非常简单。

    请注意,要使其正常工作,您的ViewController B类应如下所示:

    class ViewControllerB: UIViewController {
        ver label = UILabel(...)
        var text: String? 
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            label.text = text!
        }
    }
    

    希望这有帮助。