Reputation: 154
I am trying to present a ViewController from another swift file. This works if i want to present a ViewController from another ViewController.
This time i want to present a ViewController in a tabBarController from a class which belongs to a xib. This prints: "In new init" in presenter, but not the print: "setting up presenter" in VC. Any ideas why?
(unrelated code is cut out)
Code from class in 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 which i want to present over current context:
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 which i want to present over current context:
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
}
Upvotes: 0
Views: 455
Reputation: 601
Probably your currentViewController?.tabBarController is nil. Usually it is possible when it is not rootViewController of UITabBarController or not in the stack.
You can simply present you view controller like this:
vc.modalPresentationStyle = .overFullScreen // .fullScreen
currentVieController.present(vc, animated: true, completion: nil)
Upvotes: 1