iPhone - UITextField не редактируется программно при использовании модального диалога?

Я новичок в разработке iPhone, и у меня возникли проблемы с, по-видимому, очень простой вещью.

   - (IBAction) addButtonPressed:(id) sender {

 AddDrinkViewController *addDrinkVC = [[AddDrinkViewController alloc] initWithNibName:@"DrinkDetailView" bundle:nil];
 UINavigationController *addNavCon = [[UINavigationController alloc] initWithRootViewController:addDrinkVC];

 //the textview is not becoming editable here, even thou i'm setting the property to true.
 addDrinkVC.ingredientsTextView.editable = YES;

 [self presentModalViewController:addNavCon animated:YES];

 [addDrinkVC release];
 [addNavCon release];
}

По сути, кнопка [+] нажимается на навигационном контроллере, и появляется модальное представление.

Появляющееся представление расширено из другого представления, в котором изначально текстовые поля и текстовые представления отключены от самого пера.

Я пытаюсь сделать текстовые представления и текстовые поля редактируемыми при нажатии [ + ], но пока мне не повезло.

Я знаю, что это кажется ОЧЕНЬ простым, но я искал в Интернете и не смог найти ответ... может быть, я упускаю что-то очень простое в поведении модальных представлений?

Заранее большое спасибо.


person Hector Villarreal    schedule 04.03.2010    source источник


Ответы (2)


Две вещи:

Предполагая, что текстовое представление было добавлено в контроллер представления с помощью Interface Builder, возможно, вы забыли подключить представление в IB к IBOutlet в своем коде.

Чтобы проверить это, вы можете добавить быстрое утверждение:

NSAssert(addDrinkVC.ingredientsTextView,@"ingredientsTextView in AddDrinkViewController is nil. Did I forget to wire it?")
addDrinkVC.ingredientsTextView.editable = YES;

Если утверждение не выполняется, ваша программа рухнет, и вы увидите это сообщение на консоли.

Во-вторых, я бы переместил логику, которая устанавливает редактируемое свойство, в сам контроллер представления (в вашем случае класс AddDrinkViewController)

      -(void) viewWillAppear:(BOOL) animated {
            [super viewWillAppear:animated];
            NSAssert(addDrinkVC.ingredientsTextView,@"ingredientsTextView in AddDrinkViewController is nil. Did I forget to wire it?")
            addDrinkVC.ingredientsTextView.editable = YES;
}

-or-

-(void) viewDidLoad {
    NSAssert(addDrinkVC.ingredientsTextView,@"ingredientsTextView in AddDrinkViewController is nil. Did I forget to wire it?")
    addDrinkVC.ingredientsTextView.editable = YES;
}
person Brad The App Guy    schedule 04.03.2010
comment
Хороший ответ!!! Попробуйте использовать утверждения, как сказал Брэд Смит :) Это действительно хорошая привычка. - person Manjunath; 04.03.2010

Ваша проблема проста.

Когда вы устанавливаете свойство, этот байт времени не загружается, а все выходы находятся в состоянии заморозки, поэтому для свойства не будет установлено текстовое представление. Поэтому вы просто помещаете эту часть кода в метод viewDidLoad класса AddDrinkViewController.

-(void) viewDidLoad 
{
    [super viewDidLoad];
    addDrinkVC.ingredientsTextView.editable = YES;
}
person Manjunath    schedule 04.03.2010