【问题标题】:ViewController appears mulitple times when creating a navigationController programmatically in swift在 swift 中以编程方式创建 uinavigationController 时,ViewController 出现多次
【发布时间】:2016-09-23 21:17:03
【问题描述】:

我一直以编程方式完全从头开始创建我的应用程序,不使用 Storyboards

我的应用与 Firebase 集成,并使用 Facebook 登录。

我的设置相当简单:

  1. 启动应用程序 -> 将您带到第一个名为 WelcomeViewController 的 VC。
  2. viewDidLoad 方法中进行检查以查看用户是否已登录并存在。如果有,它会将您直接发送到名为 FilmsViewController 的第二个 VC
  3. FilmsViewController 是一个显示电影的 collectionViewController。用户可以按下电影,它会将他们带到有关该电影的更多信息。

(作为参考,我已经在我的应用中使用 Facebook 登录)

我有一个当前问题,当上面的第 2 步发生时,它会转换到 FilmsViewController,但它会执行 2 或 3 次。因此,您会看到新的 VC 出现 2 或 3 次,然后加载内容。如果您按下导航栏中的 Back 按钮,它会带您返回它加载的 2 或 3 个视图控制器,然后再带您回到 WelcomeViewController

我的观点如下。

AppDelegate.swift:

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

}

WelcomeViewControllerviewDidLoad

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 { ...
        }
}

我已经寻找解决方案的负载 - 没有。我只找到了一篇关于这个问题的帖子,有人说解决方案是更改该控制器的类名,我已经这样做了,它没有改变任何东西。

谁能帮我解决这个问题,好吗?谢谢。

【问题讨论】:

  • 这可能无法直接回答您的问题,但这个 YouTube 频道有大量关于使用故事板的有用教程,此链接也专门用于 firebase - youtube.com/playlist?list=PL0dzCUj1L5JEfHqwjBV0XFb9qx9cGXwkq
  • @JasonM。这是鼓励我在没有故事板的情况下开始编码的人!我完全按照他的做法,没有喜悦,这就是让这更令人沮丧的原因。不过谢谢! Brian 的频道很棒,其他人看到这个,看看他!
  • 看起来您的 addStateDidChangeListener 在开始时被调用了不止一次。你有没有设置断点来分析这个?我也有点困惑如何将 WelcomeController 设置为 Nav Controller。您应该使用 WelcomeController 作为 RootViewController 来初始化 navController。好吧,但如果它有效:D。所以检查监听器,你会看到;)
  • 你可以做的是,在推送之前检查监听器,如果你当前的控制器在视图中可见,如果我没有错,你可以使用 self.view.isVisible 或类似的。嗯,并尝试使用弱化的自我 :)

标签: ios swift uinavigationcontroller uicollectionview


【解决方案1】:

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 { ...
    }
}

【讨论】:

    【解决方案2】:

    我知道上述解决方案有效,但要让它看起来非常简单。 这是我在项目中编写的代码。

    let someController = SomeController.someController()
    if !(self.navigationController!.viewControllers.contains(someController)){
       self.navigationController?.pushViewController(someController, animated:true)
     }
    

    如果控制器不存在,则仅将控制器推送到导航栏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多