从 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)
}
我有 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)
}