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

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

SettingsView.м

-(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.м

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

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

4 ответов


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

1) В SettingView.h определите такой протокол

 @protocol ViewControllerDelegate

 -(void) updateLabel;

  @end

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

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

3) В SettingsView.м IBAction

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

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

@interface ViewController<ViewControllerDelegate>

5) в viewController.м включают эту строку в viewDidLoad

settingView.viewControllerDelegate=self

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

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

для этого можно использовать делегат mechansim или NSNotification.

mechnaism делегат будет чисто. NSNotification быстро и грязно.


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

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

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

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

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

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


просто объявите так в классе SettingsView:

 UILabel *lblInSettings;// and synthesize it

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

settingsVC.lblInSettings=self.myLabel;

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

Means if you assign at the time of dismissing like
lblInSettings.text=@"My new value";
then self.myLabel also will be updated.

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