Swift - 在 obj c 中发出调用函数

Swift - issue calling function in obj c

在我的项目中,我在 swift 项目中使用 objective c,但是当我尝试调用 swift 函数时。

我有这个 Xcode 错误:

Fatal error: unexpectedly found nil while unwrapping an Optional value*

那些对象存在,但将它们视为 nil。我不明白原因。

share.m

 @interface ViewControllerDio () <UIAlertViewDelegate>

@end
@implementation ViewControllerDio
 - (void)prova:(ShareViewController *) shareviewcontroller {

  [shareviewcontroller abilitaOggetti];

 }

ShareViewController.swift

var name: String?
init(name: String) {

    self.name = name
    super.init(nibName: nil, bundle: nil);
}

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

class func newInstanceNamed(name: String) -> ShareViewController {
    return ShareViewController(name: name)
}

func abilitaOggetti(){


    println("working")
}

   override func viewDidLoad() {
        super.viewDidLoad()
    }
 @IBAction func share(){

       var start: ViewControllerDio = ViewControllerDio()
    //    start.share(image)

        start.prova(start)


    }


}

您需要将 nibName 设置为您的 nib 的文件名:

super.init( nibName: "ViewController", bundle: nil)

插座仅在视图控制器的视图加载时填充。由于在您调用 abilitaOggetti 时您还没有对需要视图(即推送或呈现它)的视图控制器执行任何操作,所以我不希望子视图被实例化。

在 swift 函数中放置断点以验证值。

答案正确,但让我换个方式解释。

bottonepunticasellaimmaginenil,直到加载视图。

在上面的 Objective C 示例中,您在创建实例之后但在加载视图之前调用 -abilitaOggetti

简单的解决方案是删除 Objective C 中对 -abilitaOggetti 的调用并将其添加到 ViewControllerfunc viewDidLoad().

override func viewDidLoad() {
    super.viewDidLoad()

    self.abilitaOggetti()
}

这是一个更复杂的解决方案,它允许您保留 Objective C 代码。它在 -abilitaOggetti.

中执行工作之前测试视图是否已加载
var needsAbilitaOggettiOnViewDidLoad: Bool

override func viewDidLoad() {
    super.viewDidLoad()

    if (self.needsAbilitaOggettiOnViewDidLoad) {
        self.needsAbilitaOggettiOnViewDidLoad = false
        self.privateAbilitaOggetti()
    }
}

private func privateAbilitaOggetti() {
    self.bottone.hidden = false  //HERE*
    self.punti.hidden = false //HERE*
    self.casella.hidden = false //HERE*
    self.immagine.hidden = false //HERE*
}

func abilitaOggetti() {
    if (self.isViewLoaded()) {
        self.privateAbilitaOggetti()
    } else {
        self.needsAbilitaOggettiOnViewDidLoad = true
    }
}