当用户返回到该VC
时,我需要刷新我的收集视图,因为他/她在detailVC
中所做的事情影响了先前的VC数据。我在viewDidLoad()
和VC
的viewDidAppear()
中尝试了collectionView.reloadData()
,其中包含collectionView
。出现的是,当用户在detailVC
中敲击'Back'
时,viewDidLoad()
和viewDidAppear()
都无法使用。因此,我尝试使用firstVC
中的detailVC
打电话给其中一个(具有collectionView
)然后我遇到了一个运行时错误,说collectionView is nil
。有什么想法吗?(顺便说一句,它们之间的segue是ShowPush
,我无法更改它,因为我必须在应用程序中过渡。)
这是第一vc:
class SkillsController: UIViewController{
@IBOutlet weak var collectionView: UICollectionView!
var TAGS: [TAG] = []
override func viewDidLoad() {
super.viewDidLoad()
let nib = UINib(nibName: "TagCell", bundle: nil)
collectionView.register(nib, forCellWithReuseIdentifier: "tagCell")
self.sizingCell = (nib.instantiate(withOwner: nil, options: nil) as NSArray).firstObject as! TagCell?
self.loadMore()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("back to skills")
self.TAGS = TagManager.shared.tagList
collectionView.reloadData()
}
}
TAGS
是我的数据,该数据存储在Realm
数据库中。
这是详细信息:
class SeeSelectedController: UICollectionViewController {
var TAGS: [TAG] = []
@IBOutlet weak var layout: FSQCollectionViewAlignedLayout!
override func viewDidLoad() {
super.viewDidLoad()
if currentTab.shared.isSkill {
self.title = "Selected Skills"
//init tags
let list = RealmManager.shared.skills
if let list = list {
for element in list {
TAGS.append(TAG(n: element.value!, iS: true))
}
}
collectionView?.reloadData()
}else{
self.title = "Selected Needs"
//init tags
let list = RealmManager.shared.needs
if let list = list {
for element in list {
TAGS.append(TAG(n: element.value!, iS: true))
}
}
collectionView?.reloadData()
}
let nib = UINib(nibName: "TagCell", bundle: nil)
collectionView?.register(nib, forCellWithReuseIdentifier: "tagCell")
}
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let item = TAGS[indexPath.row].name!
let currentState = TAGS[indexPath.row].isSelected!
TAGS[indexPath.row].isSelected = currentState ? false:true
if currentState {
print("deselect")
//remove from realm
RealmManager.shared.deleteItemFromList(type: getTypeOfTag(isSkill: currentTab.shared.isSkill), item: item)
}else{
print("select")
//add to realm
RealmManager.shared.addItemToList(type: getTypeOfTag(isSkill: currentTab.shared.isSkill), item: item)
}
if currentTab.shared.isSkill {
let VC: SkillsController = storyboard?.instantiateViewController(withIdentifier: "SkillsController") as! SkillsController
VC.viewDidAppear(true)
}
collectionView.reloadData()
//addd
}
}
那么它是如何工作的?在SkillsVC
中,用户可以从池中选择一些标签,在detailVC
中,即SeeSelecteVC
HE/她可以丢弃选定的标签。如您所见,它正在不断变化。当用户在detailVC
中删除某些标签并按下Back
按钮时,问题时,掉落的标签仍在SkillsVC
中所选择。但是,如果用户获得另一个VC并返回SkillsVC
(这样,ViewDidload()将可以使用),则似乎未选择丢弃的标签。就这样。
如果您要寻找的内容只是在Back Button上重新加载
您可以做的是创建自己的自定义UIBarButtonItem
,这将使您从"详细信息视图控制器"向后导航。添加自己的后背按钮后接下来要做的是为UIBarBUttonItem
添加IBAction
和pop
您的"详细信息视图控制器"。
就在进行此操作之前,您应该创建一个将在弹出发生之前将执行的委托,该委托将重新加载您的UICollectionView
。
以下不是实现所需目标的最佳方法:在您的第二视图控制器的didSelectItem
中,您在此处创建一个新的视图控制器,您不应强制调用viewDidAppear
。由于您正在创建一个新的UIViewController
,因此您没有引用您来自的先前UIViewController
,而您的UICollectionView
是零。
if currentTab.shared.isSkill {
//remove the below lines and call the delegate here
let VC: SkillsController = storyboard?.instantiateViewController(withIdentifier: "SkillsController") as! SkillsController
VC.viewDidAppear(true)
}
collectionView.reloadData()
您应该做的是:您应该使用委托将回调发送到先前的视图控制器或执行操作。创建委托 -
使用第一种方法(使用您自己的后退按钮) -
protocol delegateVC{
func reloadCollectionView()
}
class SeeSelectedController: UICollectionViewController{
//add this inside this class
var delegate : delegateVC?
...
//implement your IBAction for back button and inside it-
... {
self.delegate.reloadCollectionView()
}
}
或我指出的第二种方法(只需更改您的didSelectItem
,它将重新加载CollectionView,无需烦恼BAIX按钮并节省麻烦,我强烈建议这种方法)<)
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let item = TAGS[indexPath.row].name!
let currentState = TAGS[indexPath.row].isSelected!
TAGS[indexPath.row].isSelected = currentState ? false:true
if currentState {
print("deselect")
//remove from realm
RealmManager.shared.deleteItemFromList(type: getTypeOfTag(isSkill: currentTab.shared.isSkill), item: item)
}else{
print("select")
//add to realm
RealmManager.shared.addItemToList(type: getTypeOfTag(isSkill: currentTab.shared.isSkill), item: item)
}
if currentTab.shared.isSkill {
self.delegate.reloadCollectionView()
}
}
}
,在您的第一个视图控制器中 -
func reloadCollectionView(){
collectionView.reloadData()
}
注意:在您的prepareForSegue
中,请记住将详细信息视图控制器的代表设置为您的第一个视图控制器