在容器视图中刷新单视图控制器
Refresh Single View Controller in Container View
我需要通过向其传递变量值来刷新容器视图中的单个视图控制器。我有一个故事板,其中包含一个带有容器视图的视图控制器。见下图:
公司用户的总销售额 正在通过选择器视图控制器进行更改,这意味着它将为不同的数据刷新我的视图控制器。
现在,我使用以下代码以编程方式将我的视图控制器添加到 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都是使用同一个view controller,只是改变了它的变量值,添加到container view中。
所以我的问题是,当我更改选择器视图值以刷新单个视图控制器的数据时,它对我的视图控制器没有影响。显示相同的数据和初始状态。
我检查了 TopSalesVC,那里的代码工作得非常好。所以TopSalesVC的代码没有问题。
请帮我解决这个问题。
尝试从 viewWillAppear
而不是 viewDidLoad
调用 childViewController 的刷新方法,因为 viewDidLoad
在添加为 childViewController
时不会被调用。
希望这对您有所帮助。
我需要通过向其传递变量值来刷新容器视图中的单个视图控制器。我有一个故事板,其中包含一个带有容器视图的视图控制器。见下图:
公司用户的总销售额 正在通过选择器视图控制器进行更改,这意味着它将为不同的数据刷新我的视图控制器。
现在,我使用以下代码以编程方式将我的视图控制器添加到 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都是使用同一个view controller,只是改变了它的变量值,添加到container view中。
所以我的问题是,当我更改选择器视图值以刷新单个视图控制器的数据时,它对我的视图控制器没有影响。显示相同的数据和初始状态。
我检查了 TopSalesVC,那里的代码工作得非常好。所以TopSalesVC的代码没有问题。
请帮我解决这个问题。
尝试从 viewWillAppear
而不是 viewDidLoad
调用 childViewController 的刷新方法,因为 viewDidLoad
在添加为 childViewController
时不会被调用。
希望这对您有所帮助。