【问题标题】:Showing a one-time UIViewController via presentModalViewController upon launch在启动时通过 presentModalViewController 显示一次性 UIViewController
【发布时间】:2009-10-28 17:18:01
【问题描述】:

您好!我有一个工作的 iPhone 应用程序(huzzah!),它使用一个 MainView.xib,其中包含一个完整的 UITabBar 和几个 UINavigationController 对象和视图。 p>

现在有人要求我向此组合添加一次性注册视图。此视图将出现在 应用程序启动时的 UITabBar 之前,从用户那里获取一些信息,向服务器注册 - 或检查现有注册,然后将一些数据存储起来在钥匙串中。 (如果钥匙串已经显示了注册证明,那么我们就跳过显示这个特定的视图。)

我已经控制了注册和钥匙串部分(感谢 Erica Sadun 的后者!),但证明最初的一次性视图比我预期的要复杂。

我怀疑我离问题太近了,看不出问题所在。我真的希望这是飞行员的错误,也不需要任何东西 Rube Goldberg!

场景如下:

应用程序首先加载 MainView.xib,其中包含上述 UITabBar 控制器等。人。为了争论,假设我们必须显示注册视图。此外,我们希望它具有模态外观,因此它会从下向上飞入。然后,当我们完成后,我们可以解除它,调用一个委托(很可能是 App Delegate)并告诉它继续原来的 UITabBar

// Normally, the Tab Bar Controller's view is added to the window ... still do this?
[window addSubview:tabBarController.view];

// We could now set up a VC like so. Mostly harmless. (I know, "mvc" is an unfortunate abbreviation in this case.)
RegistrationVC *mvc = [[RegistrationVC alloc] initWithNibName:@"RegistrationView" bundle:nil];

请注意,RegistrationView.xib 内部有一个 UIView,但没有导航控制器。我们希望将其保持分离,以便可以重复使用它,例如,作为标签栏项目导航控制器的一部分(例如,查看您的注册信息)。

继续前进。我们创建了一个导航控制器,旨在以模态方式呈现事物:

UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:mvc];

然后我们展示我们的模态VC,使用标签栏控制器作为基础,并释放分配的位。

[tabBarController presentModalViewController:nc animated:YES];
[nc release];
[mvc release];

第一次观察。有人告诉我,这简直是草率。您可以看到第一个标签栏项目的导航栏和视图就像模态视图一样出现。Yeccch!此外,尝试预先将选定的 VC 设置为 nil 无效:

 tabBarController.selectedViewController = nil;

在模态 VC 完成之后之前,我们真的不想/不需要使用标签栏(并且当发生这种情况时,我们有委托帮助我们知道)。

为什么我还要使用标签栏?好吧,看来我需要一些东西来挂那个模态VC的帽子,我不知道还有什么可以用的。

这是唯一的方法吗?它似乎只是不必要地束缚了注册 VC 和选项卡栏,而且闻起来……不对。

欢迎/赞赏线索!

【问题讨论】:

    标签: iphone uiviewcontroller uitabbarcontroller modal-dialog uiapplicationdelegate


    【解决方案1】:

    如果不知道您的 Default.png 显示什么,很难回答这个问题。假设您正在关注 HIG 并且它显示一个空的 tabBarController,我建议您进行一些复杂的分层: 底视图:tabBarController.view 中间视图:UIImageView:Default.png 顶视图:位于屏幕底部下方的注册视图

    在启动时,如果您需要显示注册视图,请手动将其向上设置动画,并在动画完成后移除其下方的 UIImageView。注册完成后,手动将注册视图向下动画以显示 tabBarController。如果在启动时不需要注册视图,只需将 UIImageView 动画化为淡出(或将其移除)。

    OTOH 手,如果您不关注 HIG 而是显示某种闪屏,事情会变得容易一些。像这样的层: 底视图:tabBarController.view 顶视图:UIImageView:Default.png

    如果您需要显示注册,请使用动画:NO 执行 presentModalViewController,然后淡出 UIImageView。如果没有,只需淡出 UIImageView。

    这是一个没有图片的冗长解释,希望它有意义。重点是我建议添加一个 UIImageView:Default.png 作为应用程序启动时看到的第一件事,并使用它来指导您适当地过渡到注册或 tabBarController。

    【讨论】:

    • 谢谢尼尔!我应该澄清一下:它不遵循 HIG(启动画面 - 我知道,嘘声)。我已经对标签栏进行了淡出处理(请参阅is.gd/4GnwP)。所以 - 我们现在淡入一个临时的“欢迎”VC,它是一个静音版本的启动画面(只是一个图像视图,状态栏向下轻推 20 像素)。从那里我们暂停一下,抛出一个欢迎警报,显示模态 VC(带有动画!)。在那之后,我们回到了临时 VC。再一次感谢您,然后是最后的展示,将带有最终淡出的标签栏引入主应用程序。哇!现在很好玩。也重新阅读你的方法。谢谢!!
    • 好的!我重新阅读你的帖子只是为了确保我理解。在屏幕外注册视图(向上/向下执行手动动画)时,导航栏(控制器?)在哪里适合?我总是习惯于将 VC 推到导航控制器上,我认为这就是我之前绊倒的地方。没有地方可以挂那个 VC,模态的或其他的,这就是为什么我现在有这个临时视图控制器(而不是等待在机翼中的选项卡栏控制器)。但我明白你所说的,分层不是基本的。啊,我们为 UE 做的事情。 :)
    • 好吧,你可以只使用普通的旧视图,而不是 ViewController。还是因为某些原因需要将注册信息放在 ViewController 中,比如需要一个导航栏?
    • 尼尔 - 首先我很抱歉在回复这个问题时丢球! (我刚刚收到的另一封电子邮件唤醒了我的记忆。)对于您关于使用普通旧视图的后续行动,您成功了。我最终采取了一个包含导航栏和其他好东西的普通视图,并将其作为子视图添加到 window.xml 中。当这个新的 VC 处理绕道时,应用程序代表稍作休息。完成后,我们关闭了视图的动画,我们告诉应用程序委托,它会关闭并恢复启动。我怀疑这不是最干净的路线(阅读:我可以做得更好),但它可以完成工作!再次,非常感谢。
    • @Joe 我追求几乎相同的功能。但是,我需要在点击中间标签栏项目时将 VC 显示为模态。我基本上做了你在原始问题中提到的事情,但是我想知道我将如何实现你的代码。我仍然需要一个取消导航栏按钮来关闭模式视图。我遇到了用空白视图选择标签栏项目的问题,这很烦人。很多条码扫描应用都能成功,但我不知道他们是如何实现的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 2011-04-13
    • 1970-01-01
    相关资源
    最近更新 更多