如何使用UISegmentedControl切换视图?

Mar*_*ams 82 iphone objective-c uisegmentedcontrol ios

我正试图弄清楚如何使用UISegmentedControl的不同状态来切换视图,类似于Apple在"顶级付费"和"顶级免费"之间切换时在App Store中的操作方式.

Ron*_*iew 112

最简单的方法是使用两个视图来切换其可见性以指示已选择哪个视图.下面是一些关于如何完成它的示例代码,绝对不是处理视图的优化方法,而只是为了演示如何使用UISegmentControl来切换可见视图:

- (IBAction)segmentSwitch:(id)sender {
  UISegmentedControl *segmentedControl = (UISegmentedControl *) sender;
  NSInteger selectedSegment = segmentedControl.selectedSegmentIndex;

  if (selectedSegment == 0) {
    //toggle the correct view to be visible
    [firstView setHidden:NO];
    [secondView setHidden:YES];
  }
  else{
    //toggle the correct view to be visible
    [firstView setHidden:YES];
    [secondView setHidden:NO];
  }
}
Run Code Online (Sandbox Code Playgroud)


您当然可以进一步重新调整代码以隐藏/显示正确的视图.

  • "绝对不是处理观点的优化方式" - 为什么? (4认同)
  • @AdamWaite因为所有视图都必须永久存储在内存中.如果您的视图过于复杂和/或包含许多其他元素,则会影响整体性能.这段代码也可以重构. (3认同)

Mar*_*c M 45

在我的情况下,我的观点非常复杂,我不能只改变不同视图的隐藏属性,因为它会占用太多内存.

我已经尝试了几种解决方案,并且它们不适用于我,或者执行不正常,特别是在推送/弹出视图时,navBar的titleView并不总是显示segmentedControl.

我发现这篇关于该问题的博客文章解释了如何以正确的方式做到这一点.似乎他在2010年WWDC上得到了苹果工程师的帮助,想出了这个解决方案.

http://redartisan.com/2010/6/27/uisegmented-control-view-switching-revisited

此链接中的解决方案是我迄今为止发现的有关此问题的最佳解决方案.通过一点调整,底部的tabBar也可以正常工作

  • 幸运的是,_ [实现容器视图控制器](http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926- CH3-SW81)_完美无缺!即使segues按预期工作. (2认同)

los*_*sit 17

或者,如果是表,则可以重新加载表,并在cellForRowAtIndex中,根据所选的段选项从不同的数据源填充表.


Ken*_*ner 7

一个想法是让具有分段控件的视图具有容器视图,您可以使用不同的子视图填充(在切换段时添加为容器视图的唯一子视图).你甚至可以为这些子视图设置单独的视图控制器,但如果你需要它们,你必须转发重要的方法,如"viewWillAppear"和"viewWillDisappear"(并且必须告诉他们它们所属的导航控制器).

通常情况下效果很好,因为您可以在IB中布置带容器的主视图,子视图将填充容器允许的任何空间(确保正确设置自动调整大小的掩码).


Son*_*iya 7

试试这段代码,这将帮助您在更改Segment COntrol片段的不同视图之间切换

在选择UISegmentControl的不同段时打开不同的视图