根据表视图单元格更改变量

时间:2016-05-29 12:48:56

标签: ios swift uitableview uikit

我需要一个事件,根据我点击的TableViewCell更改变量。但与连接到按钮的操作不同,表格视图单元格根本没有动作指示器。所以我的问题是:

我想创建一个包含数组项的TableView。根据我点击的项目,我想更改我的变量,以便下一个ViewController的结果取决于您点击的按钮。

因此,为了简化操作,以下是我希望应用看起来像的示例:

在第一个TableViewController上,我有一个基于数组的列表,在第二个ViewController上,我有一个标签,根据变量显示文本。

我有一个nameArray = ["Mum", "Brother", "Me"]和一个weightArray = [140, 160, 120]以及一个变量weight = 0。第二个ViewController上的标签告诉var权重。所以当你点击TableView中的“妈妈”时,我希望下一个ViewController说140,当我点击“兄弟”然后160等等......

直到这里一切正常,除了根据我点击的内容更改var之外,我没有任何问题。

长篇故事,短篇小说:

我想要一个TableViewCell的Action,它可以改变连接到Button的Action中的var,但是Cell根本没有Action插座。

3 个答案:

答案 0 :(得分:1)

使用此方法。使用indexPath.row查找您选择的行号

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

     var cell : UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)! 
     switch cell.labelSubView.text as! String {
     case "Mum":
         self.weight = weightArray[0]
     case "Brother"
         self.weight = weightArray[1]
     and so on..
     ..
     default:
         statements
     }
 }

注意更好的选择

我还考虑过nameArray中的条目太多而switch语句可能不太好的情况。在这种情况下,您可以通过cell.labelSubView.text as! String

获取所选行内的文本

接下来,您可以检查nameArray是否包含单元格文本,并获取与单元格文本匹配的名称的索引。接下来,您可以在weightArray中的相同索引处获得所需的权重。然后做self.weight = weightArray[requiredIndex]

希望这有帮助。

更新:我的有经验的朋友@Duncan在下面提到过,在这种情况下,switch语句是一种糟糕的编码习惯。我不会删除它,因为这对我和我的编程相对较新的程序员来说都是一个教训。所以我把它放在一个黄色的方框中,说它不是一个好的代码

更好的选择是

  1. 正如Duncan所提到的,创建一个字典数组是一个不错的选择
  2. 第二个选项是我的注释
  3. 后面的选项

答案 1 :(得分:-1)

你需要维护字典数组,那些字典有像“人”和“权重”这样的键,然后你可以通过使用表视图委托方法UITableViewDelegate的tableView:didSelectRowAtIndexPath:

答案 2 :(得分:-1)

在所选单元格的视图控制器中创建一个实例变量(类定义后顶层的var)。

class MyTableViewController: UIViewController

var selectedRow: Int


override func tableView(tableView: UITableView, 
  didSelectRowAtIndexPath indexPath: NSIndexPath) 
{
  selectedRow = indexPath.row

  //invoke a segue if desired
  performSegueWithIdentifier("someSegue");
}


override func prepareForSegue(segue: UIStoryboardSegue, 
  sender: AnyObject?)
{
  if segue.identifier == "someSegue"
  {
    //Cast the destination view controller to the appropriate class
    let destVC = DestVCClass(segue.destinationViewController)
    destVC.selectedRow = selectedRow
  }
}

正如Andey在他的回答中所说,创建单个数据对象数组(字典,结构或自定义数据对象)可能更好。然后,当用户点击单元格时,您可以将整个数据对象传递到目标视图控制器,而不是将所选行的索引传递给下一个视图控制器。然后目标视图控制器可以提取它所需的任何数据。 (重量,在你的例子中。)