2016-11-14 43 views
0

我有一个自定义单元格类如下:Swift:我想知道什么是我点击的按钮的索引路径行?

class SizeAndQuantityCellView:UITableViewCell 
{ 

@IBOutlet weak var imageview: UIImageView! 
@IBOutlet weak var plusButton4x4: UIButton! 
@IBOutlet weak var plusButton4x6: UIButton! 
@IBOutlet weak var plusButton5x7: UIButton! 
@IBOutlet weak var plusButton8x10: UIButton! 
@IBOutlet weak var minusButton4x4: UIButton! 
@IBOutlet weak var minusButton4x6: UIButton! 
@IBOutlet weak var minusButton5x7: UIButton! 
@IBOutlet weak var minusButton8x10: UIButton! 
@IBOutlet weak var quantity4x4: UILabel! 
@IBOutlet weak var quantity4x6: UILabel! 
@IBOutlet weak var quantity5x7: UILabel! 
@IBOutlet weak var quantity8x10: UILabel! 

let sizeAndQuantityController = SizeAndQuantityController() 
@IBAction func plusButtonClick(sender: UIButton) 
{ 
    let btnTag:Int = sender.tag 
    let tableView = sender.superview!.superview?.superview as! UITableView 
    let cellRow = tableView.indexPathForCell(self)?.row 
    sizeAndQuantityController.plusButtonClick(btnTag,cellRow: cellRow!) 
} 

@IBAction func minusButtonClick(sender: UIButton) 
{ 
    let btnTag:Int = sender.tag 
    let tableView = sender.superview!.superview?.superview as! UITableView 
    let cellRow = tableView.indexPathForCell(self)?.row 
    sizeAndQuantityController.plusButtonClick(btnTag,cellRow: cellRow!) 
} 
} 

我想要做的就是当我点击加号按钮的数量应当由一个增加,当我点击减号按钮应该减一。 这是我为控制器类:

class SizeAndQuantityController 
{ 
func plusButtonClick(tag:Int,cellRow:Int) 
{ 
    switch tag 
    { 
    case 13: 
     let quant = quantity4x4[cellRow] 
     quantity4x4[cellRow] = quant+1 
     break; 
    case 14: 
     let quant = quantity4x6[cellRow] 
     quantity4x6[cellRow] = quant+1 
     break; 
    case 15: 
     let quant = quantity5x7[cellRow] 
     quantity5x7[cellRow] = quant+1 
     break; 
    case 16: 
     let quant = quantity8x10[cellRow] 
     quantity8x10[cellRow] = quant+1 
     break; 
    default: 
     break 
    } 
} 

func minusButtonClick(tag:Int,cellRow:Int) 
{ 
    switch tag 
    { 
    case 17: 
     let quant = quantity4x4[cellRow] 
     quantity4x4[cellRow] = quant-1 
     break; 
    case 18: 
     let quant = quantity4x6[cellRow] 
     quantity4x6[cellRow] = quant-1 
     break; 
    case 19: 
     let quant = quantity5x7[cellRow] 
     quantity5x7[cellRow] = quant-1 
     break; 
    case 20: 
     let quant = quantity8x10[cellRow] 
     quantity8x10[cellRow] = quant-1 
     break; 
    default: 
     break 
    } 
} 

我已经给了不同的标签,所有的按钮。 当我运行应用程序时,它给了我以下错误:“无法将类型UITableViewWrapperView的值转换为UITableView的值”在我设置我的tableview的行。

+2

做'sender.superview!.superview?.superview'是一个坏主意,如果苹果决定在未来的更新中更改它们的实现,您的代码将会中断。你应该有一个显式变量,用于从storyboard链接的tableview或 – Fonix

+0

将cellForRow中按钮的标记设置为indexPath。row –

+0

我有显式tableView变量链接storyboard,但它在ViewController类,但我想访问在上面给出的定制UITableViewCell类中的tableView – Ankit0047

回答

0

sender.superview!.superview?.superview as! UITableView是非常危险的。在iOS6和iOS7之间的转换中,实际上引入了一个额外的层,并且这种调用失败。

相反,在单元格中有一个属性rowIndex,可以在cellForRowAtIndexPath中设置。例如:

class SizeAndQuantityCellView:UITableViewCell 
{ 
    var rowIndex: Int = 0 
    ... 
} 

在你TableViewController

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "myTableViewCell", for: indexPath) as! SizeAndQuantityCellView 
    cell.rowIndex = indexPath.row 
    ... 
    return cell 
} 

从你的代码,目前尚不清楚其中quantity4x4 [cellRow],例如,适合在但在我看来,一个委托模式也可能方便。 I.o.w.为SizeAndQuantityCellView创建委托协议,并让您的ViewController成为SizeAndQuantityCellView的委托。点击按钮时,向代表发送事件。这样你的ViewController就可以按下按钮来处理逻辑了。

+0

谢谢,我使用了你的代码,并且能够获得点击按钮的不同单元格的索引路径行。还将查看我的逻辑的委派模式。 – Ankit0047

0

更复杂的方法,涉及使用扩展和位运算符。简化起见,您可以使用每个UIButton内置的标签属性,通过使用按位运算符和移位将它打包,将Index和Path的整个值(通过一行和一部分标识)存储起来。

一旦值存储,可以通过扩展您的UIButton类,并返回由拆包的原始值创造了一个新的IndexPath使用计算财产技术。

下面有一个简单的扩展,它做的工作:

extension UIButton { 
    func packing(low:Int, high:Int) -> Int { 
     //With the packing function we force our Packed number to be a 64 bit one 
     //we shift the high part 32bits to the left and OR the resulting value with the low part 
     return ((high << 32) | low) 
    } 
    func unpackHigh(packed:Int) -> Int { 
     //Unpacking the high part involve swifting to right the 
     //number in order to zero'ing all the non relevant bits. 
     return packed >> 32 
    } 
    func unpackLow(packed:Int) -> Int { 
     //Unpacking the low part involve masking the whole packed number with the max value allowed for an Int. 
     //note that using the Int.max function does not work as expected, returning a compile error. 
     //Maybe, it's a bug of compiler. 
     let mask = 2147483647 
     return mask & packed 
    } 

    //since we cannot use stored property on extensions, we need to compute realtime, every time the 
    //right value of our indexPath. 
    var indexPath:IndexPath { 
     get { 
      return IndexPath(row: unpackLow(packed: self.tag), section: unpackHigh(packed: self.tag)) 
     } 
     set { 
      self.tag = packing(low: newValue.row, high: newValue.section) 
     } 
    } 
} 

,在这里你可以找到原型的cellForRowAtIndexPath一个简单的应用:

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

let aCell = tableView.dequeueReusableCell(withIdentifier: "reuseCell") as! CustomTableViewCell 

... 

aCell.aButton.indexPath = indexPath 

... 

return aCell 

}

注意,您需要在出列之后,将正确的indexPath传递给单元格,以便触发扩展方法。

相关问题