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 函数中放置断点以验证值。
答案正确,但让我换个方式解释。
bottone
、punti
、casella
、immagine
是 nil
,直到加载视图。
在上面的 Objective C 示例中,您在创建实例之后但在加载视图之前调用 -abilitaOggetti
。
简单的解决方案是删除 Objective C 中对 -abilitaOggetti
的调用并将其添加到 ViewController
的 func 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
}
}
在我的项目中,我在 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 函数中放置断点以验证值。
bottone
、punti
、casella
、immagine
是 nil
,直到加载视图。
在上面的 Objective C 示例中,您在创建实例之后但在加载视图之前调用 -abilitaOggetti
。
简单的解决方案是删除 Objective C 中对 -abilitaOggetti
的调用并将其添加到 ViewController
的 func 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
}
}