показать и скрыть две xibs в одном контроллере вида при нажатии соответствующей кнопки в ios swift - PullRequest
0 голосов
/ 13 июня 2019

У меня есть контроллер вида, в котором я сделал вид, и в этом виде у меня есть две кнопки, а под этим видом у меня есть вид коллекции. У меня есть 2 пользовательских XIB для каждого соответствующего нажатия кнопки. по умолчанию для кнопки 1 я установил xib 1, но когда я нажимаю кнопку 2, то не знаю, как отобразить xib 2

результат скриншота для кнопки 1: screenshot for categories button

результат скриншота для кнопки 2: screenshot for stores button

скриншот для категории xib: [screenshot for category xib

скриншот для магазина xib: screenshot for store xib

мой код в файле контроллера вида:

class CategoryViewController: UIViewController {

    @IBOutlet weak var store_bar: UIViewX!
    @IBOutlet weak var store_title: UIButton!
    @IBOutlet weak var category_title: UIButton!
    @IBOutlet weak var category_bar: UIViewX!

    @IBOutlet weak var categoryColView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // register collectionview cell
        self.categoryColView.register(UINib(nibName: "CategoryCell1", bundle: nil), forCellWithReuseIdentifier: "CategoryCell1")
        self.categoryColView.register(UINib(nibName: "StoresCell", bundle: nil), forCellWithReuseIdentifier: "StoresCell")

        self.store_bar.isHidden = true

    }

    @objc func click_Category(sender: UIButton!) {
        UIView.animate(withDuration: 1.0) {
            sender.isSelected = !sender.isSelected
        }
    }

    @IBAction func storeData(_ sender: UIButton) {
        self.categoryColView.isHidden = true
        self.store_bar.isHidden = false
        self.store_title.setTitleColor(UIColor.black, for: .normal)
        self.category_bar.isHidden = true
        self.category_title.setTitleColor(UIColor(rgb: 0xAAAAAA), for: .normal)
    }

    @IBAction func categoriesData(_ sender: UIButton) {
        self.categoryColView.isHidden = false
        self.store_bar.isHidden = true
        self.category_title.setTitleColor(UIColor.black, for: .normal)
        self.category_bar.isHidden = false
        self.store_title.setTitleColor(UIColor(rgb: 0xAAAAAA), for: .normal)
    }
}




extension CategoryViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 20
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CategoryCell1", for: indexPath) as! CategoryCell1
            cell.btn_click.tag = indexPath.row
            cell.btn_click.setImage(#imageLiteral(resourceName: "image_unchecked"), for: .normal)
            cell.btn_click.setImage(#imageLiteral(resourceName: "image_checked"), for: .selected)
            cell.btn_click.addTarget(self, action: #selector(self.click_Category), for: .touchUpInside)
            return cell

    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

           return CGSize(width: (UIScreen.main.bounds.width) / 3, height: 93)
        }
}

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Это произошло потому, что вы удаляете из очереди только «CategoryCell1» в вашем collectionView.

Одна вещь, которую вы можете сделать, это создать Enum, например: TypeCells

enum TypeCells {
 case categorie
 case store
}

Затем вы можете в вашем контроллере инициализировать переменную, например:

var typeCell: TypeCells = .categorie

Затем в вашем IBAction вы можете изменить свою переменную, например:

@IBAction func storeData(_ sender: UIButton) {
        typeCell = .data
        collectionView.reloadData()
    }

А дальше нужно просто:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    switch typeCell {
     case categorie:
                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CategoryCell1", for: indexPath) as! CategoryCell1
    // what you want to display

     case storie:
                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "StoresCell", for: indexPath) as! CategoryCell1
    // what you want to display

    }

Веселись! :)

0 голосов
/ 13 июня 2019

Не скрывайте метод categoryColView in storeData

Измените свойство isSelected кнопок category_title, store_title при выделении и перезагрузите представление коллекции.

class CategoryViewController: UIViewController {
    @IBOutlet weak var store_bar: UIViewX!
    @IBOutlet weak var store_title: UIButton!
    @IBOutlet weak var category_title: UIButton!
    @IBOutlet weak var category_bar: UIViewX!
    @IBOutlet weak var categoryColView: UICollectionView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // register collectionview cell
        self.categoryColView.register(UINib(nibName: "CategoryCell1", bundle: nil), forCellWithReuseIdentifier: "CategoryCell1")
        self.categoryColView.register(UINib(nibName: "StoresCell", bundle: nil), forCellWithReuseIdentifier: "StoresCell")
        storeData(store_title)
    }
    @objc func click_Category(sender: UIButton!) {
        UIView.animate(withDuration: 1.0) {
            sender.isSelected = !sender.isSelected
        }
    }
    @IBAction func storeData(_ sender: UIButton) {
        category_title.isSelected = false
        store_title.isSelected = true
        self.categoryColView.isHidden = true
        self.store_bar.isHidden = false
        self.store_title.setTitleColor(UIColor.black, for: .normal)
        self.category_bar.isHidden = true
        self.category_title.setTitleColor(UIColor(rgb: 0xAAAAAA), for: .normal)
        self.categoryColView.reloadData()
    }
    @IBAction func categoriesData(_ sender: UIButton) {
        category_title.isSelected = true
        store_title.isSelected = false
        self.categoryColView.isHidden = false
        self.store_bar.isHidden = true
        self.category_title.setTitleColor(UIColor.black, for: .normal)
        self.category_bar.isHidden = false
        self.store_title.setTitleColor(UIColor(rgb: 0xAAAAAA), for: .normal)
        self.categoryColView.reloadData()
    }
}

В представлении сбора данных источники данных и методы делегата проверяют статус isSelected кнопок category_title, store_title и выполняют действия на его основе.

extension CategoryViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
//        if category_title.isSelected {
//            return category count
//        } else {
//            return store count
//        }
        return 20
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if category_title.isSelected {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CategoryCell1", for: indexPath) as! CategoryCell1
            cell.btn_click.tag = indexPath.row
            cell.btn_click.setImage(#imageLiteral(resourceName: "image_unchecked"), for: .normal)
            cell.btn_click.setImage(#imageLiteral(resourceName: "image_checked"), for: .selected)
            cell.btn_click.addTarget(self, action: #selector(self.click_Category), for: .touchUpInside)
            return cell
        } else {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "StoresCell", for: indexPath) as! StoresCell
            //...
            return cell
        }
    }
}
...