2015-04-18 18 views
2

我已经创建了一个自定义的TableViewCell,并且当前在单元格中放置了一个按钮。当按下按钮时,在tableviewcell.swift文件中,IBAction func被执行。我无法弄清楚如何确定按下按钮的单元格的索引路径。我尝试使用以下如何访问自定义TableViewCell中按钮的索引路径?

@IBAction func employeeAtLunch(sender: AnyObject) { 

    let indexPath = (self.superview as! UITableView).indexPathForCell(self) 
    println("indexPath?.row") 
} 

,但我得到的点击以下错误: Could not cast value of type 'UITableViewWrapperView' to 'UITableView'

如何接入小区的索引路径任何帮助吗?

+0

您应该创建一个插座,并把它连接到您的tableView IBOutlet var tableView:UITableView!(您将需要从方法中删除重写) –

回答

4

您可以在您的单元格中为其行的子类继承UIButton

class MyButton: UIButton { 
    var row: Int? 
} 

然后,当你建立你的表视图,在cellForRowAtIndexPath方法,您将row属性:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     // ... 
     cell.button.row = indexPath.row 
     // ... 
    } 

这种方式时动作火灾,就可以得到正确的行:

@IBAction func employeeAtLunch(sender: MyButton) { 
    if let row = sender.row { 
     // access the row 
    } 
} 
+1

你的意思是var row:Int? –

+0

@LeonardoSavioDabus是的,当然,谢谢。 –

4

你只是假设该单元的直接超视图是表视图 - 错误。没有什么特别的理由为什么这样(事实上并非如此)。更少的假设工作!您需要保持行走了 SuperView把链,直到你达到表,就像这样:

var v : UIView = self 
do { v = v.superview! } while !(v is UITableView) 

现在v是表视图,您可以继续工作了哪一行,这是。

然而,我实际上做的工作是我的工作,不是从单元格到表格,而是从按钮到单元格。该技术是完全一样的:

var v : UIView = sender as! UIView 
do { v = v.superview! } while !(v is UITableViewCell) 

做到这一点,按钮的操作方法,其中sender是按钮。如果操作方法的目标是表视图控制器,则它可以访问表,并解决问题。

+0

我不确定依赖这些任务的视图层次结构通常是安全的,因为内部组件可能会随时更改。最后一个值得注意的变化是iOS 6和7之间([例子](http://www.curiousfind.com/blog/646)),我记得它给我带来了很多麻烦。 –

+0

但这就是我的观点。我们知道这个东西是_some_级别的那个东西的子视图,这就是我们所知道的。以非假设的方式行事,就像我在这里做的那样_永不休息。 – matt

+0

好的,再读一遍,我明白你的观点。 :)和更少的假设工作肯定是一个合理的建议。尽管如此,我仍然不会解决这个问题。 –

0

在你的情况下,我会在你的按钮上添加一个标签来标识它是哪一行。每当我在回调cellForRowAtIndexPath中配置单元格时,我都会更新此标签值。

当一个按钮被点击时,处理程序总是指定按钮被按下。通过为该按钮定义标签,您可以知道按下哪一行的按钮。

@IBAction func buttonPressed(sender: AnyObject) { 
     //convert to UIButton 
     if let btn = sender as? UIButton { 
      let rowId = btn.tag 
      //do your works 
     } 
} 

如果你的tableview有超过1个部分,你将不得不以正确的方式设置标签的值。

,这是更好的第二个解决方案:获得按钮的位置在您的tableView,然后得到那个职位的indexpath在您的实现代码如下:

let position = sender.convertPoint(CGPointZero, toView: self.tblMain) 
let indexPath = self.tblMain.indexPathForRowAtPoint(position) 
+0

对不起,这是一个较低的t。 –

+0

是的,我明白你想说什么。我很困惑与C#。刚解决这个问题。我还添加了另一个解决方案 –

+0

尽管使用UIView的标签属性是一个快速的工具,它可以完成这项工作,它[不被认为是一种好的做法](http://benford.me/blog/12-dos-and- donts-for-ios-development /),因为它通常用于跟踪视图。此外,随着代码库变得越来越复杂,跟踪这种任意决定变得越来越困难。 –