Сначала объявите BOOL в вашем .h, чтобы сохранить состояние редактирования.Также объявите временную переменную, которую мы будем использовать позже для хранения выбранной строки.
BOOL isEditing;
NSUInteger selectedRow;
В вашем viewDidLoad инициализируйте логическое значение как NO
- (void)viewDidLoad {
// initialization
isEditing = NO;
[super viewDidLoad];
}
Затем вы можете согласовать свое представлениеконтроллер на UITextFieldDelegate
и UIAlertViewDelegate
.Делегат текстового поля позволяет контроллеру получать обратные вызовы, когда редактирование заканчивается и начинается для текстовых полей, а делегат представления предупреждений позволяет ему получать обратные вызовы, когда просмотр предупреждений отклоняется.
@interface MyController : UIViewController <UITextFieldDelegate, UIAlertViewDelegate>
Затем вам также необходимоустановить все делегаты текстового поля, которые будут назначены контроллеру.Итак, в вашем cellForRowAtIndexPath
при добавлении текстовых полей просто добавьте следующее:
textField.delegate = self;
Получив это, вы все настроены на получение обратных вызовов из текстового поля - так что теперь реализуйте следующие дваметоды, подобные следующим:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
isEditing = YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
isEditing = NO;
}
Теперь ключевым моментом является создание отдельного метода для перехода к следующему представлению, поэтому просто сделайте что-то вроде этого (как вы обычно делаете, когда выбрана строка представления таблицы):
- (void)showNextView {
// in this method create the child view controller and push it
// like you would normally when a cell is selected
// to get the selected row, use the `selectedRow` variable
// we declared earlier.
}
Теперь вам нужно реализовать обратный вызов табличного представления, когда пользователь выбирает строку - в этом методе мы проверяем, редактируют ли они, и показываем им подсказку, если они есть.Если это не так, мы переходим к следующему представлению.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
selectedRow = [indexPath row];
if (isEditing) {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Continue Editing?"
message:@"Continue Editing or discard edits"
delegate:self
cancelButtonTitle:@"Discard"
otherButtonTitles:@"Continue"];
[alert show];
[alert release];
return;
}
[self showNextView];
}
Наконец, нам нужно реализовать обратный вызов делегата для представления оповещений, когда представление оповещений отклонено:
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex != [alertView cancelButtonIndex]) return; // stay editing
[self showNextView];
}
Надеюсь, что все это имеет смысл и полезно для вас!