【问题标题】:viewDidAppear being called strangleyviewDidAppear 被扼杀
【发布时间】:2017-05-08 10:23:32
【问题描述】:

我有一个包含segmentedControlviewController。我有一个 VCA 和 VCB,它们位于 segmentedControl 中。当我点击第二段时,VCB 出现。现在我正在从 VCB 推送另一个 ViewController。但是当从那个 viewController 回来时,VCA 的viewDidAppear 被调用了。这对我来说很奇怪。因为用户在 VCB 上,所以为什么要调用 VCA 的 viewWillAppearviewDidAppear?这是一个解释更多的图表

这就是我将 viewControllers 添加到 segmentedControl 的方式

 func switchToViewController(viewController: UIViewController, selectedIndex: Int) {

    viewController.removeFromParentViewController()
    viewController.view.removeFromSuperview()

    addChildViewController(viewController)
    viewController.view.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(viewController.view)

    // Setting constraints of the container view
    NSLayoutConstraint.activate([
    viewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0),
        viewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0),
        viewController.view.topAnchor.constraint(equalTo: view.topAnchor, constant: 50),
        viewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0)
        ])

    viewController.didMove(toParentViewController: self)
}

我只是无法理解这种行为。所以请指导我。

【问题讨论】:

  • 包含分段控制的viewcontroller和VCA一样吗?
  • no 他们不一样。 viewController 包含 segmentedControl 是一个不同的 VC 我们称之为 VCSegmentedControl
  • 为什么要删除 viewController 并添加相同的 viewController
  • 实际上,当用户点击段控件时,我正在使用相同的功能。所以我在再次添加之前将其删除,否则我认为它会添加多次。
  • 尝试使用容器视图。

标签: ios swift uisegmentedcontrol viewwillappear viewdidappear


【解决方案1】:

您永远不会从层次结构中删除 当前 视图控制器及其视图...

您需要跟踪当前显示的 VC/视图 - 可能使用 currentVC 变量,您的函数应如下所示:

func switchToViewController(viewController: UIViewController, selectedIndex: Int) {

    // remove current ViewController from VC hierarchy
    currentVC.removeFromParentViewController()

    // remove current VC.View from View hierarchy
    currentVC.view.removeFromSuperview()

    // the "incoming" ViewController becomes the "current" ViewController
    currentVC = viewController

    addChildViewController(viewController)
    viewController.view.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(viewController.view)

    // Setting constraints of the container view
    NSLayoutConstraint.activate([
    viewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0),
        viewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0),
        viewController.view.topAnchor.constraint(equalTo: view.topAnchor, constant: 50),
        viewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0)
        ])

    viewController.didMove(toParentViewController: self)
}

【讨论】:

    【解决方案2】:

    在这里,您可以使用containerView 实现此目的。 ContainerView 是一个普通的 UIView 子类。你的用户界面将是这样的。您将拥有一个baseViewController,在baseViewController 中您将拥有segmentControlcontainerView 视图。

    假设您有两个视图控制器,即viewController1viewController2。您可以将这些视图控制器作为childViewController 添加到此containerView,如下所示。

    import UIKit
    
    class BaseViewController: UIViewController {
    
        @IBOutlet weak var typeSegment: UISegmentedControl!
        @IBOutlet weak var containerView: UIView!
    
        var viewController1: UIViewController?
        var viewController2: UIViewController?
    
    
        // MARK: - Action method.
    
        @IBAction func segmentIndexChanged(_ sender: Any) {
    
            let selectedIndex = typeSegment.selectedSegmentIndex
    
            switch selectedIndex {
            case 0:
                addVC1()
            case 1:
                addVC2()
            default:
                break
            }
    
        }
    
    func rectForChildVC() -> CGRect {
    
        let rect = CGRect(x: containerView.frame.origin.x , y: containerView.frame.origin.y, width: containerView.frame.size.width, height: containerView.frame.size.height)
        return rect
    
    }
    
    func addVC1() {
    
        removeVC2()
        let storyboard = UIStoryboard(name: "StoryboardName", bundle: nil)
        viewController1 = storyboard.instantiateViewController(withIdentifier: "Viewcontroller1Identifier") // Create you first view controller instance here.
        viewController1?.view.frame = rectForChildVC()
        addChildViewController(viewController1!)
        view.addSubview((viewController1?.view)!)
        viewController1?.didMove(toParentViewController: self)
        view.layoutIfNeeded()
    
    }
    
    func addVC2() {
    
        removeVC1()
        let storyboard = UIStoryboard(name: "StoryboardName", bundle: nil)
        viewController2 = storyboard.instantiateViewController(withIdentifier: "Viewcontroller2Identifier") // Create you second view controller instance here.
        viewController2?.view.frame = rectForChildVC()
        addChildViewController(viewController2!)
        view.addSubview((viewController2?.view)!)
        viewController2?.didMove(toParentViewController: self)
        view.layoutIfNeeded()
    
    }
    
    func removeVC1() { // Remove first view controller.
    
        if let viewController = viewController1 {
            viewController.didMove(toParentViewController: nil)
            viewController.view.removeFromSuperview()
            viewController.removeFromParentViewController()
        }
    
    }
    
    func removeVC2() { // Remove second view controller
    
        if let viewController = viewController2 {
            viewController.didMove(toParentViewController: nil)
            viewController.view.removeFromSuperview()
            viewController.removeFromParentViewController()
        }
    
    }
    
    }
    

    谢谢。

    【讨论】:

    • 感谢您的解决方案,但我不想更改我的实现... :)
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2021-01-04
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多