我一直在创建我的应用程序完全从零开始编程,没有使用故事板。
我的应用程序与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.swift
的WelcomeViewController
中: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/