更改 UISegmentedControl 的选定段

Posted

技术标签:

【中文标题】更改 UISegmentedControl 的选定段【英文标题】:Change selected segment of UISegmentedControl 【发布时间】:2013-02-15 12:03:14 【问题描述】:

我的ModeViewController 中有一个UISegmentedControl

ModeViewController.h:

@property (weak, nonatomic) IBOutlet UISegmentedControl *Segment;
- (IBAction)switchMode:(id)sender;

ModeViewController.m:

- (IBAction)switchMode:(id)sender 
    //I Tried this way    
    UISegmentedControl *segmentedControl = (UISegmentedControl *) sender;
    _Segment.selectedSegmentIndex = segmentedControl.selectedSegmentIndex;


//or this way
NSInteger selectedSegment = segmentedControl.selectedSegmentIndex;
[_Segment setSelectedSegmentIndex:selectedSegment];


但是一旦我更改为ViewController 并返回它只会显示默认选择的段!有什么想法吗?

【问题讨论】:

该属性必须是strong 他正在使用IBOutletweak 很好 【参考方案1】:

在您更改视图控制器并返回 viewDidLoad 方法后,再次调用这就是您看到默认选定索引的原因。解决这个问题的方法是将选定的选定索引存储到某个应用程序委托属性中,或者您可以创建单例类以更好地设计以保留状态。并且在您的 viewDidLoadMethod 中。

-viewDidLoad

  AppDelegate *delegate=[[UIApplication sharedAppliection]delegate];
  [_Segment setSelectedSegmentIndex:delegate.selectedIndex];

这对你有用。

【讨论】:

我的 AppDelegate 中有一个 NSInteger,我将索引保存在其中!每次我进入 ViewDidLoad 我都会设置 selectedSegment【参考方案2】:

问题

这里的问题是,当 Viewcontroller 以模态方式呈现时,它内部的属性只有生命周期,直到它被解除。

检查您的代码,将有一个视图控制器的实例化,它为您提供一个新实例,在这个新实例中,将显示来自 nib 设置值的段控件(或您在 viewDidloadViewWillAppear 方法中设置的任何内容

解决方案

解决方案是将值存储在可以检索并在 viewDelegates 中设置为的地方

  [self.segment setSelectedSegmentIndex:storedIndex];

为了这个存储目的,有不同的选择

    appDelegate 中的全局变量 NSUserDefaults 核心数据 Sqlite 列表 文本文件

第一个是最简单的,但如果您要实现其中任何一个,那么这已经是一个相当大的选择。

【讨论】:

【参考方案3】:

您需要在您的应用中将该变量 selectedSegment 设为全局变量。你可以在AppDelegate中定义它

iPhone, how do I App Delegate variable which can be used like global variables?

【讨论】:

以上是关于更改 UISegmentedControl 的选定段的主要内容,如果未能解决你的问题,请参考以下文章

来自 AppDelegate 的 UISegmentedControl

如何从 UISegmentedControl 的选定段呈现 UIPopover

在 UISegmentedControl 中的选定选项卡上是不是可以使用不同的样式字体?

UISegmentedControl 寄存器点击选定的段

UISegmentedControl 选择要发布到 web 服务的索引值

UISegmentedControl 和 UIPanGestureRecognizer?