【问题标题】:delegate from a objc to swift to dismiss modal view从 objc 委托到 swift 以关闭模态视图
【发布时间】:2015-08-04 09:59:21
【问题描述】:

我有一个 objc uiviewcontroller,它在模态中对 swift uiviewcontroller 执行 segue。我在 objc 文件中创建了委托,但我无法从 swift 文件中调用 objc 中的方法。所有文件接缝都可以,但是在调用 delegate.function 时,我在 swift 文件中执行错误。

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;
    }

斯威夫特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的地方

【问题讨论】:

  • 您在哪里将 self 分配给您的代表? self.mydelegate = 自我
  • 在prepareForSegue游戏中VC.mydelegate = self;

标签: objective-c swift delegates


【解决方案1】:

感谢您的回答。我得到了它。没有关于委托,或 objc 和快速集成的内容。代表很好,其余的也很好。问题是我如何从 spritekit 场景中回调 uiviewcontroller,一旦我意识到我解决了问题。再次感谢

【讨论】:

    【解决方案2】:

    我怀疑,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 中,您可以在调用dismissGame() 之前检查mydelegate 是否为nil,或者只使用?:(当您将mydelegate 声明为gameDelegate! 时,@ 987654332@ 在您的通话中是不必要的,因为它“隐式存在” - 但您仍然可以使用 mydelegate?.dismissGame())

        if mydelegate != nil {
            mydelegate.dismissGame()
        }
    

    或

        mydelegate?.dismissGame()
    

    (我使用示例项目进行了快速测试,未初始化 mydelegate 会导致您描述的错误。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2012-08-09
      相关资源
      最近更新 更多