我已经在这个问题上工作了两天了。我正在开发一款iPhone应用程序,目前它具有“双层”视图(见图片)。覆盖屏幕左三分之一的半透明橙色面板是通过简单调整子视图的大小来创建的(在IB中)占据不到一半的屏幕,以便在该视图加载时,原始视图仍然在右侧显示。这将允许左视图成为“菜单视图”,允许用户选择他或她想要在主视图窗口中显示的内容(实际上是UIWebView
...参见屏幕截图。)< / p>
----- Click Here For Screen Shot-----
如果我要保持这种设置(假设它不是结构性罪),左视图显然需要一种与主视图通信的方法。我可以调用main-wiew“.m”文件(WebViewController.m)中的方法,如viewDidLoad
和其他来自橙色子视图中“ETG”按钮的方法吗?或者这只是一个非常糟糕的主意?如果这不是一个坏主意或对iPhone结构犯罪,你将如何实现它?我会提前感谢您提供任何有用的想法或建议。谢谢!
答案 0 :(得分:1)
如果您遵循模型 - 视图 - 控制器模式(通常应该这样),那么您的视图应该向控制器发送消息或修改模型,而不是另一个视图。虽然这取决于你在做什么。在您的情况下,您使用面板作为控件,因此您应该以一种独立于其他视图的方式实现。
通常情况下,只有你有视图直接操纵其他视图才会在布局中,而这通常是自上而下的。
同样,这些是一般规则,并且总是有例外。
答案 1 :(得分:0)
你所描述的内容似乎并不疯狂,但他们与主视图交谈的方式可能需要一些工作。
看起来你想要做的是让覆盖视图有一个它可以发送消息的委托。这看起来对你有用吗?
答案 2 :(得分:0)
一个包含两个主要区域的视图控制器。一个是你的UIWebView,另一个是你的停留。如果在Interface Builder中执行此操作,请将Layover置于UIWebView的顶部。
您所要做的就是根据特定输入对其进行动画制作。一个坏主意是说“隐藏菜单”并让UIWebView占用所有空间,所以你无法取回它。
然后使用一个视图控制器。
视图控制器之间通信的推荐方法(如果是子视图)是在视图控制器中创建可以传递的属性。例如:Web视图需要告诉主视图它所在的站点。因此,将NSString作为属性放在主控制器中,然后将其传递给viewWillDisappear上的字符串或任何名称。
(或者,在顶层使用viewWillAppear并让它从第二个视图中获取该属性)。
本质上它只是一个分支树,你必须将数据传递到一个节点才能到达其他节点。
您“可以”使用应用程序的委托本身/(应用程序),并从任何地方调用[UIApplication sharedApplication] .property(在创建属性之后),并将其用作全局,但这不被视为可重用代码。既然你已经习惯了基础,那么它可能适合你。
最后,C ++全局变量确实有效,并且Web上有很多例子可以在带有externs的iPhone程序中使用全局变量。 (甚至更少推荐)。
现在,听起来您需要阅读“视图编程指南”,即使它在区域中存在严重的语法问题(他们可能已经在前面的第3段中更正了同音异义词,但其他区域完全令人困惑,因为为了理解视图如何响应输入,以及当忽略输入并在树中冒泡时会发生什么。 (这基本上就是它的作用,大声笑......但是层和视图有复杂性,理解它们以及它们如何一起工作是很好的。)
不,这不是一个坏主意。但是,在你不了解图层,查看动画和设计之前,可能会这样做。
NazCode
答案 3 :(得分:0)
如果我理解你要做什么,一种方法是使用通知。这样,所涉及的对象都不需要彼此引用。在我学习这种方法之前,我遇到了几个尴尬的案例,我似乎只是为了让两个物体彼此交谈而工作太多。
在您的情况下,您的橙色图层可以发布通知,UIWebView的控制器可以监听它们。
因此,当您点击橙色图层中的按钮时,请执行以下操作:
[[NSNotificationCenter defaultCenter] postNotificationName:@"etgTapped" object:self];
在监视webview的控制器中,向viewDidLoad方法添加类似这样的内容:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(etgTapped:) name: @"etgTappe" object:nil];
然后在该类中创建一个etgTapped:(NSNotifaction *)通知方法。
最后,在viewDidUnload中取消注册通知中心:
[[NSNotificationCenter defaultCenter] removeObserver:self];