当用户在详细的视图控制器中触发```back)''时触发功能



当用户返回到该VC时,我需要刷新我的收集视图,因为他/她在detailVC中所做的事情影响了先前的VC数据。我在viewDidLoad()VCviewDidAppear()中尝试了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添加IBActionpop您的"详细信息视图控制器"。

就在进行此操作之前,您应该创建一个将在弹出发生之前将执行的委托,该委托将重新加载您的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中,请记住将详细信息视图控制器的代表设置为您的第一个视图控制器

最新更新