快速将数据从 tableview 传递到 viewContoller

时间:2021-01-11 10:34:23

标签: ios swift uiviewcontroller tableview alamofire

我有一个 tableview 使用 Alamofire 从 php json 加载数据,它在 tableview 上加载完美,现在我尝试将数据传递给第二个 viewController 以显示更多详细信息,我遇到了这个错误,提示无法在范围内找到数据

func getUsers() {
    AF.request(SiteUrl).validate().responseJSON { response in
        switch response.result {
        case .success:
            print("Validation Successful)")

            if let json = response.data {
                do{
                    let jsonData = try JSON(data: json)
                    self.data = jsonData.arrayValue
                    self.tableView.reloadData() // we are already on the main thread
                    //print("DATA PARSED: \(jsonData)")
                }
                catch {
                    print("JSON Error", error)
                }
            }
        case .failure(let error):
            print(error)
        }
    }
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return data.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let customCell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell

    let item = data[indexPath.row]
    customCell.AdTitle?.text = item["title"].string
    customCell.AdDate?.text = item["time"].string

    let imageUrl = item["document"].string
    let url = NSURL(string:("https://qateef-ads.co/uploads/" + imageUrl!))
    customCell.AdImage.sd_setImage(with: url as URL?, placeholderImage: UIImage(named: "placeholder.png"))

    return customCell
}


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            
    let vc = storyboard?.instantiateViewController(withIdentifier: "DetailsViewController") as? DetailsViewController
    self.navigationController?.pushViewController(vc!, animated: true)
    vc?.imageView = UIImage(named: url)
    vc?.AdTitle = item["title"].string
}

如何将数据从第二个视图传递?

3 个答案:

答案 0 :(得分:1)

我不确定我是否理解您的问题到底是什么。但是,如果您需要在第二个视图控制器上访问该数据,最简单的方法是将该数据注入到您在选择单元格时实例化的 DetailsViewController 中。
但首先您需要创建该属性:

class DetailsViewController: UIViewController {
    var data: JSON?
    
    ...

}

然后在实例化该视图控制器时:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                
        guard let vc = storyboard?.instantiateViewController(withIdentifier: "DetailsViewController") as? DetailsViewController else { return }
        vc.data = data[indexPath.row]
        self.navigationController?.pushViewController(vc, animated: true)
    }

现在您可以使用 DetailsViewController 上的数据从 json 响应中提取您需要的任何信息:

class DetailsViewController: UIViewController {

    ...

    override viewDidLoad() {
        super.viewDidLoad()
        let title = data["title"]
        ...
    }

}

答案 1 :(得分:0)

您将 alamofire 结果传递给“data”变量。因此,您应该在将值传递给另一个 VC 时使用“数据”。在你的情况下,它可能像;

<vs-button color="warning" @click="chartClick($event, 'chart1')" vs-value="chart1" v-model="show"> chart1</vs-button>

<vs-button color="warning" @click="chartClick($event, 'chart2')" vs-value="chart2" v-model="show"> chart2 </vs-button>

<vs-button color="warning" @click="chartClick($event, 'chart3')" vs-value="chart3" v-model="show"> chart3 </vs-button>

<script>
data () {
  return {
    show = false
  }
},
mounted (){
  chartClick (chart1)
},
methods: {
  chartClick (event, id){
    
    ...
    this.show = true
  }
}
</script>

答案 2 :(得分:0)

好的

**

    if let json = response.data {
   let JSON22 = json as! NSDictionary
                            do{
                                let jsonData = try JSON(data: JSON22)
                                self.data = jsonData.arrayValue
                                self.tableView.reloadData() // we are already on the main thread
                                //print("DATA PARSED: \(jsonData)")
                            }
                            catch {
                                print("JSON Error", error)
                            }

**

如果您想将数据从 Controller1 传递到 Controller2

Controller1

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)   {

         let item = data[indexPath.row]

         let vc = storyboard?.instantiateViewController(withIdentifier: "DetailsViewController") as? DetailsViewController
         vc!.dictGetData = item
         self.navigationController?.pushViewController(vc!, animated: true)
    }

Controller2

创建一个字典变量

var dictGetData:NSDictionary!

然后在视图上打印字典加载

override func viewDidLoad() {
        super.viewDidLoad()

       print(dictGetData as Any)
}