iPhone: как сделать UITextField, UITextView недоступным для редактирования при переключении представлений - PullRequest
2 голосов
/ 01 июля 2011

У меня есть два представления - одно представление таблицы, а другое - подробное представление в приложении iphone.Когда строка в таблице выбрана, отображается подробный вид.

Я использую перо для подробного просмотра для редактирования записи, добавления новой записи и отображения записи.Подробное представление имеет UITextField и UITextView, которые необходимо сделать недоступными для редактирования, когда я просто отображаю запись.В didSelectRowAtIndexPath методе tableview я попробовал это ...

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    MemoDetailViewController *memoDetailViewController = [[MemoDetailViewController alloc] initWithNibName:@"MemoDetailViewController" bundle:nil];

    memoDetailViewController.memo = [self.resultsController objectAtIndexPath:indexPath];

// making the text field and text view uneditable - DID NOT WORK???
        memoDetailViewController.memoTitleText.enabled = NO;
        memoDetailViewController.memoTextView.editable = NO;

    // Pass the selected object to the new view controller.
    [self.navigationController pushViewController:memoDetailViewController animated:YES];
    [memoDetailViewController release];
}

Это не работает.Текстовое поле и uitextview остаются редактируемыми - клавиатура появляется, когда я нажимаю на них.Что мне здесь не хватает?

Ответы [ 6 ]

7 голосов
/ 01 июля 2011

Вероятно, самый простой способ сделать это - использовать их соответствующие методы делегата. Они одинаковые, только с разными именами. Используя UITextField в качестве примера, ваш базовый подход будет следующим:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    if (someCaseWhereYouWantToEdit) {
        return YES;
    } else {
        return NO;
    }
}

Это позволяет вам указать, когда вы хотите, чтобы он продолжал редактировать. Вам, конечно, нужно иметь экземпляры textField и textView с self в качестве их делегата, а также импортировать протоколы делегатов в вашем заголовке

4 голосов
/ 03 мая 2012

Вы даже можете отключить ВЗАИМОДЕЙСТВИЕ ПОЛЬЗОВАТЕЛЯ, ВКЛЮЧЕННОЕ в XIB конкретного элемента пользовательского интерфейса

1 голос
/ 01 июля 2011

Код не работает, потому что представление не было загружено из XIB, и, следовательно, эти свойства nil и обмен сообщениями на nil имеет нулевой эффект. Если сначала изменить порядок на pushViewController, то он должен работать

MemoDetailViewController *memoDetailViewController = [[MemoDetailViewController alloc] initWithNibName:@"MemoDetailViewController" bundle:nil];

memoDetailViewController.memo = [self.resultsController objectAtIndexPath:indexPath];

[self.navigationController pushViewController:memoDetailViewController animated:YES];

memoDetailViewController.memoTitleText.enabled = NO;
memoDetailViewController.memoTextView.editable = NO;

[memoDetailViewController release];

Хотя это работает, я бы предложил объявить свойство BOOL. Установите для него значение YES или NO, а затем используйте его значение в методе viewWillAppear: для включения или отключения полей.

0 голосов
/ 03 мая 2012

Вы должны попробовать это:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{

}
0 голосов
/ 03 мая 2012

Вы также можете использовать это в обоих контроллерах представления в разное время-2

0 голосов
/ 01 июля 2011

Попробуйте это в контроллере вида для вида, который должен быть недоступен для редактирования:

-(void)viewWillAppear:(BOOL)animated {
     memoDetailViewController.memoTextView.editable = NO;
}

-(void)viewWillDisappear:(BOOL)animated {
    memoDetailViewController.memoTextView.editable = YES;
}
...