【问题标题】:Can SwipeGesture (Present Modely/Show/Show Details/Deprecated Push) can only handle a maximum of 4 View controllers?SwipeGesture (Present Modely/Show/Show Details/Deprecated Push) 最多只能处理 4 个 View 控制器吗?
【发布时间】:2018-10-02 05:56:59
【问题描述】:

在我的应用程序中,我使用 5 ViewControllers。当我尝试导航到最后一个时,它不会显示。没有显示错误信息。

转到下一个屏幕我们正在使用 segue 对左滑动手势进行操作。

我们已经尝试了以下链接中提供的解决方案。他们说不推荐使用 push 然后编译。再次使用 show segue(未指定 Show / Show Details)我们尝试同时使用和编译。它将解决问题,因为它是Xcode 的问题。但是这个解决方案不起作用。我也无法评论他们的帖子。

Can UINavigationController only handle a maximum of 4 Viewcontrollers?

我们已经使用 segue 尝试了所有导航 显示、显示详细信息、模态显示和
推送已弃用。
在除了 Push Deprecated 控制器之外的所有 segue 中,既不会转到第五个控制器,也不会给出错误。 Push 已弃用,尝试在 iPhone 上运行时会出现 sigbart 错误。

我们正在使用Xcode10iOS 12.0

Xcode 9 Objective C 代码中开发相同的应用程序时,我们有前 2 个导航以模态形式存在,接下来的两个具有显示 segue,最后一个以模态形式存在。它在该代码上运行良好。我们也尝试了这个解决方案,但它不起作用。目前我正在使用最新的库在 Swift 中升级相同的代码,我正面临这个问题。请帮忙。

【问题讨论】:

    标签: ios swift xcode navigation uiswipegesturerecognizer


    【解决方案1】:

    推送的视图控制器的数量没有限制。例如,在viewDidLoad 上的代码中添加手势识别器并放置一些断点来查看那里发生了什么可能会更容易。

    要玩转这些东西,你可以试试这个极简代码,它会在每次点击时推送一个新的视图控制器。您可以创建一个新项目并简单地覆盖自动生成的 ViewController 的内容,一切都应该可以工作:

    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            present(UINavigationController(rootViewController: MyViewController()), animated: true, completion: nil)
        }
    
    }
    
    
    class MyViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onTap)))
            self.title = "View controller \(navigationController?.viewControllers.count ?? 0)"
        }
    
        @objc private func onTap() {
            navigationController?.pushViewController(MyViewController(), animated: true)
        }
    }
    

    解释一下:

    ViewController 的实例将在您的主窗口中创建为根视图控制器,它是项目设置(要使用的情节提要)的一部分,也是名为 main 的自动生成情节提要的一部分。

    我们需要等待第一个视图控制器的视图出现,然后才能展示我们的新导航视图控制器。我们提出了一个根视图控制器作为我们自己的视图控制器子类,称为MyViewController。此视图控制器不在情节提要中。

    MyViewController 的实例进入层次结构(使用push 或present)时,将调用viewDidLoad,它会创建一个点击手势识别器,该识别器设置为推送MyViewController 的新实例的方法。我们还根据导航控制器上的视图控制器数量设置标题,以获取更多信息。

    如前所述,这是一个简约的代码。但总的来说,您会执行以下操作:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        view.addGestureRecognizer({
            let swipeRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(onSwipeLeft))
            swipeRecognizer.direction = .left
            return swipeRecognizer
        }())
    }
    
    @objc private func onSwipeLeft() {
        let controllerToBePushed = UIStoryboard(name: "my_storyboard_name", bundle: nil).instantiateViewController(withIdentifier: "the_identifier_I_set_in_storyboard") as! WhateverTheTypeOfMyViewControllerIs
        navigationController?.pushViewController(controllerToBePushed, animated: true)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-15
      • 2014-12-04
      • 2016-05-25
      • 1970-01-01
      • 2012-04-05
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多