iPhone应用程序 - 一个View如何在另一个View中调用方法?

问题描述:

我正在做一个简单的标签栏iPhone应用程序。它有两个选项卡,一个具有UIWebView,另一个具有几个用于保存设置的文本字段,以及一个用于保存设置的按钮。iPhone应用程序 - 一个View如何在另一个View中调用方法?

我想要做的是当用户点击保存设置选项卡/视图时重新加载UIWebView。我已经保存了设置,我只需要弄清楚如何进行调用以使UIWebView自行刷新。

我对视图如何将消息发送到另一个视图感到困惑。

我所做的是让他们通过AppDelegate彼此交谈。

例如:

视图1将有确实的功能:

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    [appDelegate myFunction]; 

MyAppDelegate有一个函数调用myFunction的是要么做一些事情,或致电:

[viewController myViewFunction]; 

我已经建立了一个相当不错的系统来加载多个视图(并来回导航,就好像它们是不同的屏幕一样)。我只是还没有作出时间来写这件事,并张贴到pushplay.net - 但我会尝试在未来几天内这样做......

===

编辑:好的,我发布了我的内容。任何意见将不胜感激。

http://pushplay.net/blog_detail.php?id=27

我明白下面的评论者在说什么,但我还没有看到,无缝工作的基础上,有多个viewcontrollers需要相互之间进行导航的例子。

+0

谢谢,这是有道理的。当您的帖子详细显示时,请务必在这里发帖。 – Greg 2009-05-05 23:07:51

+0

您不应该需要使用应用程序委托将消息代理到其他视图中。这是视图控制器的用途。 – 2009-05-06 05:52:38

+0

这是正确的_kind_代码,但你应该在viewController中做,就像Nathan说的那样。尽量不要添加更多的appDelegate需求。它将变得足够大,只需要拥有它需要的东西。 – 2009-05-06 06:22:20

事实上,你在UITabBarController的框架中使用这两个视图与问题的核心无关;即你希望你的应用程序的一部分被告知另一部分发生了某些事情。这样做的典型方式是国际志愿者组织,或通过使用NSNotificationCenter像这样:

// Register interest in finding out when the settings are changed 
[[NSNotificationCenter defaultCenter] addObserver:myWebViewController 
    selector:@selector(refreshWebView:) name:@"settingsSaved" object:nil]; 

// Notify interested parties that the settings have changed 
[[NSNotificationCenter defaultCenter] postNotificationName:@"settingsSaved" object:nil]; 
+0

除了我认为KVO和通知听起来像这个问题的矫枉过正 – 2009-05-06 06:23:05

这取决于具体应用的复杂性,并在该应用程序的对象模型:

  • 如果视图是相关的,并且只与视图相关的消息,然后它们可以直接发送其他消息。例如,一个视图可以(也应该)直接将消息发送给它的子视图,并且它们可以直接发送消息给它们的父级。

  • 如果他们的意见不相关,但显示有关相同信息的数据,你应该通过viewController代理消息 - 这是为什么你有一个视图控制器。

  • 如果你有一个强大的MVC体系结构的复杂应用程序,通信应该通过更新模型对象并通过它们的viewControllers将它们级联到视图间接完成。

在这种情况下,你可能会更好过让你的应用程序代理分配控制器拿着Web视图作为您其他视图控制器的应用推出了委托 - 考虑使用的协议,使其干净,但对于简单的事情,你总是可以将委托类型声明为拥有视图控制器的Web视图。

通知也是一个好主意,对他们来说没有太小的任务 - 但您应该意识到在dealloc等地方取消订阅通知非常重要。对于标签栏视图控制器的顶层,虽然并不重要。

您始终可以在指向Web视图的选项卡视图控制器中设置一个实例变量。只需将其设置为IBOutlet,将其挂接到Interface Builder中,然后在实例变量上调用您的方法。

.h文件中:

IBOutlet UIWebView *webView; 

@property (nonatomic, retain) UIWebView *webView; 

.m文件:

@synthesize webView; 

//Then later in your method 
[webView refresh]; //or however you do it 

问候,

凯尔