Xcode – обновить текст метки ViewController с другого вида

У меня есть два controllerа вида в моем проекте ViewController , SettingsView . Здесь я пытаюсь обновить ViewController's , когда я нажимаю кнопку возврата в SettingsView's . NSLog работает нормально, но ярлык не обновляется … Пожалуйста, помогите мне ….

SettingsView.m

 -(IBAction)backToMain:(id) sender { //calling update function from ViewController ViewController * vc = [[ViewController alloc]init]; [vc updateLabel]; [vc release]; //close the SettingsView [self dismissModalViewControllerAnimated:YES]; } 

ViewController.m

 - (void)updateLabel { NSLog(@"Iam inside updateLabel"); self.myLabel.text = @"test"; } 

Не могли бы вы рассказать мне, что случилось с моим кодом? Спасибо!

Для этого вам необходимо выполнить протоколы. Следить за этим:

1) В SettingView.h определите протокол, подобный этому

  @protocol ViewControllerDelegate -(void) updateLabel; @end 

2) Определить свойство в classе .h и синтезировать в classе .m.

  @property (nonatomic, retain) id  viewControllerDelegate; 

3) В SettingsView.m IBAction

  -(IBAction)backToMain:(id) sender { [viewControllerDelegate updateLabel]; } 

4) В ViewController.h принимайте протокол, подобный этому

 @interface ViewController 

5) В viewController.m включить эту строку в viewDidLoad

 settingView.viewControllerDelegate=self 

Ваш ярлык не обновляется, потому что вы пытаетесь вызвать метод updateLabel с новым экземпляром.

Вы должны вызвать updateLabel исходного экземпляра viewcontroller, из которого вы представили свое модальное представление.

вы можете использовать делегат mechansim или NSNotification, чтобы сделать то же самое.

Делегированный механизм будет чистым. NSNotification является быстрой и грязной.

Вы не называете правильный vc . Это связано с тем, что вы создаете новый экземпляр этого classа и вызываете updateLabel этого экземпляра.

У вас есть несколько вариантов.

  1. Либо реализуйте его, либо delegate callBack (делегирование messagePassing или делегирование уведомления, но вы хотите его вызвать), чтобы уведомить этот экземпляр classа, чтобы вызвать метод updateLabel .

  2. Используйте исходный экземпляр VC как dependency injection в class, который вы сейчас используете, и используйте этот экземпляр для вызова updateLabel

  3. Используйте NSNotifications / NSUserDefaults для связи между viewControllers и настройки системы уведомлений для ваших действий. Это довольно просто, но не очень здорово в долгосрочной перспективе.

Я бы рекомендовал вариант 1 (или) вариант 2.

Просто объявляйте это в classе SettingsView:

  UILabel *lblInSettings;// and synthesize it 

Теперь присвойте, как показано ниже, при представлении настроек viewController:

 settingsVC.lblInSettings=self.myLabel; 

Затем, независимо от того, что вы обновляете в lblInSettings, оно будет присутствовать в MainView, очевидно …. нет необходимости в каких-либо методах делегата или методах обновления.

 Means if you assign at the time of dismissing like [email protected]"My new value"; then self.myLabel also will be updated. 

Дайте мне знать, если у вас есть какие-либо вопросы?

  • Как распечатать имя метода и номер строки и условно отключить NSLog?
  • objective-C - Когда использовать «я»,
  • Лучший способ сохранить данные на iPhone
  • Получить значение RGB из пресетов UIColor
  • Ошибка UICollectionView Assertion
  • Как вы вычисляете день года на определенную дату в Objective-C?
  • Как создать одноэлементный class в объекте C
  • Заголовок Swift для Objective-C, не созданный в Xcode 6
  • Перемещение UIView (изображение и текст)
  • Преобразование миллисекунд в NSDate
  • Пейзажный режим ТОЛЬКО для iPhone или iPad
  • Давайте будем гением компьютера.