【问题标题】:Change selected segment of UISegmentedControl更改 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 很好

标签: iphone ios objective-c ios6


【解决方案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];

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

  1. appDelegate 中的全局变量
  2. NSUserDefaults
  3. 核心数据
  4. Sqlite
  5. 列表
  6. 文本文件

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-12
      • 2017-05-23
      • 2011-10-03
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多