2015-01-31 77 views
1

在我的iOS表視圖格式。我得到TableViewDelegate所需的功能:什麼是調用accessoryButtonTappedForRowWithIndexPath在迅速

@IBAction func showSubcategoryEditor(sender: UIButton) { 
    let switchFrameOrigin = sender.frame.origin 
    if let indexPath: NSIndexPath = self.tableView.indexPathForRowAtPoint(switchFrameOrigin) { 
     tableView.delegate.accessoryButtonTappedForRowWithIndexPath!(indexPath) 
    } 
} 

override func tableView(tableView: UITableView, accessoryButtonTappedForRowWithIndexPath indexPath: NSIndexPath) { 
     savedRow = indexPath.row 
     self.performSegueWithIdentifier("SubcategorySegue", sender: self) 
} 

我第一次通過執行以下獲得indexPath

這會導致錯誤,指示委託無法識別。
我應該使用:tableView.accessoryButtonTappedForRowWithIndexPath(indexPath)

+0

你不明白爲什麼你使用showSubcategoryEditor方法。那是什麼按鈕?這與附件按鈕有什麼關係,並且爲什麼要調用accessoryButtonTappedForRowWithIndexPath方法。當你點擊附件按鈕時會調用它。 – rdelmar 2015-01-31 18:15:45

+0

這是一個表格視圖控制器,它繼承了另一個表格視圖控制器。第一個允許選擇一個類別。第二個選項允許選擇與該類別相對應的子類別。我可以用一個內置的附件按鈕來實現它,但我想用一個自定義按鈕來代替。我需要了解如何使用自定義按鈕作爲附件按鈕,該按鈕將調用方法「accessoryButtonTappedForRowWithIndexPath」。我的函數「ShowSubcategoryEditor」使用sender.frame.origin來定位按下按鈕所在的行。然後調用accessoryButton。 – 2015-02-01 23:04:45

+0

我想要做的是替換一個自定義按鈕(嚴格爲美學),並使其表現爲系統提供的附件。不幸的是,到目前爲止我還沒有成功。幸運的是,我可以使用標準的附件按鈕,直到我弄明白爲止。 – 2015-02-04 05:53:55

回答

4

當您使用系統提供的附件按鈕,然後點擊按鈕,系統會爲您調用accessoryButtonTappedForRowWithIndexPath,並且系統會傳入正確的indexPath。當你自己調用這個方法時,你必須傳入你從indexPathForRowAtPoint獲得的indexPath(但是你需要將這個點轉換成表視圖的座標系,就像我在下面的代碼中展示的那樣)。因此,由於您的按鈕的操作方法中已經有了indexPath,因此不需要調用accessoryButtonTappedForRowWithIndexPath,它只是一個額外的步驟,不會比您在按鈕的操作方法中做的更多。你只需要做到這一點,

@IBAction func showSubcategoryEditor(sender: UIButton) { 
    let hitPoint = sender.convertPoint(CGPointZero, toView: self.tableView) 
    if let indexPath: NSIndexPath = self.tableView.indexPathForRowAtPoint(hitPoint) { 
     savedRow = indexPath.row 
     self.performSegueWithIdentifier("SubcategorySegue", sender: indexPath) 
    } 
} 

還要注意,在performSegue:發件人:,我傳遞的indexPath作爲發件人的說法。然後,您可以在prepareForSegue中使用它:sender:如果需要將信息傳遞到目標視圖控制器,則獲取該行。

如果您將segue從您的按鈕連接到下一個控制器,則無需使用按鈕操作方法;一切都可以在prepareForSegue:sender:中完成。發件人的參數將是按鈕,所以你可以做到這一點,

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     let button = sender as UIButton 
     let controller = segue.destinationViewController as DetailViewController // substitute the class of your destination view controller 
     let hitPoint = button.convertPoint(CGPointZero, toView: self.tableView) 
     if let indexPath: NSIndexPath = self.tableView.indexPathForRowAtPoint(hitPoint) { 
      // pass the index path to controller, or get data from your array based on the indexPath, and send that to controller 
     } 
    } 
+1

rdelmar - 感謝您設計精良的答案。很棒!我已經納入你的建議。 – 2015-02-05 05:41:32

0

答案提供了關於蘋果論壇:

UITableViewController子類,它實現了 委託協議,你可以調用委託方法是這樣的:

tableView(tableView, accessoryButtonTappedForRowWithIndexPath: 
indexPath) 
+0

如果你已經有一個按鈕方法,爲什麼還要打電話給accessoryButtonTappedForRowWithIndexPath呢?只需在showSubcategoryEditor中調用performSegue;這是一個額外的步驟,這是不必要的。更容易的是,將按鈕連接到故事板中的一個segue,然後您不需要任何方法。 – rdelmar 2015-02-01 23:35:30

+0

我需要在子類別表中選擇顯示正確數據的行的編號。子類別表不是靜態的。每個類別都有一組不同的子類別。 – 2015-02-02 06:58:22

+0

你有你的按鈕方法的indexPath。如果你沒有實現任何一種方法,那麼你應該實現prepareForSegue,並且你可以像在你的按鈕方法中那樣獲得indexPath(這個按鈕將是發送者參數o prepareForSegue:sender :)。 – rdelmar 2015-02-02 07:02:28