Ошибка выполнения перехода при вызове функции из другого класса - PullRequest
0 голосов
/ 22 января 2019

У меня есть раздел видео вступления для приложения. В раскадровке есть переход "toMainMenu", который связан с другим контроллером представления раскадровки.

В IntroVideoVC есть два класса: -

class IntroVideoVC: UIViewController {
    var videoView: IntroVideoView!

    override func viewDidLoad() {
        videoView = IntroVideoView(controller: self)
        self.view.addSubview(videoView)

       let tap = UITapGestureRecognizer(target: self, action: #selector(tappedVideo))
       view.addGestureRecognizer(tap)
    }

    @objc func tappedVideo() {
        videoFinished();
    }

    func videoFinished() {
        self.performSegue(withIdentifier: "toMainMenu", sender: self)
    }   
}

class IntroVideoView: UIView {
    init(controller: UIViewController) {
        super.init(frame: CGRect(x: 0, y: 0, w: 0, h: 0))
        self.controller = controller
        ...
    }

    func handleVideo(videoPlayer: AVPlayer) {
        ...
        IntroVideoVC().videoFinished()
    }
}

Если я нажму на видео, оно правильно выполнит переход, однако, если я позволю завершить видео, которое, в свою очередь, вызывает метод IntroVideoViews -> handleVideo (), я получаю сообщение о сбое, заявив, что оно не имеет перехода с идентификатором "toMainMenu".

Думаю, я понимаю, почему, но не знаю, как обойти эту проблему, будучи новичком в Свифте. Я полагаю, что это потому, что handleVideo () использует IntroVideoVC в качестве одиночного и поэтому теряет ссылку на контроллер IntroVideoVC! Возможно, я (читай: скорее всего) ошибаюсь, но это то, что я чувствую, может быть причиной этой проблемы.

Просто ищу толчок в правильном направлении

спасибо заранее

1 Ответ

0 голосов
/ 22 января 2019

Вы можете использовать протокол для решения этой проблемы, это будет что-то вроде этого:

protocol IntroVideoDelegate {
    func videoFinished()
}
class IntroVideoVC: UIViewController, IntroVideoDelegate {
    var videoView: IntroVideoView!

    override func viewDidLoad() {
        videoView = IntroVideoView(controller: self)
        videoView.videoDelegate = self
        self.view.addSubview(videoView)

       let tap = UITapGestureRecognizer(target: self, action: #selector(tappedVideo))
       view.addGestureRecognizer(tap)
    }

    @objc func tappedVideo() {
        videoFinished();
    }

    func videoFinished() {
       self.performSegue(withIdentifier: "toMainMenu", sender: self)
    }   
}

class IntroVideoView: UIView {
    videoDelegate: IntroVideoDelegate?
    init(controller: UIViewController) {
        super.init(frame: CGRect(x: 0, y: 0, w: 0, h: 0))
        self.controller = controller
        ...
    }

    func handleVideo(videoPlayer: AVPlayer) {
        ...
        videoDelegate.videoFinished()
    }
}

Помните, что videoView все еще является подпредставлением для IntroVideoVC, поэтому, если приложение возвращается к этому VC, пользователь увидит его, поэтому, если вы не хотите, чтобы это произошло, обязательно удалите его с помощью:

videoView.removeFromSuperview()

В ролике «Законченный ()»

Если вы хотите выполнить функцию VC из представления, вы должны получить родителя IntroVideoView, вот как: Учитывая представление, как мне получить его viewController? Но я уверен, что это ломает MVC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...