当用户返回VC
时,我需要刷新我的collectionView,因为他/她在detailVC
中所做的事情会影响之前的VC数据。我在我collectionView.reloadData()
的{{1}}和viewDidLoad()
中viewDidAppear()
尝试了VC
。而且当用户点击collectionView
'Back'
时,detailVC
和viewDidLoad()
都无法正常工作。所以,我尝试在viewDidAppear()
中调用其中一个,并实例化detailVC
(具有firstVC
)
然后我得到一个运行时错误,说collectionView
。有什么想法吗? (顺便说一下,它们之间的区别是collectionView is nil
,我无法改变它,因为我必须在我的应用程序中转换此segue。)
这是第一个VC:
ShowPush
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
数据库中。
这是detailVC:
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
他/她可以删除所选标签。正如你所看到的,它在领域中不断变化。如果用户在detailVC
中删除了某些代码并按下Back
按钮,则问题仍会在SkillsVC
中显示为已选中。但是,如果用户转到另一个VC并返回SkillsVC
(通过这种方式,viewDidLoad()将起作用),删除的标签似乎未被选中。这就是全部。
答案 0 :(得分:1)
如果你要找的只是重新加载后退按钮
您可以创建自己的自定义UIBarButtonItem
,使您可以从“详细视图控制器”向后导航。添加自己的后退按钮后应该执行的操作是为IBAction
和UIBarBUttonItem
“详细视图控制器”添加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,根本不需要担心后退按钮而节省麻烦,我强烈推荐这种方法)
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
中,记得将详细视图控制器的委托设置为第一个视图控制器