Как вызвать метод из класса контроллера модального представления в Swift? - PullRequest
0 голосов
/ 05 марта 2019

В основном для этого простого игрового приложения у меня есть 2 разных UIViewController, называемых ViewController и PreviewController. PreviewController открывает вид с титульным экраном и надписью «Начать игру». При нажатии на метку он запускает модальный контроллер представления (класс ViewController, который имеет все представления для самой игры) и вызывает метод «EnterNewGame» из ViewController, который устанавливает игру. Прямо сейчас у меня возникает проблема при вызове этого метода, кажется, что работает только часть метода.

Вот функция в PreviewController, которая запускается при нажатии:

@objc func handleButtonTap(_ recognizer: UITapGestureRecognizer) {
    self.present(ViewController(), animated: true, completion: {() -> Void in
        ViewController().enterNewGame()
    })
}

А вот и метод EnterNewGame () из ViewController

func enterNewGame() {
    //show suit indicators when starting a new game
    bluePlayerSuitsHidden = false
    redPlayerSuitsHidden = false

    game.blueTurn = true
    self.setBackground()
    self.cleanUpBoard()
    self.createBoard()
    self.displayBoard()
    self.setSuitIndicators()
    self.highlightCards()
    playButton.isEnabled = false
}

Прямо сейчас, когда на этикетке нажимают, экран переходит к контроллеру модального вида, но отображает только черный экран, и только одна из настроек игры (установка нескольких изображений в верхней части экрана) работает должным образом. Я уверен, что метод EnterNewGame работает правильно, чтобы фактически запустить игру, потому что я тестировал ее изолированно, поэтому я думаю, что я просто не настраиваю контроллер модального представления должным образом, или я должен вызывать метод по-другому. Любая помощь приветствуется, спасибо.

1 Ответ

0 голосов
/ 05 марта 2019

Контроллер, на котором вы вызываете свой метод, не совпадает с экземпляром контроллера, который вы представляете, вам нужна константа (также ваш код можно упростить, избегая использования ссылок self и написания имени completion параметр с указанием параметра замыкания и типа возвращаемого значения)

@objc func handleButtonTap(_ recognizer: UITapGestureRecognizer) {

    let controller = ViewController()

    present(controller, animated: true) {
        controller.enterNewGame()
    }
}

Кроме того, вы можете вызывать этот метод для некоторых других методов внутри вашего определенного контроллера, таких как viewDidLoad, viewWillAppear, или вы можете создать фабричный метод, который будет возвращать вам определенный набор контроллеров.

Эта последняя часть подводит меня к идее: посмотрите, как вы создаете экземпляр своего контроллера, и смотрите внимательно, если вам не нужно создавать его экземпляр через раскадровку или файл пера.

class ViewController: UIViewController {

    class func instantiate() -> ViewController {
        let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Identifier") as! ViewController
        // let controller = ViewController(nibName: "ViewController", bundle: nil)
        controller.enterNewGame()
        return controller
    }

}

Использование:

@objc func handleButtonTap(_ recognizer: UITapGestureRecognizer) {
    present(ViewController.instantiate(), animated: true)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...