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
этого экземпляра.
у вас есть несколько вариантов.
либо реализовать его как
delegate
обратный вызов (делегировать messagePassing или делегировать уведомление-однако вы хотите его вызвать), чтобы уведомить этот экземпляр класса для вызоваupdateLabel
метод.используйте исходный экземпляр
VC
какdependency injection
в класс, в котором вы находитесь прямо сейчас, и используйте этот экземпляр для вызоваupdateLabel
используйте 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.
Дайте мне знать, если у вас есть какие-либо вопросы?