gpt4 book ai didi

ios - 如何根据选定的单元格将 segue 推送到特定的 View Controller ?

转载 作者:行者123 更新时间:2023-11-28 15:09:38 25 4
gpt4 key购买 nike

我有一个复杂的问题,我想用视觉和代码来解释。

目前,这是我的应用程序的视觉工作方式:

enter image description here

我有一个 ViewControllerOne 类,其中包含一个带有 9 个单元格的 UITableView。任何选择的行除了第 2、6 和 7 行将转至 ViewControllerTwo 并带有其自己的 UITableView 和行数。

如果选择第 2、6 或 7 行,推送转场会将另一个 ViewControllerOne 堆叠到现有 ViewControllerOne 上。这样做的原因是因为每一行都是一个类别,但是第 2、6 和 7 行还包含子类别,这些子类别看起来与 ViewControllerOne Main-VC 上的离开了。

我不想创建另一个包含与 Main-VC 中完全相同代码的类,而是想重用 ViewControllerOne 类。

现在,如果选择了 SUB-VC 中的任何行,它将执行推送转场到 ViewControllerTwo

由于 ViewControllerOneViewControllerTwo 嵌入在 UINavigationController 中,我遇到的问题是在第 5 步:

  1. 我在 Main-VC 中选择了不是 2、6 或 7 的行,它带我到 ViewControllerTwo(它应该如此)
  2. 我通过导航栏后退按钮返回到 Main-VC 并在 MAIN-VC 中选择第 2、6 或 7 行,它将带我到 SUB-VC(应该如此)
  3. 我在 Sub-VC 中选择了 不是 2、6 或 7 的行,它将带我到 ViewControllerTwo(因为它应该)
  4. 我通过导航栏上的导航栏后退按钮回到Sub-VC
  5. 我在 Sub-VC 中选择第 2、6 或 7 行,它将推送 segue 并将另一个 Sub-VC 堆叠在现有 之上Sub-VC 而不是对 ViewControllerTwo
  6. 进行推送转场

我有一个 Manager 类,它处理逻辑并与 ViewControllerOneViewControllerTwo 通信以显示数据。

import UIKit

enum SubGroupState
{
case SubGroup1, None, SubGroup2, SubGroup3
}

class Manager: NSObject
{
public var subGroupState = SubGroupState.None
public var oldSubGroupState = SubGroupState.None
public var showSubGroups = Bool()

override init()
{
super.init()
}

public func initializeGroupState(row: Int) -> UIViewController
{
if showSubGroups == false && oldSubGroupState == .None
{
switch row
{
case 2:
subGroupState = .SubGroup1
break

case 6:
subGroupState = .SubGroup2
break

case 7:
subGroupState = .SubGroup3
break

default:
subGroupState = .None
break
}
}

if (subGroupState != .None && oldSubGroupState == .None)
|| (subGroupState == .None && oldSubGroupState != .None)
{
showSubGroups = true
}
else
{
showSubGroups = false
}

return initializeGroupVC(row: row)
}

fileprivate func initializeGroupVC(row: Int) -> UIViewController
{
let storyboard = UIStoryboard(name: "Main",
bundle: nil)

if showSubGroups == true
&& subGroupState != .None
{
guard let viewControllerOne = storyboard.instantiateViewController(withIdentifier: "ViewControllerOne")
as? ViewControllerOne else {
return UIViewController()
}
viewControllerOne.manager.oldSubGroupState = muscleSubGroupState
viewControllerOne.manager.showSubGroups = showSubGroups

return viewControllerOne
}
else
{
guard let viewControllerTwo = storyboard.instantiateViewController(withIdentifier: "ViewControllerTwo")
as? ViewControllerTwo else {
return UIViewController()
}

return muscleGroupExercisesVC
}
}

}

states 的目的是让我可以根据所选单元格的 state 处理显示不同的子类别。

当用户选择一个单元格时,我在 ViewControllerOne 中创建了一个 Manager 的实例:

extension ViewControllerOne: UITableViewDataSource
{
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
tableView.deselectRow(at: indexPath,
animated: true)

let viewController = manager.initializeGroupState(row: indexPath.row)
self.navigationController?.pushViewController(viewController,
animated: true)
}
}

class ViewControllerOne: UIViewController
{
public var manager = Manager()

....
}

问题出在函数 initializeGroupState 的逻辑处理中,但我尝试了其他不同的组合,我总是将 Sub-VC 堆叠在现有的Sub-VC 第 2、6 和 7 行,这显然对应于 Main-VC 中的子组行,这就是我遇到困难的问题处理逻辑。

如果我以错误的方式执行此操作,是否有更好的替代方案来替代我试图在不重复代码的情况下实现的目标?

注意:我的 Storboard 只有 Main-VC ViewControllerOneViewControllerTwo 的连接。添加的 Sub-VC ViewControllerOne 可以直观地看到我正在尝试做什么,但实际上并不存在于我的 Storyboard 中。

最佳答案

我认为我们可以尽可能保持简单

class ViewControllerOne: UIViewController, UITableViewDelegate {
var isSubVC = false

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: false)

if self.isSubVC {
// Push to ViewControllerTwo
} else {
// MainVC
if indexPath.row == 2 || indexPath.row == 6 || indexPath.row == 7 {
let subVC = self.storyboard?.instantiateViewController(withIdentifier: "ViewControllerOne") as! ViewControllerOne
subVC.isSubVC = true
self.navigationController?.pushViewController(subVC, animated: true)
} else {
// Push to ViewControllerTwo
}
}
}
}

以下是使用您的经理想法进行导航的代码,无需任何测试。

enum ViewControllerType {
case main, subGroup1, subGroup2, subGroup3
}

class Manager {
public var currentState = ViewControllerType.main

public func initializeGroupState(row: Int) -> UIViewController {
if self.currentState == .main {
// MainVC, should push to SubVC if match condition
switch row {
case 2:
return self.makeSubViewController(state: .subGroup1)
case 6:
return self.makeSubViewController(state: .subGroup2)
case 7:
return self.makeSubViewController(state: .subGroup3)
default:
return self.makeViewControllerTwo()
}
} else {
// Current is SubVC, dont care kind of row, should push to ViewControllerTwo
return self.makeViewControllerTwo()
}
}

private func makeViewControllerTwo() -> UIViewController {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "ViewControllerTwo")
return vc
}

private func makeSubViewController(state: ViewControllerType) -> UIViewController {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "ViewControllerOne") as! ViewControllerOne
vc.manager.currentState = state
return vc
}
}

关于ios - 如何根据选定的单元格将 segue 推送到特定的 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47883294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com