у меня есть контроллер представления, в котором я принял представление, и в этом представлении у меня есть две кнопки, а под этим представлением у меня есть представление коллекции. я создал 2 пользовательских xib для каждого соответствующего нажатия кнопки. по умолчанию для кнопки 1 я установил xib 1, но когда я нажимаю кнопку 2, я не знаю, как показать xib 2
результат скриншота для кнопки 1:
результат скриншота для кнопки 2:
скриншот для категорий 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)
}
}
Да, мой контент должен измениться
Не прячьте метод categoryColView
в 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
}
}
}
Это произошло потому, что вы удаляете из очереди только "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
}
Повеселись ! :)
Просто чтобы уточнить, хотите ли вы изменить содержимое представления коллекции при переключении между категориями и магазинами?