Is it possible to derive the indexPath if you know the row?

Refresh

December 2018

Views

102 time

2

Okay, I'm going to try to break this down as simply as I am able. I have a tableView in a ViewController. I have two prototype cells for the table. I am reusing the cells multiple times to populate the table.

In one of the cells, I've added gesture recognizer to the label through which I'm making a textField visible on place of the label and hiding the label. Now I want the labels text to change to what I've entered in the textField when I'm done using the textField and hit the return key. So i implemented the UITextFieldDelegate protocol in the viewController. I've also added tags to each of the textFields in the cell so that I know what textField is returning and what row the textField is in.

Basically, what I want to know is if there is any way to get the indexPath if I already know the indexPath.row?

For the gesture recognizers, i was able to work around this issue by getting the indexPath from the tapped location:

func genderTapped(sender: UITapGestureRecognizer) {

        let tapLocation = sender.locationInView(self.profileInfoTable)
        let indexPath = self.profileInfoTable.indexPathForRowAtPoint(tapLocation)

        let cell = self.profileInfoTable.cellForRowAtIndexPath(indexPath!) as! editUserDataCell
        cell.savedUserInput.hidden = true
        cell.userDetailTextfield.becomeFirstResponder()
        cell.userDetailTextfield.hidden = false
        cell.userDetailTextfield.text = cell.savedUserInput.text!            
    }

I need the indexPath so that I can refer to the elements contained within a cell. Can anyone offer any insights? Has anybody tried a similar approach? Is there any way I can access the cell by just using the row?

4 answers

2

Если вы в состоянии получить indexPath внутри , GestureMethodто вы можете создать один экземпляр свойство типа NSIndexPathмагазина его значение внутри метода этого жеста, а позже использовал indexPath внутри textFieldShouldReturnметод делегата, что - то вроде этого.

var selectedIndexPath: NSIndexPath?

func genderTapped(sender: UITapGestureRecognizer) {

    let tapLocation = sender.locationInView(self.profileInfoTable)
    self.selectedIndexPath = self.profileInfoTable.indexPathForRowAtPoint(tapLocation)

    let cell = self.profileInfoTable.cellForRowAtIndexPath(self.selectedIndexPath!) as! editUserDataCell
    cell.savedUserInput.hidden = true
    cell.userDetailTextfield.becomeFirstResponder()
    cell.userDetailTextfield.hidden = false
    cell.userDetailTextfield.text = cell.savedUserInput.text!
} 

Теперь используйте этот self.selectedIndexPathвнутренний UITextFieldDelegateметод.

Изменить: Из комментария Вашего вопроса в вы сказали , что у вас есть только один , Sectionтак что вы можете создать indexPathиз этого textField«с tagтаким образом.

func textFieldShouldReturn(textField: UITextField) -> Bool {
    let indexPath = NSIndexPath(forRow: textField.tag, inSection: 0)
    //Or You can use self.selectedIndexPath also 
}
2

В случае одного или нескольких разделов , приведенный ниже код будет работать

В ваших cellForRowAtIndexPath, установите тег , как показано ниже: -

let tag = indexPath.section*100 + indexPath.row

cell.savedUserInput.tag = tag
cell.userDetailTextfield.tag = tag

В вашем текстовом поле метода делегата, получить indexPath следующим образом: -

func genderTapped(sender: UITapGestureRecognizer) {
let textfieldObject = sender as! UITextField 
let sectionTag = textfieldObject.tag % 100
let rowTag = textfieldObject.tag / 100

let indexPath = NSIndexPath(forRow: rowTag.tag, inSection: sectionTag)
}
0

Если вы знаете номер строки, которые вы обращаетесь и раздел, в котором строка, а затем использовать этот код

let indexPath = NSIndexPath(forRow: row, inSection: section)

Для доступа к ячейке, соответствующей этой indexPath, используйте

let cell = tableView.cellForRowAtIndexPath(indexPath) as! tableViewCell
1

Отказ от ответственности: Это не ответ на поставленный вопрос буквального здесь, но это может обеспечить простое решение для цели ФП в.

Если вам нужно сделать что - то в дополнение к тому , что вы описали в своем вопросе , мне кажется , что гораздо более простое решение было бы не использовать ярлыки на всех , но вместо просто использовать UITextFieldи установить это enabledсвойство ложной , когда вы хотите, чтобы действовать как этикетка.

Вы можете подкласс , UITextFieldесли вам нужно изменить стиль , когда изменения режима.