gpt4 book ai didi

ios - 如何访问 tableView 内部集合中的 ViewController 类变量和函数

转载 作者:行者123 更新时间:2023-11-28 10:03:16 25 4
gpt4 key购买 nike

我有一个嵌入了 tableViewViewController 类,我在其中创建了两个 cells

首先:

class CategoryTableViewCell: UITableViewCell {

//MARK:- IBOUTLETS
//MARK:-
@IBOutlet weak var collectionView: UICollectionView!

var categoryArray: [PopularCategories]! {
didSet {
self.collectionView.reloadData()
}
}

override func awakeFromNib() {
super.awakeFromNib()

collectionView.delegate = self
collectionView.dataSource = self
}

override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: true)
}

}

我在其中创建了一个 CollectionViewCell。在我的第二个 TableViewCell 类中,我重新加载 来自 apidata

这是 TableViewCell 类中的 collectionView 代码

extension CategoryTableViewCell: UICollectionViewDataSource, UICollectionViewDelegate {

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

return categoryArray.count
}


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

guard let cell = self.collectionView.dequeueReusableCell(withReuseIdentifier: "CatergoriesCollectionViewCell", for: indexPath) as? CatergoriesCollectionViewCell else {
return UICollectionViewCell()
}
cell.nameLabel.text = categoryArray[indexPath.item].name
cell.image.sd_setImage(with: URL(string: categoryArray[indexPath.item].image ), placeholderImage: UIImage(named: "placeholderSmall"))
return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

let cell = self.collectionView.dequeueReusableCell(withReuseIdentifier: "CatergoriesCollectionViewCell", for: indexPath) as! CatergoriesCollectionViewCell
collectionCellTapHandler?()
let id = categoryArray[indexPath.item].id
self.categroyID = id
controller.categoryId = id
controller.filterDataUsingMostPopularCategory(id: id, lat: Latitude, long: Longitude)
print("Here I can access my view controller....\(controller.categoryId)")
print(cell.nameLabel.text!, id)
}
}


}

现在,我需要在选择 collectionView cell 项时调用 ViewController 中的函数。这是我的 ViewController 类文件中的函数,我想在选择 collectionViewCell 时访问

class OneStopShopVC: TruckerConveyBaseVC {

func searchDataFromFilteredApi() {

let param: [String : Any] = ["lat": self.latitude, "lng": self.longitude, "title": selectedTitle, "category": "\(selectedCategory)"]
print(param)
CommonUtils.showHudWithNoInteraction(show: true)

Alamofire.request(Constants.BASE_URL+"search_home_ads.php", method: .post, parameters: param, encoding: URLEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

CommonUtils.showHudWithNoInteraction(show: false)
switch(response.result) {
case .success(_):
if let json = response.result.value as? [String:Any] {
print(json)
if let ads_list = json["ads_list"] as? [[String:Any]] {
self.adsListModel.removeAll()
let response = kSharedInstance.getArray(withDictionary: ads_list)
print(response)
self.adsListModel = response.map{ AdsListModel(with: $0) }
}
DispatchQueue.main.async {
self.reloadList()
}
}

break

case .failure(_):
print("Error")
break

}
}
}
}

这是 UITableViewDataSource 和 Delegate 中的代码

extension OneStopShopVC : UITableViewDataSource, UITableViewDelegate {

func numberOfSections(in tableView: UITableView) -> Int {
return 2
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 {
return 1
} else {
return Int.getInt(self.adsListModel.count)
}
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section == 0 {
return 181
} else {
return 121
}
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return cellConfig(indexPath)
}

private func cellConfig(_ indexpath : IndexPath) -> UITableViewCell {

if indexpath.section == 0 {

guard let cell = oneStopShopTableView.dequeueReusableCell(withIdentifier: CategoryTableViewCell.cellIdentifier()) as? CategoryTableViewCell else {
return UITableViewCell()
}
cell.categoryArray = popularCategories

cell.collectionCellTapHandler = {[weak self] in
self?.filterDataUsingMostPopularCategory(id: cell.categroyID, lat: Latitude, long: Longitude)
}

cell.collectionView.reloadData()
return cell
}
else {

let cell = oneStopShopTableView.dequeueReusableCell(withIdentifier: OneStopShopTableCell.cellIdentifier()) as! OneStopShopTableCell
cell.lblPostTitle.text = String.getString(self.adsListModel[indexpath.row].post_title)
cell.lblPostedDate.text = String.getString(self.adsListModel[indexpath.row].posted_date)
cell.lblPostedExpDate.text = String.getString(self.adsListModel[indexpath.row].posted_expired_date)
cell.lblPostedDesc.text = String.getString(self.adsListModel[indexpath.row].post_desc)
cell.postedImage.sd_setImage(with: URL(string: adsListModel[indexpath.row].post_image ?? ""), placeholderImage: UIImage(named: ""))
let status = String.getString(self.adsListModel[indexpath.row].status)
if (status == "Publish") {
cell.statusLabel.text = "Published"
cell.statusLabel.textColor = #colorLiteral(red: 0.2745098174, green: 0.4862745106, blue: 0.1411764771, alpha: 1)
}
else if(status == "Banned") {
cell.statusLabel.textColor = UIColor.darkGray
}
else {
cell.statusLabel.textColor = UIColor.red
}

cell.priceLabel.text = "$\(String.getString(self.adsListModel[indexpath.row].price))"


return cell
}


}

结论:当我点击第一个 TableViewCell 类中的 CollectionViewCell 项时,我想重新加载 SecondTableViewCell 的数据。为此我需要访问 ViewController 函数以重新加载数据。我该怎么做?

enter image description here

最佳答案

一般来说,对于如何解决这个问题,您有多种选择,您需要根据不同的标准选择其中一种。

第一个选项是在创建闭包函数并将其分配给 viewController 中的单元格之前的答案。

第二种选择是像这样实现委托(delegate)模式:

protocol MyDelegate:class {
func doTheJob()
}

class CategoryTableViewCell: UITableViewCell, UICollectionViewDelegate {
//rest of the code...
weak var myDelegate:MyDelegate? = nil

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
myDelegate?.doTheJob()
}
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CategoryTableViewCell
cell.myDelegate = self
}
extension OneStopShopVC: MyDelegate {
func doTheJob() {
}
}

第三种选择可以是拥有一个负责此类逻辑的类,即某种管理类。这个类可以是一个单例,你可以从你需要的地方实例化。

一般来说,你有很多解决方案。但是您需要考虑您的需求并以最佳方式分离代码。想想 MVC、MVVM、VIPER 或任何你遵循的分离的基本原则。

P.S 你使用了一个 UITableViewCell 的实例,它是一个 View ,作为一个 ViewController,这应该为你变成一个大红旗,表明你的架构不正常。

关于ios - 如何访问 tableView 内部集合中的 ViewController 类变量和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57426768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com