首页 > 解决方案 > SwipeGesture (Present Modely/Show/Show Details/Deprecated Push) 最多只能处理 4 个 View 控制器吗?

问题描述

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

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

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

UINavigationController 最多只能处理 4 个 Viewcontroller 吗?

我们已经使用 segue Show、Show Details、Present Modally 和
Push Deprecated 尝试了所有导航。
在除了 Push Deprecated 控制器之外的所有 segue 中,既不会转到第五个控制器,也不会给出错误。尝试在 iPhone 上运行时,Push deprecated 会出错。sigbart

我们正在使用Xcode10iOS 12.0

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

标签: iosswiftxcodenavigationuiswipegesturerecognizer

解决方案


推送的视图控制器的数量没有限制。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将调用 a 来创建一个点击手势识别器,该识别器设置为推送新实例的方法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)
}

推荐阅读