我一直在创建我的应用程序完全从零开始编程,没有使用故事板。
我的应用程序与Firebase集成,并使用Facebook登录。
我的设置相当简单:
启动应用程序->带你到第一个名为WelcomeViewController的VC。
在cc方法中有一个检查,看看用户是否已经登录并存在。如果有的话,它会直接把你送到第二个VCviewDidLoad
FilmsViewController是显示影片的collectionViewController。用户可以按一个胶卷,它可以让他们了解有关该胶卷的更多信息。
(作为参考,我已经在我的应用程序中使用Facebook登录)
我有一个当前的问题,当上面的第2步发生时,它会转换到FilmsViewController,但是它会像2或3次那样执行。所以你会看到新的VC出现了2到3次,然后内容加载。如果您按下导航栏中的FilmsViewController按钮,它会在您返回Back之前,带您返回到它加载的2或3个viewControllers。
我的观点如下。
WelcomeViewController中:

var window: UIWindow?
var navController: UINavigationController?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    navController = UINavigationController()
    let firstViewController: WelcomeViewController = WelcomeViewController()
    self.navController!.pushViewController(firstViewController, animated: true)

    window = UIWindow(frame: UIScreen.main.bounds)
    window?.rootViewController = navController
    window?.makeKeyAndVisible()

    return true

}

AppDelegate.swiftWelcomeViewController中:
FIRAuth.auth()?.addStateDidChangeListener { auth, user in

        if let user = user {

            // User is signed in.
            // Direct the user to the home screen

            let toFilmListVC = FilmsViewController(collectionViewLayout: UICollectionViewFlowLayout())
            self.navigationController?.pushViewController(toFilmListVC, animated: true)

        } else { ...
        }
}

我已经找了很多解决办法,但什么也没有。我只找到一篇关于这个问题的文章,有人说解决方案是更改那个控制器的类名,我已经做过了,它没有改变任何东西。
有人能帮我解决这个问题吗?谢谢您。

最佳答案

addStateDidChangeListener可能被多次调用。
您应该修改它以检查是否已经推送了FilmsViewController,以防止推送另一个:

FIRAuth.auth()?.addStateDidChangeListener { auth, user in

    if let user = user {

        // User is signed in.
        // Direct the user to the home screen

        // Only push one FilmsViewController onto the navigation stack!
        var shouldPush = true
        if let navigationController = self.navigationController {
            for viewController in navigationController.viewControllers {
                if viewController is FilmsViewController {
                    shouldPush = false
                }
            }
        }

        if shouldPush {
            let toFilmListVC = FilmsViewController(collectionViewLayout: UICollectionViewFlowLayout())
            self.navigationController?.pushViewController(toFilmListVC, animated: true)
        }
    } else { ...
    }
}

关于ios - 快速以编程方式创建导航 Controller 时,View Controller会出现多次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39669682/

10-09 18:33