2011-03-24 66 views
1

我正在将现有的Android应用程序移植到iOS,并且在此环境中我很缺乏经验。我浏览过的多个视图的示例都使用某种视觉用户控件来触发视图的加载和卸载(标签栏,导航栏)。此应用程序的导航需要非常严格,不允许用户在三个视图之间自由移动。以编程方式在iOS中导航

该应用程序需要具有全屏幕飞溅视图,用户与之交互的主视图以及用于数据收集的第三个视图。启动屏幕应该出现,并且用户应该在点击飞溅图像时导航到主视图。在主视图控制器中将有自定义逻辑,用于确定数据是否需要在哪个点导航到数据收集视图。输入有效数据后,用户单击确定,它应该导航回主视图。

到目前为止,我读过的所有视图都应该有一个关联的UIViewController类,而简单的方法是创建一个XIB和UIViewController类并将它们连接在一起(我有很多示例/书籍/教程,我可以参考该部分)。我相信我读过的是应用程序应该有一个根UIViewController来处理加载其他人并在它们之间导航。

我的问题是: 我应该从我的主视图控制器派生哪些类来加载其他类? 我如何连接到应用程序,以便它知道加载它作为主控制器? 什么是在应用程序中使用导航控制器并允许其他视图获取对其的引用的公认标准方式?我的UIViewControllers应该持有对其父控制器的引用,还是应该在需要时向UIApplication请求引用它?我如何确保在用户导航时不会实例化视图及其控制器的额外副本?

回答

7

我应该从我用来 负载别人我 主视图控制器中获得什么课?

的UIViewController

如何布线,截至到应用程序,以便 它知道加载这个作为主控制器 ?

阅读the "Defining Your Subclass" section of View Controller Programming Guide for iOS。从头开始 - 阅读整个事情。这很重要,你现在可以开始学习它。另请阅读适用于iOS的应用程序编程指南。再读一遍,但the application lifecycle part是与您的问题最相关的。

什么的 接受的标准的方式具有在 应用导航控制器并允许 其他视图获得对它的引用?

再次,这在视图控制器编程指南中有很好的解释。视图不应该关心导航控制器,但作为导航堆栈一部分的任何视图控制器都可以通过其各自的navigationController属性直接访问导航控制器。

如果我UIViewControllers举行 引用到其父控制器, 或者他们应该问的UIApplication 了对它的引用在需要的时候?

视图控制器已经在其(意外的!)parentController属性中引用其父控制器。尽管如此,对于控制器来说,最好避免过多地假设其父母 。如果控制器希望其父母是特定类型或对特定消息作出响应,则重用该控制器或重新组织应用程序变得更加困难。尝试给控制器创建它时需要做的事情。如果控制器需要额外的数据或类似的东西,委派是一个很好的选择。

我如何确保为用户导航,我不实例化的意见和 额外拷贝他们的 控制器?

谨慎行事。在适当结构化的应用程序中创建额外的视图副本没有太大的危险,因为每个视图控制器应该处理它自己的视图。如果您发现自己正在加载或以其他方式在视图控制器的上下文之外创建视图,请停止该视图。

+0

真棒。那些编程指南正是我所期待的。我宁愿退后一步,在开始之前阅读所有内容,而不是全面了解原因。 – Rich 2011-03-24 16:11:35

+0

哦,真的很好,一切都在指导:页面没有找到!总是在stackoverflow给你的链接到一个网站的内容的简历,一个链接在x时间是毫无价值的。 – Warpzit 2016-08-18 06:22:25

+0

@Warpzit您可能会考虑修复它们,而不是抱怨5-yo答案中的链接断开;不难分辨出它们从URL指向的位置,并且在当前文档中找到相应的内容并不难。但是我已经更新了,所以没关系。我同意总结通常是有帮助的,但在这种情况下,总结文档并且必须省略重要细节对于OP或未来的读者来说是不利的。 – Caleb 2016-08-18 07:31:52

3

不太正确 - 每个UIViewController中应该知道如何触发它的孩子。 Apple通过视图的首选导航路径是一个分支树,其中包含标签栏,可将多个视图控制器合并为树上的单个节点。

您没有明确处理加载。通常,您的NIB之间有充分的关系,即容器类自动加载。然后Cocoa会在需要但尚未加载时(这是loadView和viewDidLoad的目的)加载视图,并保留它们,除非和直到低存储器警告要求它们被清除(导致viewDidUnload)。您自己显式加载NIB的情况相对较少(尽管表视图单元格是编程式加载NIB的常见示例)。

所以你可能有:

  • 一个闪屏或第一视图控制器的预览,作为为Default.png
  • ,可能显示为Default.png视图控制器,并具有两个出口当用户点击主屏幕上的按钮时,去数据采集控制器和主控制器
  • ,询问模型是否需要收集数据。如果是这样,然后导航到数据采集控制器,否则导航到主控制器
  • 给数据采集控制器的输出到主控制器,让它在适当的时刻

你得到一个有执行导航在创建一个新的基于视图的项目时,免费使用MainWindow.xib。可能最简单的做法是将引用放在那里的三个UIViewController子类中,但将其中的每一个设置为从其他文件加载。在MainWindow.xib中设置它们之间的链接,在相关XIB的相关视图中设置链接。

这会阻止你保存任何控制器的多个实例,并且内置的Cocoa加载机制将确保占用大量内存的东西 - 视图 - 仅在需要时加载并且不再保存比空间允许。

没有必要链接到父视图控制器。通过parentViewController属性,每个视图控制器都知道是谁出示了它。所以,如果一个视图控制器要解雇本身并返回到谁提出它,你可以问题:

[self.parentViewController dismissModalViewControllerAnimated:YES]; 

由于模型是理想的一个独立主权的事情,所有的控制器真正需要知道的是,他们可以哪些其他控制器目前,如何从模型中填充自己以及如何将数据推回模型。你很少会在视图控制器之间产生特别复杂的链接。

7

这听起来像你可以完成你需要几个基本的电话。以编程方式调用视图控制器:

- (void)showController { 
    MyViewController *myController = [[MyViewController alloc] initWithNibName:@"MyViewControllerXIB" bundle:nil]; 

    [self.navigationController pushViewController:myController animated:YES]; 
    [myController release]; 
} 

要返回到上一个视图只是从任何视图控制器拨打:

- (void)goBack { 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

阅读弥补了UINavigationController的文件上更多的方式通过视图移动。这种方法只是许多方法之一,并不适用于所有情况。

0

如果应用程序是基于引导的使用下面的代码可以设置视图控制器加载第一 这之前:

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
    MainViewController *mainViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; 
    self.nav = [[UINavigationController alloc] initWithRootViewController:mainViewController]; 
    [_window addSubview:nav.view]; 
    [_window makeKeyAndVisible]; 
    } 

如果是基于应用程序视图使用以下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    { 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
    } 
相关问题