7

我的项目中有两个视图控制器ViewControllerSettingsView. ViewController's在这里,当我单击SettingsView's后退按钮时,我正在尝试更新标签。NSLog工作正常,但标签没有更新......请帮助我......

设置视图.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];
}

视图控制器.m

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

你能告诉我我的代码有什么问题吗?谢谢!

4

4 回答 4

9

您必须为此实施协议。按照这个:

1)在 SettingView.h 中定义这样的协议

 @protocol ViewControllerDelegate

 -(void) updateLabel;

  @end

2)在.h类中定义属性并在.m类中合成..

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

3) 在 SettingsView.mIBAction

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

4) 在 ViewController.h 中采用这样的协议

@interface ViewController<ViewControllerDelegate>

5) 在 vi​​ewController.m 中包含这一行viewDidLoad

settingView.viewControllerDelegate=self
于 2012-04-07T07:24:45.300 回答
1

您的标签未更新,因为您正在尝试updateLabel使用新实例调用方法。

您应该调用updateLabel您从中呈现模态视图的 viewcontroller 的原始实例。

你可以使用委托机制或 NSNotification 来做同样的事情。

代表机制将是干净的。NSNotification 又快又脏。

于 2012-04-07T07:25:03.303 回答
0

你不完全调用正确的vc. 这是因为您正在创建该类的新实例并调用该updateLabel实例的。

你有几个选择。

  1. 将其实现为delegate回调(委托 messagePassing 或委托通知 - 但是您想调用它)以通知该类实例调用该updateLabel方法。

  2. 将原始实例VC用作dependency injection您现在所在的类,并使用该实例调用updateLabel

  3. 使用 NSNotifications / NSUserDefaults 在 vi​​ewControllers 之间进行通信并为您的操作设置通知系统。这很容易,但从长远来看并不是很好。

我会推荐选项 1(或)选项 2。

于 2012-04-07T07:47:34.347 回答
0

只需在 SettingsView 类中声明如下:

 UILabel *lblInSettings;// and synthesize it

现在在您展示设置视图控制器时分配如下:

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.

如果您有任何疑问,请告诉我?

于 2012-04-07T08:03:39.187 回答