iPhone更新视图

时间:2010-08-14 20:48:27

标签: iphone objective-c uiviewcontroller

我正在尝试考虑更新视图来解决问题。 首先,我使用以下方法切换到另一个视图:

- (void)viewSettings {
 settingsViewController = [[SettingsViewController alloc] initWithNibName:nil bundle:nil];
 [[self viewController] presentModalViewController:settingsViewController animated:YES];}

这是由

调用的委托方法
ivaskAppDelegate *mainDelegate = (ivaskAppDelegate *)[[UIApplication sharedApplication] delegate];
 [mainDelegate viewSettings];

我通过调用另一个dellegate方法切换回来

- (void)settingsDone {
 [[self viewController] dismissModalViewControllerAnimated:YES];}

当我回到我的观点时,我现在想要更新标签,你能解释一下如何做到这一点吗?

我使用的NIB文件在身份检查器中连接了控制器类和视图类。

/ N

3 个答案:

答案 0 :(得分:1)

您需要设置一个在主视图控制器中实现的委托(您需要更新标签),并从设置视图控制器调用该委托。我有一篇博客文章描述了如何做到这一点:

http://www.dosomethinghere.com/2009/07/18/setting-up-a-delegate-in-the-iphone-sdk/

答案 1 :(得分:1)

虽然在这种情况下我强烈建议代表团,但我还有另外两种选择:通知和KVO。

通知

每当更改设置时,设置视图控制器都可以发布通知,让应用的其他部分知道此更改。发布通知很简单:

[[NSNotificationCenter defaultCenter]
      postNotificationName:@"SettingsChangedNotification" object:theNewSettings];

以某种方式想要了解设置更改的每个对象都可以通过以下方式订阅该通知:

//Subscribe (in viewDidLoad or init)
[[NSNotificationCenter defaultCenter]
          addObserver:self selector:@selector(settingsChanged:)
          name:@"SettingsChangedNotification" object:nil];

// Called when a "SettingsChangedNotification" is posted
- (void)settingsChanged:(NSNotification*)settingsChangedNotification {
    id newSettings = [settingsChangedNotification object];
}

//Unsubscribe (in viewDidUnload or dealloc)
[[NSNotificationCenter defaultCenter]
          removeObserver:self name:@"SettingsChangedNotification" object:nil];

请参阅Notification Programming Topics

如果您尝试使用settingsViewController管理UserDefaults,那么还有更好的方法。只需在sharedUserDefaults上设置值,应用程序就会自行发布NSUserDefaultsDidChangeNotification个通知。依赖于用户设置的所有对象都可以订阅该通知,并在发布后重新读取userDefaults。

键值观察(KVO)

你的rootViewController可以通过键值观察来观察它需要与之同步的对象的变化。

一个对象通过向其发送addObserver:forKeyPath:options:context:消息将自身注册为其他对象上的keyPaths的观察者。通过observeValueForKeyPath:ofObject:change:context:回调方法通知对象更改。 KVO有时可能很难做到正确,因为在对象被取消分配之前,您必须确保注册和取消注册相同的次数。

请参阅Key-Value Observing Programming Guide

结论

请不要在app-delegate上使用“全局”变量。有足够的可能做得更好。你越早深入研究它们,你就会写出更好的代码。

答案 2 :(得分:0)

您可以使视图控制器符合您创建的协议。在这种情况下,它可能被命名为SettingsDelegate。该协议包含一条消息- (void)didFinishSettingsWithSomeNewValue:(id)newValue;

Settings Controller有一个委托实例变量和一个id<SettingsDelegate>

类型的属性

在显示设置viewController之前,您将父视图控制器分配给delegate属性。在设置视图控制器中,您向委托(父视图控制器)发送didFinishSettingsWithSomeNewValue:消息以及一些新值。父视图控制器实现该方法,并且在实现内部可以关闭模​​态控制器并更新自身的任何视图。