Swift:我想知道什么是我点击的按钮的索引路径行?
我有一个自定义单元格类如下: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的行。
做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就可以按下按钮来处理逻辑了。
谢谢,我使用了你的代码,并且能够获得点击按钮的不同单元格的索引路径行。还将查看我的逻辑的委派模式。 – Ankit0047
更复杂的方法,涉及使用扩展和位运算符。简化起见,您可以使用每个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传递给单元格,以便触发扩展方法。
做'sender.superview!.superview?.superview'是一个坏主意,如果苹果决定在未来的更新中更改它们的实现,您的代码将会中断。你应该有一个显式变量,用于从storyboard链接的tableview或 – Fonix
将cellForRow中按钮的标记设置为indexPath。row –
我有显式tableView变量链接storyboard,但它在ViewController类,但我想访问在上面给出的定制UITableViewCell类中的tableView – Ankit0047