当用户在详细视图控制器中点击“返回”时触发一个功能

时间:2016-11-28 15:44:20

标签: ios swift uinavigationcontroller segue

当用户返回VC时,我需要刷新我的collectionView,因为他/她在detailVC中所做的事情会影响之前的VC数据。我在我collectionView.reloadData()的{​​{1}}和viewDidLoad()viewDidAppear()尝试了VC。而且当用户点击collectionView 'Back'时,detailVCviewDidLoad()都无法正常工作。所以,我尝试在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()将起作用),删除的标签似乎未被选中。这就是全部。

1 个答案:

答案 0 :(得分:1)

如果你要找的只是重新加载后退按钮

您可以创建自己的自定义UIBarButtonItem,使您可以从“详细视图控制器”向后导航。添加自己的后退按钮后应该执行的操作是为IBActionUIBarBUttonItem“详细视图控制器”添加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中,记得将详细视图控制器的委托设置为第一个视图控制器