【问题标题】:Refresh Single View Controller in Container View在容器视图中刷新单个视图控制器
【发布时间】:2019-06-15 13:23:56
【问题描述】:

我需要帮助通过将变量值传递给容器视图中的单个视图控制器来刷新它。我有一个故事板,其中包含一个带有容器视图的视图控制器。见下图:

公司用户的总销售额正在由选择器视图控制器更改,这意味着它将刷新我的视图控制器以获取不同的数据。

现在,我使用以下代码以编程方式将我的视图控制器添加到 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()
}

此代码适用于视图加载时,但是当我更改选择器视图控制器行并单击“完成”按钮时,它什么也不做。

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

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的代码没有问题。

请帮我解决这个问题。

【问题讨论】:

  • 放置断点并检查您的childViewController's viewDidLoad 是否被调用。
  • 那么您的refresh 将无法正常工作吗?尝试使用removeFromParent,然后再次将其添加为 childViewController。
  • willAppear 被调用了吗?
  • @SagarChauhan 你的重复代码太多了。创建函数并将参数作为salesBy 传递,并为每个案例调用它以进行切换
  • 改进2:创建salesBy Enum 属性而不是selectedIndex。并为每个枚举案例(如 masterProduct、users 等)创建案例。这是更具可读性的代码

标签: ios swift uicontainerview


【解决方案1】:

尝试从viewWillAppear而不是viewDidLoad调用childViewController的刷新方法,因为viewDidLoad在添加为childViewController时不会被调用。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2013-03-31
    • 2016-09-02
    • 2016-07-28
    • 2018-04-02
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2017-09-17
    相关资源
    最近更新 更多