Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我在从导航堆栈中删除ViewController时遇到问题?_Ios_Swift_Xcode_Cocoa Touch_Uinavigationcontroller - Fatal编程技术网

Ios 我在从导航堆栈中删除ViewController时遇到问题?

Ios 我在从导航堆栈中删除ViewController时遇到问题?,ios,swift,xcode,cocoa-touch,uinavigationcontroller,Ios,Swift,Xcode,Cocoa Touch,Uinavigationcontroller,我有5个VC,我正在成功地从导航堆栈中删除ViewController。但问题是,当单击导航上的“后退”按钮时,它将移动到以前的VC,并在导航栏上显示已删除的VC 我有5个风险投资:VC1、VC2、VC3、VC4、VC5 现在我从VC1->VC2导航。。。。。VC4->VC5。我有自定义的导航栏返回按钮标题。这里我将从堆栈中删除VC4 当点击VC5中的后退按钮时,它将直接进入VC3。但导航栏是VC4。当再次单击导航栏时,它将在同一个VC中显示VC3导航栏 如何解决这个问题。我想直接显示VC3和V

我有5个VC,我正在成功地从导航堆栈中删除ViewController。但问题是,当单击导航上的“后退”按钮时,它将移动到以前的VC,并在导航栏上显示已删除的VC

我有5个风险投资:VC1、VC2、VC3、VC4、VC5

现在我从VC1->VC2导航。。。。。VC4->VC5。我有自定义的导航栏返回按钮标题。这里我将从堆栈中删除VC4

当点击VC5中的后退按钮时,它将直接进入VC3。但导航栏是VC4。当再次单击导航栏时,它将在同一个VC中显示VC3导航栏

如何解决这个问题。我想直接显示VC3和VC3导航栏在一次点击

从导航堆栈中删除VC的代码:

guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all UIViewController stack as Array
navigationArray.remove(at: navigationArray.count - 2) // To remove previous UIViewController
self.navigationController?.viewControllers = navigationArray
使用以下命令:

navigationController?.setViewControllers(navigationArray!, animated: true)
例如

从:

使用此方法更新或替换当前视图控制器堆栈 无需明确按下或弹出每个控制器。此外 此方法允许您在不设置动画的情况下更新控制器集 这些更改可能在您需要的启动时适用 将导航控制器返回到以前的状态

如果启用了动画,此方法将决定动画的类型 根据项目中的最后一个项目是否 阵列已在导航堆栈中。如果视图控制器是 当前在堆栈中,但不是最上面的项,此方法使用 流行音乐的转变;如果它是最上面的项,则不允许转换 表演。如果视图控制器不在堆栈上,则此方法 使用推送转换。仅执行一次转换,但在 转换完成后,堆栈的所有内容都将被删除 替换为新的视图控制器。例如,如果控制器A, B、 和C在堆栈上,设置控制器D、A和B,如下所示 方法使用pop转换,结果堆栈包含 控制器D、A和B

编辑1

按下VC5时,请使用以下代码

let vc = YourVC5()
var array = navigationController?.viewControllers
array?.removeLast()
array?.append(vc)
navigationController?.setViewControllers(array!, animated: true)

我们的想法是,当您将VC5推入堆栈时,在按下之前,我们将从列表中排除VC4,因此默认情况下,VC5下面将有VC3,您只需调用navigationController?。popViewControlleranimated:true,它应直接弹出到VC3

隐藏默认后退按钮,并添加带有操作的自定义后退按钮:

override func viewDidLoad {
    super.viewDidLoad()
    self.navigationItem.hidesBackButton = true
        let customBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItem.Style.plain, target: self, action: #selector(back))
        self.navigationItem.leftBarButtonItem = customBackButton
}
使用popToViewController移回特定的viewcontroller:

@objc func back(sender: UIBarButtonItem) {
    guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all 
self.navigationController!.popToViewController(navigationArray[navigationArray.count - 2], animated: true)
}
您可以使用上面回答的Prakash Shaiva:

guard let navigationController = self.navigationController else { return }

var navigationArray = navigationController.viewControllers // To get all 
self.navigationController.popToViewController(navigationArray[navigationArray.count - 2], animated: true)
并尝试在VC3的方法中更新导航栏。

如果使用自定义导航栏,则需要在VC5中使用自定义后退按钮单击操作:-

如果您可以使用默认导航栏,则需要在VC5的导航堆栈中删除VC4,如下所示:-

guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all UIViewController stack as Array
navigationArray.remove(at: navigationArray.count - 2) // To remove previous UIViewController
self.navigationController?.viewControllers = navigationArray

这两条线的区别。。。self.navigationController?.viewControllers=navigationaray无需。。guard let navigationController=self.navigationController else{return}var navigationaray=navigationController.viewControllers navigationaray.removeat:navigationaray.count-2 self.navigationController?.viewControllers=navigationaray self.navigationController?.setviewcontrollers navigationaray,动画:true这是我的代码,ui已更新但不工作。获得相同的结果。您需要删除此行self.navigationController?.ViewController=navigationArray@iOS我已经用一个例子更新了我的答案,当你想移动到VC3时,请勾选在VC5中写入这个当单击导航栏上的后退按钮时,我想直接移动到VC3。这是默认行为。。如何编写。将自定义后退按钮添加到导航栏,并在自定义后退操作中编写此代码button@iOS用自定义后退按钮更新了我的答案。。。让我们检查一下,我也在做同样的事情。请参阅参考。我不创建自定义后退按钮。内置的后退按钮工作。
@IBAction func btnBackAction(_ sender: UIButton) {
       let vc = VC3()
       self.navigationController.popToViewController(vc, animated: true)
 }
guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all UIViewController stack as Array
navigationArray.remove(at: navigationArray.count - 2) // To remove previous UIViewController
self.navigationController?.viewControllers = navigationArray