在容器视图中刷新单个视图控制器

6
我需要帮助通过传递一个变量值来刷新容器视图中的单个视图控制器。我有一个包含容器视图的故事板。请参考以下图片:Container View。 "Total Sales by Company Users"会根据选择器视图控制器而改变,这意味着它将为不同的数据更新我的视图控制器。
现在,我正在使用以下代码通过编程方式将我的视图控制器添加到“DashbordVC”的此容器视图中:
var previousViewController : UIViewController?
var selectedIndex : Int = 0

// TopSalesVC - Instantiate ViewController
private lazy var topSalesVC: TopSalesVC = {
    var vc = TopSalesVC.viewController()
    self.addChildViewController(vc)
    return vc
}()    

// Methods
override func viewDidLoad() {
    super.viewDidLoad()
    self.setupView()
}

//------------------------------------------------------------------------------

func setupView() {

    self.previousViewController = self.topSalesVC
    self.add(asChildViewController: self.topSalesVC)
}

//------------------------------------------------------------------------------

private func add(asChildViewController viewController: UIViewController) {

    self.addChildViewController(viewController)
    self.containerView.addSubview(viewController.view)

    viewController.view.frame = self.containerView.bounds
    viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    viewController.didMove(toParentViewController: self)
}

//------------------------------------------------------------------------------

private func remove(asChildViewController viewController: UIViewController) {
    viewController.willMove(toParentViewController: nil)
    viewController.view.removeFromSuperview()
    viewController.removeFromParentViewController()
}

这段代码可以在视图加载时使用,但是当我更改选择器视图控制器的行并点击“完成”按钮时,它没有任何反应。

现在我选择了选择器视图的代码如下:

override func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    self.selectedIndex = row
}

我在选择器视图的工具栏中有一个“完成”按钮。因此,当我点击它时,它会执行以下代码:

@IBAction func btnDoneClicked(_ sender: UIBarButtonItem) {

    BaseVC.isPickerOpen = false

    self.showPicker(false) { (success) in

        if self.previousViewController != nil {
            self.remove(asChildViewController: self.previousViewController!)
        }

        switch self.selectedIndex {

        case 0:
            .....
            .....
            break

        case 1:
            .....
            .....
            break

        case 2:
            .....
            .....
            break

        case 3:
            .....
            .....
            break

        case 4:
            self.topSalesVC.salesBy = .invoiceByCustomer
            self.previousViewController = self.topSalesVC
            self.add(asChildViewController: self.topSalesVC)
            break

        case 5:
            self.topSalesVC.salesBy = .invoiceByUser
            self.previousViewController = self.topSalesVC
            self.add(asChildViewController: self.topSalesVC)
            break

        case 6:
            self.topSalesVC.salesBy = .supplier
            self.previousViewController = self.topSalesVC
            self.add(asChildViewController: self.topSalesVC)
            break

        case 7:
            self.topSalesVC.salesBy = .manufacturer
            self.previousViewController = self.topSalesVC
            self.add(asChildViewController: self.topSalesVC)
            break

        case 8:
            self.topSalesVC.salesBy = .masterProduct
            self.previousViewController = self.topSalesVC
            self.add(asChildViewController: self.topSalesVC)
            break

        case 9:
            self.topSalesVC.salesBy = .user
            self.previousViewController = self.topSalesVC
            self.add(asChildViewController: self.topSalesVC)
            break

        case 10:
            self.topSalesVC.salesBy = .customer
            self.previousViewController = self.topSalesVC
            self.add(asChildViewController: self.topSalesVC)
            break

        case 11:
            self.topSalesVC.salesBy = .customerTag
            self.previousViewController = self.topSalesVC
            self.add(asChildViewController: self.topSalesVC)
            break

        default:
            break
        }
    }
}

使用上述方法,对于使用相同视图控制器的案例4到11,只需更改其变量值并将其添加到容器视图即可。
我的问题是,当我更改选择器视图值以刷新单个视图控制器的数据时,它对我的视图控制器没有影响。显示相同的数据和初始状态。
我已经检查了TopSalesVC,那里的代码完全正常。因此,TopSalesVC的代码没有问题。
请帮我解决这个问题。

1
在相应的位置设置一个断点,检查你的 childViewControllerviewDidLoad 是否被调用。 - iPeter
2
willAppear 是否被调用了? - iPeter
3
您的代码中有太多重复的部分。创建一个函数,将salesBy作为参数传递,并在switch语句中的每个情况下调用它。 - Prashant Tukadiya
3
改进2:创建salesBy枚举属性,而不是selectedIndex。并为每个枚举项(如masterProduct、users等)创建一个case语句。这样的代码更易读。 - Prashant Tukadiya
1
@PrashantTukadiya,感谢您提供更好的解决方案,但是我已经更新了我的代码以删除冗余代码,在我发布问题时就已经得到了。 :) - Sagar Chauhan
显示剩余6条评论
1个回答

5
尝试在viewWillAppear中调用您的childViewController的refresh方法,而不是在viewDidLoad中调用,因为将其添加为childViewController时,viewDidLoad不会被调用。

希望这可以帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接