2015-05-22 3 views
2

У меня есть objc uiviewcontroller, которые выполняют segue для быстрого uiviewcontroller в модальном режиме. Я создаю делегат в файле objc, но я не могу вызвать метод в objc из файла swift. Все файлы швов должны быть в порядке, но при вызове функции delegate.function вы получаете плохой exec в быстром файле.делегат от objc до быстрого отклонения модального вида

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

+0

Где вы назначаете себя своему делегату? self.mydelegate = self – Amit89

+0

в игре prepareForSegueVC.mydelegate = self; – otitserip

ответ

0

Я подозреваю, что mydelegate не является действительно установлен. Вы должны проверить, является ли mydelegate действительно установлен в prepareForSegue:... возможно путем добавления вывода журнала: (Является ли ваш переход идентификатор правильно?)

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 не инициализированы приводит к ошибкам, которые Вы описали.)

0

спасибо за ответы. Я понял. Ничего не касается делегирования, или objc и быстрая интеграция. Делегат в порядке, и все остальное тоже. Проблема в том, как я вызываю uiviewcontroller из сцены spritekit, как только я понимаю, что я решу проблему. Еще раз спасибо

Смежные вопросы