Xcode - обновляет текст метки ViewController из другого представления

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

SettingsView.m

<code>-(IBAction)backToMain:(id) sender {

  //calling update function from ViewController
    ViewController * vc = [[ViewController alloc]init];
    [vc updateLabel];
    [vc release];

  //close the SettingsView 
    [self dismissModalViewControllerAnimated:YES];
}
</code>

ViewController.m

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

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

 rohan-patel07 апр. 2012 г., 11:06
+1. По крайней мере, вы что-то пробовали ..

Ответы на вопрос(4)

Просто объявите так в классе 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.

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

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

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

Either implement it as a delegate callBack (delegate messagePassing, or delegate notification - however you want to call it) to notify that class instance to call the updateLabel method.

Use the original instance VC as a dependency injection into the class that you are on right now, and use that instance to call the updateLabel

Use NSNotifications / NSUserDefaults to communicate between viewControllers and setup a notification system for your actions. This is quite easy, but not really great in the long run.

Я РЕКОМЕНДУЮ вариант 1 (или) вариант 2.

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

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

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

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

Решение Вопроса

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

1) В SettingView.h определите протокол следующим образом

 @protocol ViewControllerDelegate

 -(void) updateLabel;

  @end

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

    @property (nonatomic, retain) id <ViewControllerDelegate> viewControllerDelegate;

3) В настройках View.mIBAction

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

4) В ViewController.h принять такой протокол

@interface ViewController<ViewControllerDelegate>

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

settingView.viewControllerDelegate=self
 12 мая 2015 г., 01:16
Работает ли это, если я используюUIView а такжеUIViewController, В моем случае,SettingView мойUIViewController, и мойUIView это как ШебиViewController, Когда я пытаюсь сделать что-то похожее наSettingsView.viewControllerDelegate = self в моемUIView& APOS; sinitWithFrame, viewControllerDelegate не заполняется автоматически. Он говорит, что свойство не найдено на объекте ViewController. Любая помощь?

Ваш ответ на вопрос