使用iOS从nib动态加载子视图

时间:2012-05-24 04:19:04

标签: iphone objective-c ios

我的应用程序底部有一些标签(UITabViewController),大多数标签页面顶部还有一个工具栏。

用户需要登录才能访问其中一个标签 - 让我们将其称为"我的帐户"标签。一旦他们登录,他们将被显示他们的个人资料信息,或者如果他们还没有设置,那么他们将被显示一个对话,解释填写他们的个人资料的好处以及大按钮说"入门"。所有这三个屏幕底部都有标签,顶部有一个工具栏。所以我制作的视图只占据了屏幕的中间部分 - 因此需要将它们作为子视图加载。实质上,我试图根据用户的当前状态显示三个不同子视图中的一个,并且我需要能够在用户的状态发生变化时彼此切换这些子视图(比如当他们登录时。)

我最初创建了三个独立的"层"对于这些子视图,只是使用setHidden在它们之间切换,但这有一个很大的缺点,即初始化所有3个视图,无论使用哪个视图。当我隐藏/取消隐藏它们时,我也不确定如何设置转换动画。

理想情况下,我想为共享相同的viewcontroller(父控制器)创建三个单独的nib文件(每个视图一个),并根据用户的状态动态加载它们。因此,如果用户未登录,我将加载"登录" nib然后使用addSubView将其添加到屏幕。当用户登录时,我可以加载其他一个nib作为子视图,然后使用动画切换子视图。

我遇到的问题是所有三个子视图都很简单,我只想保留在顶级视图控制器中处理按钮点击的逻辑(" MyAccountViewController" )。例如,我希望能够处理" login"的点击事件。同一视图控制器中的按钮,负责显示用户的配置文件信息。我不想为每个子视图创建单独的视图控制器。

这就是我目前正在做的事情:

- (void)showLoginView {
    UIView *loginView = [[[NSBundle mainBundle] loadNibNamed:@"Login" owner:self options:nil] objectAtIndex:0];
    [self.view addSubview:loginView];
}

它只是在" addSubview"崩溃与EXC_BAD_ADDRESS一致。顺便说一下,它似乎耗尽了内存,可能是由于无限循环或其他原因造成的。我有一种感觉,我在这里解决了解决方案。

我正在尝试做什么?

我也有兴趣了解处理登录屏幕的最佳做法。我在为iPhone应用程序找出最佳工作流程时遇到了很多麻烦。我以前用来编写网络应用程序(是的,登录是必要的 - 这个应用程序与网站绑定)。

谢谢!

编辑:我考虑为每个子视图笔尖编写一个单独的视图控制器。这些视图控制器将处理各自笔尖内的按钮点击,然后使用Objective-C的委托功能将事件传播到父视图控制器,但这需要很多额外的代码。尽可能避免。

1 个答案:

答案 0 :(得分:0)

如果你还没有,我会仔细检查那个nib中的连接和NSLog在索引0处的var类,以确保它是一个UIView。

我的建议:废弃笔尖。如果你不能在代码中做到这一点,为什么甚至打扰?我只使用nib作为布局工具,而不是用二进制打包它们。只需改造UIView子类,节省时间,内存,代码和存储空间。

至于你的登录屏幕创意问题,当我遇到困难时,我会访问Mobile Design Patterns Gallery获取灵感。如果您想要更多... - 我们会说 - 意见,请访问SO的视觉表兄ux.stackexchange.com