从 Swift 中的其他类调用方法

Posted

技术标签:

【中文标题】从 Swift 中的其他类调用方法【英文标题】:Call Method from other Class in Swift 【发布时间】:2015-09-06 22:07:14 【问题描述】:

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

致命错误:在展开可选值时意外发现 nil (lldb)

这是我在 ViewController 类中的方法:

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
    

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

提前谢谢你:)

编辑:

我也明白了:

线程 1:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

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

【问题讨论】:

为什么不使用委托模式?正是您想要在这里实现的是UIViewControllers 相关(segue 等) 我该怎么做?我不知道如何使用委托模式,或者我只是不完全明白你的意思。 【参考方案1】:

您已经非常接近自己弄清楚了。崩溃是因为您的 directionsTextField 尚不存在。作为一个 IBOutlet,在调用 viewDidLoad 之前它不会存在。你如何解决这个问题?

您为您的SecondViewController 更改您的API 并给它一个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)

【讨论】:

你的意思是directionsTextField.text = directionTextField.text + "\n\n(directionsText)",对吧? 是的,那是其中之一。 非常感谢您的帮助,我终于成功了。你写的方式在我正在使用的“真实”方法中不适用 1:1,所以我不得不添加一些“prepareForSegue”的东西,但我想我会再次尝试按照你的方式实现它。不知何故,directionsText 是空的/空白的......也许它在类加载时设置为“”? 我会 +1。好答案 @T.BenjaminLarsen 我现在 1-uppped 你:D 差不多 1.5 年后,但仍然 :)【参考方案2】:

当您尝试实例化 Second 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

【讨论】:

非常感谢您提供快速而好的答案,但我仍然以某种方式收到错误.. 致命错误:在展开可选值 (lldb) 时意外发现 nil 尝试定义函数的 de 值不是可选的。 func setText(var fieldText:String!)

以上是关于从 Swift 中的其他类调用方法的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4.2 - 如何从 tableView 中的“didSelectRowAtIndexPath”方法调用“indexPath.row”到另一个类?

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据

从 Swift 函数中的异步调用返回数据