我有一个objc uiviewcontroller,可以在模态中对swift uiviewcontroller执行segue。我在objc文件中创建委托,但我无法从swift文件中调用objc中的方法。所有文件接缝都没问题,但是当调用delegate.function时,我在swift文件中给出了一个错误的exec。
objc
#import "Cliente-Swift.h"
@interface ViewController () <gameDelegate>
@end
(...)
else if ([[segue identifier] isEqualToString:@"segueToGame"]) {
//jump to main vgame controller
GameViewController *gameVC = [segue destinationViewController];
gameVC.mydelegate = self;
}
swift GameViewController
@objc protocol gameDelegate {
func dismissGame()
}
class GameViewController: UIViewController {
var mydelegate: gameDelegate! = nil
override func viewDidLoad() {
super.viewDidLoad()
let scene = MainMenuScene(size:CGSize(width: 1536, height: 2048))
//let scene = GameScene(size:CGSize(width: 1536, height: 2048))
let skView = self.view as! SKView
skView.showsFPS = true
skView.showsNodeCount = true
skView.showsPhysics = true;
skView.ignoresSiblingOrder = true
scene.scaleMode = .AspectFill
skView.presentScene(scene)
}
override func prefersStatusBarHidden() -> Bool {
return true
}
func sairDoJogo() {
print("mydelegate = \(mydelegate!)")
mydelegate!.dismissGame()
坏exec是调用objc函数dismissGame的地方
答案 0 :(得分:0)
我怀疑,mydelegate
并未真正设定。
您应该通过添加日志输出来检查mydelegate
中是否确实设置了prepareForSegue:...
:(您的segue ID是否正确?)
else if ([[segue identifier] isEqualToString:@"segueToGame"]) {
//jump to main vgame controller
NSLog(@"Setting game delegate");
GameViewController *gameVC = [segue destinationViewController];
gameVC.mydelegate = self;
}
在GameViewController
中,您可以在致电mydelegate
之前检查nil
是dismissGame()
,还是仅使用?
:(正如您所声明的那样) mydelegate
为gameDelegate!
,您的通话中的!
不是必需的,因为它“隐含在那里” - 但您仍然可以使用mydelegate?.dismissGame()
)
if mydelegate != nil {
mydelegate.dismissGame()
}
或
mydelegate?.dismissGame()
(我对一个示例项目进行了快速测试,并且mydelegate
未初始化导致您所描述的错误。)
答案 1 :(得分:0)
感谢您的回答。我知道了。没有任何关于授权,或objc和快速整合。代表很好,其余的都是。问题是当我意识到我解决问题时,我是如何从spritekit场景回调uiviewcontroller的。再次感谢