简体   繁体   中英

UITextField within UITableViewCell — programmatically make it firstResponder when it comes on screen?

I have a UITableView with a UITextField inside of each cell. A model object that stores the index of the cell that is currently being edited. If the cell scrolls off-screen, my app takes away first-responder status. (Failing to do so may cause problems). Now, suppose a cell (possibly the same one, or possibly a different one) corresponding to that index is about to scroll back onto the screen. I want to make that cell's textField the firstResponder. My delegate does receive a call

tableView: willDisplayCell: forRowAtIndexPath:

corresponding to the new cell. However, calling becomeFirstResponder: at that point does not help as the cell won't accept firstResponder status until it has been displayed.

Short of using a timer, any ideas for how to call becomeFirstResponder: at a point when the cell is in fact able to become the first responder?

EDIT: cellForRowAtIndexPath: is always called before willDisplayCell:. So no help there.

I haven't tried this, but the first thing I'd try is in cellForRowAtIndexPath...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // standard stuff to build cell and setup it's state

    if ([indexPath isEqual:self.myModel.indexPathOfTextFieldBeingEdited]) {
        // you probably have a handle to the text field from the setup above
        UITextField *textField = (UITextField *)[cell viewWithTag:SOME_TAG];
        [textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
    }
    return cell;
}

You have to show cell on the screen to make it as first responder. Do at first:

[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:NO];

and then call first responder on it's label/textField.

Here's what I did in MonoTouch - it's important that you do not animate the ScrollToRow() - ie "animated:NO" as shown in the answer by edzio27 (thanks edzio27 :) ).

var newCell = (UIOrderLineCell)tableView.CellAt(newIndexPath);
if (newCell == null)
{
    tableView.ScrollToRow(newIndexPath, UITableViewScrollPosition.Middle, false);
    newCell = (UIOrderLineCell)tableView.CellAt(newIndexPath);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM