从 Swift 中的其他 Class 调用方法

Call Method from other Class in Swift

我有 2 个视图控制器 class。我想从 ViewController 调用 ViewController2 的方法,但控制台给我这个错误:

fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

这是我在 ViewController class 中的方法:

class ViewController: UIViewController,CLLocationManagerDelegate,MKMapViewDelegate {

    @IBAction func testButton(sender: AnyObject) {
        ViewController2().setText("It's a Test!")
    }
}

这是来自 ViewController2 的一些代码:

class ViewController2: UIViewController {

    @IBOutlet weak var directionsTextField: UITextView!


    func setText(var fieldText:String){
            directionsTextField.text = directionsTextField.text + "\n \n" + fieldText
    }
}

我很乐意为您提供帮助! :-)

提前谢谢你:)

编辑:

我也明白了:

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

关于 setText 方法... 好像 directionsTextField 还没有 可能(??)

当您尝试第二个 ViewController 实例时发生错误。因为你需要实现 init 方法。

例如:

public class FirstViewController : UIViewController {

   public override func viewDidLoad() {
    super.viewDidLoad()

    let secondviewController = SecondViewController().setText("YOURTEXT")

}

}

第二个ViewController:

public class SecondtViewController: UIViewController {

public required init(coder aDecoder : NSCoder) {
    super.init(coder : aDecoder)
}

public init(nibName nibNameOrNil : String){
    super.init(nibName : nibNameOrNil, bundle: SBTVPayViewController.frameworkBundle())
}

public convenience init() {
    self.init(nibName: "MyNibName")
}

public func setText(texto : String) {

    directionsTextField.text = directionsTextField.text + "\n \n" + fieldText


}

}

当您尝试实例化一个 ViewController 时,第一个执行它的方法是 init

你已经很接近自己弄明白了。崩溃是因为你的 directionsTextField 还不存在。作为 IBOutlet,它不会在调用 viewDidLoad 之前存在。你如何解决这个问题?

您将 API 更改为 SecondViewController 并给它一个 directionsText 属性。以这样的方式结束:

@IBOutlet weak var directionsTextField: UITextView!
var directionsText = ""

override func viewDidLoad() {
    super.viewDidLoad()
    directionsTextField.text = directionsTextField.text + "\n\n\(directionsText)"
}

在您的 FirstViewController 中,您更改了 IBAction 以匹配 SecondViewController 的新 API:

@IBAction func testButton(sender: AnyObject) {
    let secondController = SecondViewController() // Felt a bit odd creating an instance without having a way of referencing it afterwards.
    secondController.directionsText = "It's a test"
    // Do what you want. (Perhaps pushing your secondController)
}