Представьте ViewController в tabBarController из другого файла, Swift - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь представить ViewController из другого файла swift.Это работает, если я хочу представить ViewController из другого ViewController.

На этот раз я хочу представить ViewController в tabBarController из класса, который принадлежит XIB.Это печатает: «В новом init» в презентере, но не печатает: «настройка презентатора» в VC.Есть идеи, почему?

(вырезан несвязанный код)

Код из класса в xib:

@IBAction func timerBtnAction(_ sender: Any) {
    let vc = UIStoryboard(name: "SleepTimerPopup", bundle: nil).instantiateViewController(withIdentifier: "SleepTimerPopup_UI") as! SleepTimerPopup_UI
    vc.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
    let currentController = self.getCurrentViewController()
    currentController?.tabBarController?.present(vc, animated: true, completion: nil)
}

func getCurrentViewController() -> UIViewController? {

    if let rootController = UIApplication.shared.keyWindow?.rootViewController {
        var currentController: UIViewController! = rootController
        while( currentController.presentedViewController != nil ) {
            currentController = currentController.presentedViewController
        }
        return currentController
    }
    return nil
}

ViewController, который я хочу представить в текущем контексте:

class SleepTimerPopup_UI: UIViewController, SleepTimerPopupDelegate{


@IBOutlet var shortcutOutlets: [UIButton]!
@IBOutlet weak var timerDoneOutlet: UIButton!
@IBOutlet weak var timePickerOutlet: UIDatePicker!
@IBOutlet weak var sleepTimerContainerView: UIView!
@IBOutlet weak var sleepTimeLabel: UILabel!
@IBOutlet weak var stopWatchBackgroundView: UIView!
@IBOutlet weak var stopWatchImage: UIView!

let sleepTimerPopupDelegate = SleepTimerPopupPresenter()

override func viewDidLoad() {
    super.viewDidLoad()

    setupSleepTimerUI()
    setupSleepTimerDelegate()
}

func setupSleepTimerDelegate(){
    print("setting up presenter") <-- THIS IS NOT PRINTED
    sleepTimerPopupDelegate.setSleepTimerViewDelegate(sleepTimerDelegate : self)
}

ViewControllerPresenter, который я хочу представить в текущем контексте:

class SleepTimerPopupPresenter{

weak private var sleepTimerDelegate : SleepTimerPopupDelegate?
static var sleepTimer = SleepTimer(sleepTimerPopupPresenter: SleepTimerPopupPresenter())
static var doneBtnIsSelected = false
private var latestOutlet : UIButton?
private var setTime : (Int, Int)

init(){
    setTime = (0, 0)

    print("in new init") <----- THIS IS PRINTED

    NotificationCenter.default.addObserver(
        self,
        selector: #selector(self.timeChanged),
        name: Notification.Name("TimeUpdate"),
        object: nil)
}

func setSleepTimerViewDelegate(sleepTimerDelegate : SleepTimerPopupDelegate){
    self.sleepTimerDelegate = sleepTimerDelegate
}

1 Ответ

1 голос
/ 25 сентября 2019

Возможно, ваш currentViewController? .TabBarController равен нулю.Обычно это возможно, когда он не является rootViewController из UITabBarController или не находится в стеке.

Вы можете просто представить свой контроллер представления следующим образом:

vc.modalPresentationStyle = .overFullScreen // .fullScreen
currentVieController.present(vc, animated: true, completion: nil)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...