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

时间:2015-01-02 13:22:19

标签: ios objective-c swift

在我的项目中,我在swift项目中使用了目标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)


    }


}

3 个答案:

答案 0 :(得分:2)

只有在视图控制器的视图加载时才会填充插座。由于您在调用abilitaOggetti时需要查看(即推送或显示)视图控制器,您还没有做任何事情,我不希望实例化子视图爱好。

在swift函数中放置一个断点来验证值。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

@PhillipMills有正确的答案,但让我以不同的方式解释。

在加载视图之前,

bottonepunticasellaimmaginenil

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

简单的解决方案是删除对目标C中-abilitaOggetti的调用,并将其添加到ViewController的{​​{1}}。

func viewDidLoad()

这是一个更复杂的解决方案,允许您保留Objective C代码。它在override func viewDidLoad() { super.viewDidLoad() self.abilitaOggetti() } 中完成工作之前测试是否已加载视图。

-abilitaOggetti