关于Nibs和UISegmentedControls,我有一个最佳实践类型的问题。
我有一个nib文件,其中包含一个带3个按钮的UISegmentedControl。当切换时,每个视图在窗口的主要部分显示不同的视图。
一切都运转良好,但我怀疑我的方法存在缺陷,并且想知道是否有人可以建议我“意味着”这样做。
目前在NIB中我有3个UIViews叠加在一起,然后在.m文件中我修改每个UIViews .hidden隐藏并显示我感兴趣的那个。
- (IBAction)segmentAction:(id)sender
{
if([sender selectedSegmentIndex] == 0)
{
[self.view1 setHidden:NO];
[self.view2 setHidden:YES];
[self.view3 setHidden:YES];
}
else if([sender selectedSegmentIndex] == 1)
{
[self.view1 setHidden:YES];
[self.view2 setHidden:NO];
[self.view3 setHidden:YES];
}
else if([sender selectedSegmentIndex] == 2)
{
[self.view1 setHidden:YES];
[self.view2 setHidden:YES];
[self.view3 setHidden:NO];
}
}
一切都“有效”但是nib文件很难编辑,因为你不能轻易地“关闭”其他UIViews所以我总是在画布上选择错误的元素。 IB也抱怨:“这个视图与其中一个兄弟姐妹重叠”在信息对话框中。
鉴于我希望所有视图都在InterfaceBuilder中进行布局,我应该采取什么方法。我应该有4个nib文件吗?如果是这样,我应该在按下segmentControl时加载它们?您可以指示我的任何示例代码吗?
感谢
答案 0 :(得分:2)
在我的脑海中,您可以尝试以下几种方法:
1)在IB中制作3个单独的UIView对象,但不要将它们添加到视图中#irapchy
假设您有一个视图控制器,其中包含所有三个视图,您可以在IB中通过将每个视图从库拖动到标题为YourNib.nib或YourXib.xib的窗口来创建3个视图。因此,请勿将视图拖动到视图控制器的主视图中。
现在你可以双击每一个并自己编辑它们,而不必尝试选择不同的视图,因为它们是重叠的(因为它们不是)
在“连接”选项卡中,将视图控制器的视图属性连接到其中一个视图。
这会设置默认值。
现在在您的代码中,您可以更改连接到的视图:
[myViewController setView:view2];
并重新加载视图。
2)制作一个非常高的视图(或非常宽的视图),并在单击分段视图按钮时更改视图的y位置,使其对用户显示为好像他们'重新分开页面
这使得在“视图”之间进行动画和转换变得容易。虽然会占用更多内存,因为即使它们不可见,也会加载所有元素。但无论如何你都是这样做的。
答案 1 :(得分:1)
这会像你拥有它一样有效,但你说得对它并不理想。没有任何上下文,实现它的最自然的方法是管理三个UIViewControllers的UITabBarController,每个UIViewControllers都有自己的视图。当你切换视图(viewWill / DidAppear,viewWill / DidDisappear等)时,你将获得所有回调的好处+更容易分离你的nib文件。回调对于在适当的时间加载/重新加载数据非常有用。