我已经创建了一个与carName
的集合视图,其中有5个,点击后,例如Mercedes
(集合视图的单元格之一)我想设置标签文本自己的值:carModel
(carName和carModel都是相同的结构属性)在表视图已经由我创建,但我不能访问carModel
数组
我尝试for循环,但它返回一个错误
for i in cars.carModel {
lbl.text = cars.carModel[i]
}
任何解决方案都将受到欢迎
//数据源文件
struct Cars {
let carName:String
let carModel:[String]
}
let cars:[Cars] = [
Cars(carName: "Mercedes", carModel: ["S Class","A Class", "B Class"]),
Cars(carName: "BMW", carModel: ["X5","X6","X7"]),
Cars(carName: "Ford", carModel: ["Fuison","Focus","Mustang"]),
Cars(carName: "Toyota", carModel: ["Camry", "Corolla"]),
Cars(carName: "Hyundai", carModel: ["Elantra"])
]
//表视图单元格文件
class TableViewCell: UITableViewCell {
@IBOutlet var lbl: UILabel!
func configure(with cars:Cars){
lbl.text = cars.carName
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
}
//mainviewcontroller
class ViewController: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!
//@IBOutlet weak var tableView
override func viewDidLoad() {
super.viewDidLoad()
collectionView.dataSource = self
collectionView.delegate = self
}
}
extension ViewController: UICollectionViewDataSource{
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return cars.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as? CollectionViewCell
cell?.setup(with: cars[indexPath.row])
return cell!
}
}
extension ViewController:UICollectionViewDelegate,UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let vc = storyboard?.instantiateViewController(identifier: "TableViewController") as? TableViewController
self.navigationController?.pushViewController(vc!, animated: true)
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:TableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
cell.configure(with: cars[indexPath.row])
return cell
}
}
这是我的模拟器:img1img2
我想要的:预期结果img
当你定义UITableViewDataSource
时,你在函数方法中设置行数以返回常量(5)。在cellForRowAt
函数中,你用Cars
对象设置单元格。
我认为你混淆了什么数据应该用于表视图的数据源。
对于集合视图数据源,您必须:
-
section函数应该返回的行数:
cars.count
-
函数项的单元格必须用
Cars
实例配置CollectionViewCell
我认为你所缺少的是保存在集合视图中选择的单元格,以使用它向表视图提供正确的数据。
在集合视图委托中,当用户点击一个单元格时,你可以保存选定的indexPath或Cars
实例,这将被表视图委托使用。我们叫它selectedCar
。
对于表视图数据源你必须:
-
section函数应该返回的行数:
selectedCar.carModel.count
-
Cell for item atfunction必须配置TableViewCell与
CarModel
实例(这是一个String
)
我在Github中创建了一个小项目作为示例,正在按预期工作。看看吧。希望这对你有所帮助。示例视频在Youtube.
注意:在ViewController中为tableView或collectionView设置数据源和委托并不是组织代码的最佳方式,但对于示例代码是可以的。