显示具有表视图didselect功能的多视图控制器

问题描述 投票:0回答:3

我正在根据 enum 渲染视图。对于

case .loaded
,我显示的是
self.showDetails
,它是一个视图控制器,它显示了当我选择单元格表单表格视图时它工作正常。

case .loaded(let details):
self.showDetails(details)

这是它的代码..


 private func showDetails(_ Details: Details) {
        let displayViewController = DetailsDisplayViewController(movieDetails: Details)
        addChild(displayViewController)
        displayViewController.view.frame = view.bounds
        displayViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        currentViewController?.willMove(toParent: nil)
        transition(
            from: currentViewController,
            to: displayViewController,
            duration: 0.25,
            options: [.transitionCrossDissolve],
            animations: nil
        ) { (_) in
            self.currentViewController.removeFromParent()
            self.currentViewController = displayViewController
            self.currentViewController.didMove(toParent: self)
        }
    }

但现在我必须在详细信息视图的底部添加另一个集合视图。我还为其创建了另一个枚举。

case .pageLoaded(let page):
self.showSimiliarDetails(page)
 

这是它的功能..相同的代码只需重用它即可。

private func showSimiliarDetails(_ similiarDetails: Page<Details>) {
        let smiliarViewController = SmiliarController(viewModel: viewModel)
        addChild(smiliarViewController)
        smiliarViewController.view.frame = view.bounds
        smiliarViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        currentViewController?.willMove(toParent: nil)
        transition(
            from: currentViewController,
            to: smiliarViewController,
            duration: 0.25,
            options: [.transitionCrossDissolve],
            animations: nil
        ) { (_) in
            self.currentViewController.removeFromParent()
            self.currentViewController = smiliarViewController
            self.currentViewController.didMove(toParent: self)
        }
    }

我已经使用数据源配置了集合视图单元 smiliarViewController。我试图在单击表视图单元格时显示两个视图控制器。表单表视图单元格正在传递 id,并将相似的记录获取到集合视图中。

我尝试将其作为数组传递,并像这样使用 + 运算符..

let arrayVc = viewController + similiarVC 
self.navigationController?.pushViewController(arrayVc, animated: true)

它给出错误.. **二元运算符“+”不能应用于**类型的操作数

第二种方法是像数组一样传递..

let arrayVc = [viewController , similiarVC]
self.navigationController?.pushViewController(arrayVc, animated: true)

但它显示此错误..

无法将类型“[UIViewController]”的值转换为预期参数类型“UIViewController”

这是didselect代码..

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            let value = viewModel.state.value[indexPath.row]
            let viewModel = ViewModel(value: value, apiManager: APIManager())
            let viewController = DetailsViewController(viewModel: viewModel)
            let similiarVC = SmiliarViewController(viewModel: viewModel)
            let arrayVc = [viewController , similiarVC]
            self.navigationController?.pushViewController(arrayVc, animated: true)
        }

有什么替代方法吗?

ios swift uitableview uicollectionview
3个回答
0
投票

pushViewController(_:animated:)
仅接受单个
UIViewController
。我相信您需要做的是创建一个容器视图控制器来显示您想要推送的两个视图控制器。考虑这种方法:https://developer.apple.com/documentation/uikit/view_controllers/creating_a_custom_container_view_controller


0
投票

如果理解正确的话,你想将两个控制器推送到视图堆栈上吗?如果是这样,那么您应该只需拨打

pushViewController(...)
两次即可:

self.navigationController?.pushViewController(viewController, animated: false)
self.navigationController?.pushViewController(similiarVC, animated: true)

0
投票

听起来您正在描述一个场景,其中您有一个代表不同状态的枚举,并且根据状态,您正在呈现不同的视图。具体来说,当状态为 .loaded 时,您将显示 self.showDetails,它是一个视图控制器,并且当从表视图中选择单元格时它可以正常工作。

以下是如何在 Swift 中处理这种情况的示例:

enum ViewState {
    case loaded
    // Add other states as needed
}

class MainViewController: UIViewController {
    var currentState: ViewState = .loaded // Assume initial state is loaded
    
    // Function to handle cell selection in table view
    func didSelectCell() {
        switch currentState {
        case .loaded:
            // Show details view controller
            let detailsViewController = self.showDetails
            // Present details view controller or navigate to it as needed
            // For example:
            self.navigationController?.pushViewController(detailsViewController, animated: true)
        // Handle other states as needed
        }
    }
    
    // Function to get the details view controller
    var showDetails: UIViewController {
        // Instantiate and configure details view controller
        let detailsVC = DetailsViewController()
        // Configure details view controller if needed
        return detailsVC
    }
}

class DetailsViewController: UIViewController {
    // Details view controller implementation
}

我们有一个枚举 ViewState 代表不同的状态。 在 MainViewController 中,有一个 currentState 属性来跟踪当前状态。

有一个 didSelectCell() 函数来处理表格视图中的单元格选择。它打开当前状态并执行适当的操作。

在 .loaded 情况下,它使用 self.showDetails 检索详细信息视图控制器并呈现它。

showDetails 属性是一个计算属性,可根据需要实例化和配置详细信息视图控制器。

DetailsViewController 是实际详细信息视图控制器实现的占位符。

您需要调整此示例以适应您的特定实现细节,例如如何处理导航以及如何配置详细信息视图控制器。

© www.soinside.com 2019 - 2024. All rights reserved.