Попытка обновить UILabel с содержимым UITextField на другом контроллере представления - PullRequest
2 голосов
/ 14 июля 2011

У меня есть два контроллера представления, один - MainViewController, другой - SetupViewController. Я хочу, чтобы UILabel на MainViewController устанавливал текст на содержимое UITextField из SetupViewController при нажатии кнопки в SetupViewController.

В SetupViewController у меня есть это в IBAction:

- (IBAction)donePressed:(id)sender {  
   MainViewController *mvc = [[MainViewController alloc] init]; 
  [mvc.testLabelOnMVC setText:testTextFieldOnSVC.text];
  [release mvc];
}

testLabelOnMVC (и testTextFieldOnSCV, с соответствующими терминами) равно

@property (nonatomic, retain) UILabel *testLabelOnMVC;

и также синтезируется.

Каждый раз, когда я пытаюсь, это не работает. Ничего не происходит, ничего не меняется. У меня нет ошибок или предупреждений. Кто-нибудь может мне помочь?

Ответы [ 5 ]

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

Представление вашего MainViewController не существует, пока вы не обратитесь к свойству MainViewController view (которое заставляет viewDidLoad выполняться).Прежде чем пытаться изменить какие-либо объекты пользовательского интерфейса в MainViewController, вы должны ссылаться на представление (или иным образом принудительно создавать представление).

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

Вы можете изменить текст метки, если вид уже загружен.Вместо инициализации viewcontroller извлеките его из стека представлений, если вы используете контроллер навигации.Я не знаю, если ваш viewController уже загружен или нет.

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

Единственные представления, о которых должен беспокоиться MainViewController, - это те, которыми он владеет; он не должен пытаться получить доступ к иерархии представлений, управляемой SetupViewController. Аналогично, SetupViewController не должен напрямую изменять представления в графе представлений MainViewController.

Правильный способ сделать то, что вы просите, - это чтобы два контроллера общались друг с другом, либо напрямую, либо через модель данных. Например, предположим, что ваш MainViewController создает экземпляр SetupViewController. В этом случае для mvc было бы естественным установить себя в качестве делегата svc, чтобы svc отправлял ему сообщения типа -setupController:didUpdateTestStringTo:. Реализация этого метода в MainViewController может затем сохранить новую тестовую строку и обновить ее поле testLabel.

Другой пример: MainViewController создает экземпляр SetupViewController. SetupViewController содержит поле, в котором пользователь может ввести новое значение для тестовой строки. Перед выходом SetupViewController записывает содержимое этого поля в NSUserDefaults или в другое обычное хранилище данных. Когда элемент управления возвращается в MainViewController, этот объект считывает общие данные и обновляет себя по мере необходимости, включая установку нового значения для testLabel.

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

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

Самый простой способ - создать @property в главном контроллере представления и написать текст там.Затем просто прочитайте его во втором viewCidLoad MVC.

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

Вы выделяете новый MainViewController, когда нажимаете кнопку, затем вы устанавливаете текст метки на этом новом контроллере, а не на MainViewController, который показывает ваше приложение.

Чтобы это исправить, создайте либо IBOutlet, либо iVar, который указывает на оригинальный MainViewController, и установите вместо этого текст.

...