1

I have a custom action sheet viewController. Which is presented modally on the current top view controller. Like this:

//MARK: Static Func
    static func initViewController() -> CustomActionSheetViewController {
        let customActionSheetViewController = CustomActionSheetViewController(nibName: "CustomActionSheetViewController", bundle: nil)
        return customActionSheetViewController
    }

    func presentViewController<T: UIViewController>(viewController: T) {
        DispatchQueue.main.async {
            if let topViewController = UIApplication.getTopViewController() {
                viewController.modalTransitionStyle = .crossDissolve
                viewController.modalPresentationStyle = .overCurrentContext
                topViewController.present(viewController, animated: true, completion: nil)
            }
        }
    }

// MARK: UIApplication extensions
extension UIApplication {
    class func getTopViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let nav = base as? UINavigationController {
            return getTopViewController(base: nav.visibleViewController)
        } else if let tab = base as? UITabBarController, let selected = tab.selectedViewController {
            return getTopViewController(base: selected)
        } else if let presented = base?.presentedViewController {
            return getTopViewController(base: presented)
        }
        return base
    }
}

And I am dismissing it like this:

@objc func dismissViewController() {
        DispatchQueue.main.async {
            if let topViewController = UIApplication.getTopViewController() {
               topViewController.dismiss(animated: true, completion: nil)
            }
            NotificationCenter.default.removeObserver(self)
        }
    }

It's working perfectly fine. I have added the notification observer in my customTabbarController, to dismiss the action sheet if user tap on some another tabbar button like this:

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
//        print("Selected view controller", viewController)
//        print("index", tabBarController.selectedIndex )
        let tabbarNotiKey = Notification.Name(rawValue: "TabbarNotiKey")
        NotificationCenter.default.post(name: tabbarNotiKey, object: nil, userInfo: nil)
    }

The action sheet is right now presenting on Home tab > Profile (by push) > Action sheet (by modal). So if I tap on Home tab again it will dismiss the action sheet viewController and come back to Home perfectly. But if I tap on some other tabbar button rather than home and come back home, it shows a black screen. What I am missing here? Any suggestions would be highly appreciable.

enter image description here

Tulon
  • 4,011
  • 6
  • 36
  • 56

1 Answers1

0

I guess your code calls dismissViewController() twice.

  1. When you press other tab, it removes the action sheet
  2. And then you click home tab and it calls dismissViewController again, and now it removes the homescreenVC
Gal
  • 1,582
  • 2
  • 14
  • 30