在 UIcollectionView 的 didSelect 上更改 tableviewHeader
Change tableviewHeader on didSelect of UIcollectionView
我有 2 个 ViewController,FirstViewController
和 SecondViewController
。
第一个包含 UITableView
,另一个包含 UICollectionView
和 headerViews。
假设我有 2 个 UITableView
headers、DefaultHeaderView 和 SelectedHeaderView,那么我要实现什么?
我想要实现的是,当 SecondViewController
didSelect
中的 UICollectionView
被点击时,我想要 FirstViewController
的 UITableView
change/replace 它的 DefaultHeaderView
和 SelectedHeaderView
.
但是,到目前为止我所尝试的方法似乎不起作用或者根本不是正确的方法。
我已经在 FirstViewController
中声明了这个变量以确定是否需要更改并重新加载 tableView:
var isNewHeader = false {
didSet {
tableVIew.reloadData()
}
这是我的 tableView
viewForHeaderInSection
方法:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let defaultHeader = tableView.dequeueReusableHeaderFooterView(withIdentifier: DefaultHeaderView.identifier) as! DefaultHeaderView
let selectedHeader = tableView.dequeueReusableHeaderFooterView(withIdentifier: SelectedHeaderView.identifier) as! SelectedHeaderView
if (isNewHeader) {
return selectedHeader
} else {
// defaultHeader is set as the default value.
return defaultHeader
}
}
创建后,在 SecondViewController
的 UICollectionView
s didSelectItem
方法中,我试图将 isNewHeader
设置为 true
并获得 FirstViewController
到 return 替换的 headerView。
extension SecondViewController: UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if let vc = storyboard?.instantiateViewController(withIdentifier: "FirstViewController") as? FirstViewController {
//** Here, I am getting `nil` return value for tableView in `FirstViewController`
which actually is obvious.
vc.isNewHeader = true
self.navigationController?.popViewController(animated: true)
}
}
}
有没有更好的方法?
instantiateViewController
使用指定的标识符创建视图控制器,并使用情节提要中的数据对其进行初始化。您可以通过比较实例来简单地检查它
当您使用 navigationController?.popViewController(animated: true)
时,我假设 FirstViewController
是 navigationController
的根
您可以使用 if let vc = navigationController?.viewControllers.first as? FirstViewController
我有 2 个 ViewController,FirstViewController
和 SecondViewController
。
第一个包含 UITableView
,另一个包含 UICollectionView
和 headerViews。
假设我有 2 个 UITableView
headers、DefaultHeaderView 和 SelectedHeaderView,那么我要实现什么?
我想要实现的是,当 SecondViewController
didSelect
中的 UICollectionView
被点击时,我想要 FirstViewController
的 UITableView
change/replace 它的 DefaultHeaderView
和 SelectedHeaderView
.
但是,到目前为止我所尝试的方法似乎不起作用或者根本不是正确的方法。
我已经在 FirstViewController
中声明了这个变量以确定是否需要更改并重新加载 tableView:
var isNewHeader = false {
didSet {
tableVIew.reloadData()
}
这是我的 tableView
viewForHeaderInSection
方法:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let defaultHeader = tableView.dequeueReusableHeaderFooterView(withIdentifier: DefaultHeaderView.identifier) as! DefaultHeaderView
let selectedHeader = tableView.dequeueReusableHeaderFooterView(withIdentifier: SelectedHeaderView.identifier) as! SelectedHeaderView
if (isNewHeader) {
return selectedHeader
} else {
// defaultHeader is set as the default value.
return defaultHeader
}
}
创建后,在 SecondViewController
的 UICollectionView
s didSelectItem
方法中,我试图将 isNewHeader
设置为 true
并获得 FirstViewController
到 return 替换的 headerView。
extension SecondViewController: UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if let vc = storyboard?.instantiateViewController(withIdentifier: "FirstViewController") as? FirstViewController {
//** Here, I am getting `nil` return value for tableView in `FirstViewController`
which actually is obvious.
vc.isNewHeader = true
self.navigationController?.popViewController(animated: true)
}
}
}
有没有更好的方法?
instantiateViewController
使用指定的标识符创建视图控制器,并使用情节提要中的数据对其进行初始化。您可以通过比较实例来简单地检查它
当您使用 navigationController?.popViewController(animated: true)
时,我假设 FirstViewController
是 navigationController
您可以使用 if let vc = navigationController?.viewControllers.first as? FirstViewController