2012-04-07 1 views
7

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

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

+1. По крайней мере, вы что-то пробовали. –

ответ

9

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

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

@protocol ViewControllerDelegate 

-(void) updateLabel; 

    @end 

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

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

3) В SettingsView.m IBAction

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

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

@interface ViewController<ViewControllerDelegate> 

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

settingView.viewControllerDelegate=self 
+0

Это работает, если я использую 'UIView' и' UIViewController'. В моем случае 'SettingView' является моим' UIViewController', а мой 'UIView' подобен« ViewController »shebi. Когда я пытаюсь сделать что-то похожее на 'SettingsView.viewControllerDelegate = self' в' 'initWithFrame' UIView', viewControllerDelegate не выполняется автоматически. Он говорит, что свойство не найдено на объекте ViewController. Любая помощь? –

1

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

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

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

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

0

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

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

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

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

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

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

0

Просто объявите, как это в классе SettingsView:

UILabel *lblInSettings;// and synthesize it 

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

settingsVC.lblInSettings=self.myLabel; 

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

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

Сообщите мне, если у вас есть вопросы?

Смежные вопросы