在我的项目中,我在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)
}
}
答案 0 :(得分:2)
只有在视图控制器的视图加载时才会填充插座。由于您在调用abilitaOggetti
时需要查看(即推送或显示)视图控制器,您还没有做任何事情,我不希望实例化子视图爱好。
在swift函数中放置一个断点来验证值。
答案 1 :(得分:0)
您需要将nibName设置为笔尖的文件名:
super.init( nibName: "ViewController", bundle: nil)
答案 2 :(得分:0)
@PhillipMills有正确的答案,但让我以不同的方式解释。
在加载视图之前, bottone
,punti
,casella
,immagine
为nil
。
在上面的Objective C示例中,您在创建实例之后但在加载视图之前调用-abilitaOggetti
。
简单的解决方案是删除对目标C中-abilitaOggetti
的调用,并将其添加到ViewController
的{{1}}。
func viewDidLoad()
这是一个更复杂的解决方案,允许您保留Objective C代码。它在override func viewDidLoad() {
super.viewDidLoad()
self.abilitaOggetti()
}
中完成工作之前测试是否已加载视图。
-abilitaOggetti