代码之家  ›  专栏  ›  技术社区  ›  joneswah

从uiSegmentedControl更改视图

  •  1
  • joneswah  · 技术社区  · 17 年前

    我有一个关于NIB和uiSegmentedControls的最佳实践类型的问题。

    我有一个NIB文件,其中包含一个带有3个按钮的uiSegmentedControl。其中每一个都在切换时在窗口的主要部分显示不同的视图。

    一切都很好,但我怀疑我的方法有缺陷,想知道是否有人可以建议我“有意”这样做。

    目前在NIB中我有3个ui视图,它们相互重叠,然后在.m文件中修改每个ui视图。隐藏以隐藏和显示我感兴趣的ui视图。

    - (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文件,所有东西都可以“工作”,但编辑起来很困难,因为你不能轻易地“关闭”其他的ui视图,所以我总是在画布上选择错误的元素。另外,ib抱怨在信息对话框中:“这个视图与它的一个兄弟视图重叠”。

    如果我希望所有视图都显示在InterfaceBuilder中,那么我应该采用什么方法呢?我需要4个NIB文件吗?如果是,当SegmentControl被按下时,我应该如何加载它们?你能给我指点什么样的代码吗?

    谢谢

    2 回复  |  直到 17 年前
        1
  •  2
  •   pxl    17 年前

    从我的头顶上,你可以尝试以下几件事:

    1)在ib中制作3个独立的uiview对象,但不要将它们添加到视图继承关系中。

    假设您有一个视图控制器,其中包含所有三个视图,那么您可以在ib中,通过将每个视图从库拖动到名为yournib.nib或yourxib.xib的窗口来创建三个视图。所以不要将视图拖到视图控制器的主视图中。

    现在,您可以双击每个视图并自己编辑它们,而无需尝试选择不同的视图,因为它们是重叠的(因为它们不是重叠的)。

    在“连接”选项卡中,将视图控制器的“视图”属性连接到其中一个视图。

    这将设置默认值。

    现在,在代码中,您可以更改连接到的视图:

    [MyViewController设置视图:视图2];

    重新加载视图。

    2)创建一个非常高的视图(或非常宽的视图),并在单击“分段视图”按钮时更改视图相对于父视图框架的Y位置,以使用户看起来像要分隔页面一样。

    这使得动画和“视图”之间的转换变得容易。但是会使用更多的内存,因为您已经加载了所有元素,即使它们不可见。但不管怎样,你都在这么做。

        2
  •  1
  •   dstnbrkr    17 年前

    这会像你所拥有的那样有效,但你是对的,它并不理想。在没有任何上下文的情况下,实现这一点的最自然的方法是一个UITabArcController,管理三个UIViewController,每个都有自己的视图。当您切换视图(viewwill/did显示、viewwill/did消失等)时,您将获得所有回调的好处,这样可以更容易地分离NIB文件。回调对于在适当的时间加载/重新加载数据非常有用。