导航回来时UICollection View没有重新加载?

时间:2017-07-20 10:12:38

标签: ios swift uicollectionview

我需要在导航回特定视图时重新加载集合视图。

我尝试实施以下所有内容但不起作用

1.在viewDidAppear()中调用self.collectionView.reloadData()

2.在viewWillAppear()中调用self.collectionView.reloadData()

  1. 即使我尝试在viewDidAppear中调用viewDidLoad(),但它仍无效。
  2. 并检查了其他相同类型的问题,但它不起作用...... 它唯一有效的方法是通过执行segue动作,但我不这么认为这样有效可以有人建议我任何想法吗?

    enter code here class RoomDeviceListVC: UIViewController , UICollectionViewDelegate , UICollectionViewDataSource , UICollectionViewDelegateFlowLayout ,segueAction{
    
    let functions = DataFunctionalities()
    @IBOutlet weak var collectionView1: UICollectionView!
    @IBOutlet weak var collectionView2: UICollectionView!
    var horizontalBarLeadingConstraint : NSLayoutConstraint?
    static var isVisible : Bool?
    static var CollectionViewSection : Int!
    
    static var reloadFlag : Int!
    
    static var delegates : CollectionViewRotation? = nil
    
    var uiFunctions  = UIFunctions()
    var selectedIndex =  IndexPath(item: 0, section: 0)
    var constant : CGFloat?
    let headerView = UIView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        uiFunctions.setViewBackground(view: self.view)
        self.navigationItem.hidesBackButton = true
    
        setupHeader()
        setupConstraints()
        setupHorizontalBar()
        collectionView2.clipsToBounds = true
        RoomDeviceListVC.CollectionViewSection = selectedIndex.section
        BottomViewRoomCell.delegates = self
    
    
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
       //  self.collectionView2.reloadData() 
    
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        self.collectionView2.reloadData()
        RoomDeviceListVC.isVisible = true
    
    }
    
    override func viewDidDisappear(_ animated: Bool) {
           RoomDeviceListVC.isVisible = false
    }
    
    func setupHorizontalBar(){
        let horizontalBar = UIView()
        self.view.addSubview(horizontalBar)
        horizontalBar.translatesAutoresizingMaskIntoConstraints = false
        horizontalBar.backgroundColor = .white
        horizontalBarLeadingConstraint = horizontalBar.leadingAnchor.constraint(equalTo: collectionView2.leadingAnchor)
        horizontalBarLeadingConstraint?.isActive = true
        horizontalBar.heightAnchor.constraint(equalToConstant: 3).isActive = true
        NSLayoutConstraint(item: horizontalBar, attribute: .width, relatedBy: .equal, toItem: collectionView1, attribute: .width, multiplier: 0.5, constant: 1).isActive =  true
        horizontalBar.bottomAnchor.constraint(equalTo: collectionView2.topAnchor).isActive = true
    
    }
    
    
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 2
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 1
    }
    
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    
        let menuName = ["Rooms" , "DeviceList"]
        let color :[UIColor] = [.green , .blue]
    
    
        if collectionView == collectionView1{
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MenuBarCell", for: indexPath) as! MenuBarCell
            cell.menuLabel.text = menuName[indexPath.section]
            cell.menuLabel.textColor = UIColor.darkGray
    
            DispatchQueue.main.async {
                self.collectionView1.selectItem(at: self.selectedIndex, animated: false, scrollPosition: .centeredHorizontally)
            }
            return cell
    
        }
        else {
            if indexPath.section == 0{
                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "BottomViewRoomCell", for: indexPath) as! BottomViewRoomCell
                cell.backgroundColor  = .clear
                cell.layer.cornerRadius = 9
                cell.layer.masksToBounds = true
                return cell
            }
            else{
                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "BottomViewDeviceCell", for: indexPath) as! BottomViewDeviceCell
                cell.backgroundColor  = .clear
                cell.layer.cornerRadius = 9
                cell.layer.masksToBounds = true
                return cell
            }
        }
    
    }
    
    
    public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize{
    
        if collectionView  == collectionView1{
            return CGSize(width: self.view.frame.width / 2, height: collectionView1.frame.height)
        }
        else{
            return CGSize(width: self.view.frame.width, height: collectionView2.frame.height)
        }
    
    }
    

1 个答案:

答案 0 :(得分:0)

您可以使用UINavigationControllerDelegate来处理这种情况。

添加UINavigationControllerDelegate,将self签名到collectionView的navigationController的委托,然后将你的个人功能放在" willShow / didShow"委托方法。当您弹回collectionView时,将调用您的个人功能。

关于单元格显示的一些方法未显示

class HomeCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout, UINavigationControllerDelegate{
    private let cellId = "cellId"

    override func viewDidLoad() {
        super.viewDidLoad() 

    //  sign navigationController's delegate to collectionViewController itself.
        navigationController?.delegate = self
    }

    // push view controller when cell is selected
    override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let vc = CustomViewController()
        navigationController?.pushViewController(vc, animated: true)
    }

    //  call your personal function when this collection view controller shows back
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController == self {
            print("will show self")
        }
    }

    func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
        if viewController == self {
            print("did show self")
        }
    }
}