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

时间:2009-05-05 22:58:25

标签: iphone objective-c uiwebview message

我正在制作一个简单的标签栏iPhone应用程序。它有两个选项卡,一个带有UIWebView,另一个带有几个用于保存设置的文本字段,还有一个用于保存设置的按钮。

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

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

5 个答案:

答案 0 :(得分:5)

您在UITabBarController框架内使用这两个视图的事实与问题的核心无关;也就是说,您希望您的申请的一部分被告知另一部分发生了某些事情。这样做的典型方法是使用KVO,或使用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];

答案 1 :(得分:4)

我所做的就是让他们通过AppDelegate互相交流。

例如:

View1将具有以下功能:

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

MyAppDelegate有一个名为myFunction的函数,可以执行某些操作,或者调用:

[viewController myViewFunction];

我已经设置了一个非常好的系统来加载多个视图(并来回导航,好像它们是不同的屏幕)。我只是没有时间写这篇文章并将其发布到pushplay.net - 但我会在接下来的几天内尝试这样做......

===

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

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

我理解下面的评论者所说的内容,但我还没有看到一个无缝工作的示例,基于多个视图控制器需要在彼此之间导航。

答案 2 :(得分:1)

这取决于特定应用程序的复杂性和该应用程序中的对象模型:

  • 如果视图相关且消息仅与视图相关,则他们可以直接发送彼此的消息。例如,视图可以(并且应该)将消息直接发送到它的子视图,并且它们可以直接向其父视图发送消息。

  • 如果他们的观点不相关但显示有关相同信息的数据,您应该通过viewController代理消息 - 这是您拥有视图控制器的原因。

  • 如果您的应用程序具有强大的MVC架构,则应通过更新模型对象并通过其viewControllers将其级联到视图来间接完成通信。

答案 3 :(得分:1)

在这种情况下,您可能最好让您的应用程序委托在应用程序启动时将控制器保持Web视图作为其他视图控制器的委托 - 请考虑使用协议使其保持干净,但对于简单的事情您总是可以将委托类型声明为包含视图控制器的Web视图。

通知也是一个好主意,没有任何任务对他们来说太小 - 但你应该知道在dealloc这样的地方取消订阅通知很重要。对于标签栏视图控制器的顶级,但实际上并不重要。

答案 4 :(得分:0)

您始终可以在选项卡视图控制器中设置指向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

此致

凯尔