如何从属于 UITableView 中的模型数组对象的数组中向 tableView 显示数据?

Posted

技术标签:

【中文标题】如何从属于 UITableView 中的模型数组对象的数组中向 tableView 显示数据?【英文标题】:How Can I show data to tableView From Array which belong in model array object in UITableView? 【发布时间】:2018-08-23 08:32:55 【问题描述】:

我有一个模型对象,它有一个数组,我通过 indexPath.row 填充数据,而不是我需要将每个部分数组发送到另一个 tableView,但它向我发送随机数据我如何将特定选定的行数组发送到下一个 tableView?请帮助我理解..

这是我的模型对象:

class ProductModel 

    var name:String
    var option: [String]
    var image:UIImage
    init(name:String,option:[String],image:UIImage) 
        self.image = image
        self.name = name
        self.option = option
    

这是我的模型对象:

class Data 

    static var product = [ProductModel]()


这里是追加数据的数据函数

static func read(compleationHandler:@escaping () -> ()) 

    let hospitalList:[String] =  ["A","B,C"]
    let hospitalTwo:[String] = ["Sharee bangla","National Park","bangladesh medical"]
    let hospitalThree:[String] = ["NSU","MIU","UIU","AIUB"]
    let hospitalFour:[String] = ["Dhaka","Comillah","Borials"]
    let hospitalFive:[String] = ["iPhone","iPad","iMac"]

    DispatchQueue.global(qos: .userInteractive).async 


        if Data.product.count == 0 

            Data.product.append(ProductModel(name: "Mahmud", option: hospitalList, image: #imageLiteral(resourceName: "radio")))
            Data.product.append(ProductModel(name: "Rangon", option: hospitalTwo, image: #imageLiteral(resourceName: "pause.on.fw")))
            Data.product.append(ProductModel(name: "Saikot", option: hospitalThree, image: #imageLiteral(resourceName: "Unit.fw")))
            Data.product.append(ProductModel(name: "Ratul", option: hospitalFour, image: #imageLiteral(resourceName: "Region.fw")))
            Data.product.append(ProductModel(name: "Jubayer", option: hospitalFive, image: #imageLiteral(resourceName: "add-note.fw")))

        
        DispatchQueue.main.async 
            compleationHandler()
        
    

这里是第一个 ViewDidLoad 和一个用于存储单元数组的全局数组:

class ModelTableView: UIViewController 
    var optionData:[String] = [String]()


    @IBOutlet var ModelDataTableVIew: UITableView!

    override func viewDidLoad() 
        super.viewDidLoad()
         ModelDataTableVIew.delegate = self
        ModelDataTableVIew.dataSource = self
        ModelFunction.read  [weak self] in
            self?.ModelDataTableVIew.reloadData()
        
    


这是我在标签中创建的 cellForRowAtIndex,我添加了一个点击手势。当用户单击它时,将显示另一个带有此元胞数组数据的 tableView

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        if indexPath.row  == Data.product.count 
            let cell = ModelDataTableVIew.dequeueReusableCell(withIdentifier: "modelCellBtn") as! ModelCellBtn
            return cell
         else 
            let cell = ModelDataTableVIew.dequeueReusableCell(withIdentifier: "modelCell") as! ModelCell
            cell.configureCell()
            optionData = Data.product[indexPath.section].option
            let tapGeshture = UITapGestureRecognizer(target: self, action: #selector(tapped(_:)))
            cell.optionLabel.addGestureRecognizer(tapGeshture)
            cell.nameImage.image = Data.product[indexPath.row].image

            return cell
        

这是准备 Segue 并将数据发送到下一个视图控制器:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if (segue.identifier == "option") 
            let dest = segue.destination as! OptionViewController
            dest.data = optionData

        

    

这是我的 nextViewController(用于显示选项数据):

class OptionViewController: UIViewController,UITableViewDelegate,UITableViewDataSource 

        var data:[String] = []

        @IBOutlet weak var optionTableView: UITableView!
        override func viewDidLoad() 
            super.viewDidLoad()

            optionTableView.delegate = self
            optionTableView.dataSource = self
            print(data)
            optionTableView.reloadData()
            ModelFunction.read  [weak self] in
                self?.optionTableView.reloadData()
            

        
    

这里选项 View Controller 和在这个控制器中我想在 tableView 中显示检索到的数组

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = optionTableView.dequeueReusableCell(withIdentifier: "optionCell") as! OptionCell
        //cell.textLabel?.text = Data.product[indexPath.section].option[indexPath.row]
        cell.textLabel?.text = data[indexPath.row]
    return cell
    

但它在我的 tableView 中向我显示了单节数据..

【问题讨论】:

首先从不将自定义类命名为Data。它可能会干扰内部结构Data。并且变量名应该总是以小写字母开头。在表格视图中,委托方法始终使用传递的 tableView 实例,而不是硬编码的属性。 【参考方案1】:

您在 cellForRow 方法中采用 optionData,该方法始终采用 lastVisible 数据,您应该在 didSelectRowAt 方法中采用 optionData

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    print("didselect")
    optionData = Data.product[indexPath.row].option
    performSegue(withIdentifier: "option", sender: self)

尝试并分享您的结果。

【讨论】:

它将第一节数据发送到下一个 viewController (tableView) / A B,C 您应该在 cellForRow 中注释手势部分。这两条线。让 tapGeshture = UITapGestureRecognizer(target: self, action: #selector(tapped(_:))) cell.optionLabel.addGestureRecognizer(tapGeshture). 做了但结果相同我认为这两行不是发送数据的一部分 是的,这不是发送数据的一部分,但我认为 tapped(_ :) 方法可能有问题。 tapped(_ :) 方法中有什么,您能否发布该代码以更好地理解问题。

以上是关于如何从属于 UITableView 中的模型数组对象的数组中向 tableView 显示数据?的主要内容,如果未能解决你的问题,请参考以下文章

模型数组中的 UITableView 和单元格

如何从 UITableView 中的 UITableViewCells 中的 UITextFields 中获取文本并将它们放入数组中(Swift 3)?

使用数组中的日期按日期对 UITableview 进行排序

如何检查 UITableView 中的选定行属于哪个组/部分

如何从 PrepareForReuse 的 UITableView 自定义行中删除视图?

UITableview 从数据数组创建字母索引