2016-11-14 86 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傳遞給單元格,以便觸發擴展方法。

相關問題