2013-10-16 62 views
4

我在UITableView的自定義單元格中有兩個UITextFields。 我需要編輯和存儲textFields的值。 當我點擊一個UITextField時,我必須知道它所屬的行,才能將值保存到本地數組的正確記錄中。 如何獲取textField的行索引? 我想:在UITableViewCell中獲取UITextField的行

-(void)textFieldDidBeginEditing:(UITextField *)textField 
{ 

    currentRow = [self.tableView indexPathForSelectedRow].row; 


} 

但是當我點擊UITextFieldRow.It變化裏面只有當我點擊(選擇)的整行的currentRow不會改變......

回答

6

試試這個

//For ios 7 

UITableViewCell *cell =(UITableViewCell *) textField.superview.superview.superview; 
NSIndexPath *indexPath = [tblView indexPathForCell:cell]; 


//For ios 6 

UITableViewCell *cell =(UITableViewCell *) textField.superview.superview; 
NSIndexPath *indexPath = [tblView indexPathForCell:cell]; 
+3

爲什麼要3次超級瀏覽? – giuseppe

+0

tableviewCells層次結構發生了變化 因此,添加一個額外的.superview – Kalpesh

+0

您能否指出我在此處解釋此更改的文檔?問候 – giuseppe

0

1>您可以通過以編程方式在您的CellForRowAtIndexPath中創建文本字段並將文本字段的標記設置爲indexpath.row來實現它。 然後textFieldDidBeginEditing你可以獲取textField.tag並實現你想要的。

2>另一種方法是在一個表視圖中有2個自定義單元格。通過這種方式,您可以單獨放置文本字體,並在實用程序面板中設置它們的標籤。

+0

不,因爲我有2s。 – giuseppe

+0

我明白你有2個文本框。而是直接將文本字段放入您的單元格中。只是以編程方式創建它們。 –

+0

你有多少文本域與確定你所在的行不相關,使所有文本域都有與行相同的標記 –

6

文本字段沒有將觸發事件發送到表視圖,因此indexPathForSelectedRow不起作用。您可以使用:

CGPoint textFieldOrigin = [self.tableView convertPoint:textField.bounds.origin fromView:textField]; 
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:textFieldOrigin]; 
+0

這是我猜的可靠解決方案。被接受的答案依賴於超視圖層次結構,並在該操作系統特定的,所以現在對我來說是不好的解決方案。 – Tirth

4

在iOS 8的我發現,模擬器和設備有不同數量的superviews的,所以這是一個小更通用的,應在iOS的所有版本:

UIView *superview = textField.superview; 
while (![superview isMemberOfClass:[UITableViewCell class]]) { // If you have a custom class change it here 
    superview = superview.superview; 
} 

UITableViewCell *cell =(UITableViewCell *) superview; 
NSIndexPath *indexPath = [self.table indexPathForCell:cell]; 
0

我所做的是創建一個自定義單元格,並將我需要的任何自定義UI元素放入其中,並創建一個屬性indexPath,該單元格在出現單元格時被設置。然後我將indexPath傳遞給didSet中的自定義元素。

class EditableTableViewCell: UITableViewCell { 

    @IBOutlet weak var textField: TableViewTextField! 

    var indexPath: IndexPath? { 
     didSet { 
      //pass it along to the custom textField 
      textField.indexPath = indexPath 
     } 
    } 
} 


class TableViewTextField: UITextField { 
    var indexPath: IndexPath? 
} 

TableView

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "EditableCell") as! EditableTableViewCell 
     cell.indexPath = indexPath 
     return cell 
} 

然後,我實現UITextFieldDelegate協議,因爲文本字段有其indexPath你將永遠知道它是從哪裏來的。 不知道設置委託的最佳位置在哪裏。最簡單的方法是在單元出列時設置它。

override func textFieldDidEndEditing(_ textField: UITextField) { 
    guard let myTextField = textField as? TableViewTextField else { fatalError() } 
    guard let indexPath = myTextField.indexPath else { fatalError() } 
} 
相關問題