如何在表函数外使用indexpath.row

时间:2018-09-21 09:17:42

标签: ios swift

我的表视图是

  struct country : Decodable {
    let name : String
    let capital : String
    let region : String
  }

  class ViewController: UIViewController {

    var countries = [country]()

    let color = UIColor()

    @IBOutlet weak var tableview: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        tableview.delegate = self
        tableview.dataSource = self


        let jsonurl = "https://restcountries.eu/rest/v2/all"
        let url = URL(string: jsonurl)

        URLSession.shared.dataTask(with: url!) { (data, response, error) in

            do {
                self.countries = try JSONDecoder().decode([country].self, from: data!)

            } catch {
                print("Error")
            }
            DispatchQueue.main.async {
                self.tableview.reloadData()
            }
          }.resume()


        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
         // Dispose of any resources that can be recreated.
    }

    @IBAction func redButtonAction(_ sender: UIButton) {
          let index = IndexPath.init(row: 0, section: 0)
           let cell = tableview.cellForRow(at: index)
     }
}

 extension ViewController:UITableViewDelegate,UITableViewDataSource {

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

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: 
     IndexPath) -> CGFloat {
        return 40
    }

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

        let cell = tableview.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = countries[indexPath.row].name.capitalized

        let cellnumber = indexPath.row

       return cell
    }

现在我想在按钮操作中使用cellnumber或indexpath.row。我这样做,但无法获取indexpath.row
我当时想做的是,当我按下按钮时,tableview的背景色的奇数单元格更改为红色,而偶数单元格的背景色更改为蓝色。但是问题出在侧面的tableview函数中,我只能得到一个值,而不是数组的总数。在上面的程序中,如果我打印单元格编号,我们将获得单元格的总数。

2 个答案:

答案 0 :(得分:0)

最基本的解决方案是在tag中为按钮添加cellForRowAt。如果您只有一个部分,它将起作用。

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

    let cell = tableview.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = countries[indexPath.row].name.capitalized

    cell.button.tag = indexPath.row

    return cell
}

现在使用您的方法

@IBAction func redButtonAction(_ sender: UIButton) {
      let index = IndexPath.init(row: sender.tag, section: 0)
      let cell = tableview.cellForRow(at: index)
   }

不幸的是,如果您在tableView布局中添加了任何复杂性,那么这种方法就不会那么有效。

答案 1 :(得分:0)

表视图单元格是可重用的,并且您只能获得可见单元格的indexPath,因此您应该在单击按钮时重新加载表视图,并且如果您想在cellForRowAt中更改颜色或不更改颜色,则需要设置条件

单击按钮时更改行颜色的代码

struct country : Decodable {
    let name : String
    let capital : String
    let region : String
}

class ViewController : UIViewController {

    var countries = [country]()

    let color = UIColor()
    var needToChangeColor : Bool = false

    @IBOutlet weak var tableview: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        tableview.delegate = self
        tableview.dataSource = self


        let jsonurl = "https://restcountries.eu/rest/v2/all"
        let url = URL(string: jsonurl)

        URLSession.shared.dataTask(with: url!) { (data, response, error) in

            do {
                self.countries = try JSONDecoder().decode([country].self, from: data!)

            } catch {
                print("Error")
            }
            DispatchQueue.main.async {
                self.tableview.reloadData()
            }
            }.resume()


        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func redButtonAction(_ sender: UIButton) {
        self.needToChangeColor = true
        self.tableview.reloadData()
    }
}

extension ViewController :UITableViewDelegate,UITableViewDataSource {

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

    func tableView(_ tableView: UITableView, heightForRowAt indexPath:
        IndexPath) -> CGFloat {
        return 40
    }

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

        let cell = tableview.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = countries[indexPath.row].name.capitalized
        if needToChangeColor == true {
            if indexPath.row % 2 == 0 {
                cell.backgroundColor = UIColor.blue
            } else {
                cell.backgroundColor = UIColor.red
            }
        } else {
            cell.backgroundColor = UIColor.white
        }

        return cell
    }
}