UISegmentedControl:以编程方式设置索引?

Posted

技术标签:

【中文标题】UISegmentedControl:以编程方式设置索引?【英文标题】:UISegmentedControl: Programmatically Set Index? 【发布时间】:2011-06-28 18:31:50 【问题描述】:

我正在尝试将用户设置加载到分段控件中。 NSUserDefault 读取正确,并且首选项正确转换为索引。但是,分段控件似乎没有响应设置索引,宁愿停留在索引 0。

代码 clean 用 -Wall -Wextra 编译,clang 没有报告任何问题。我也跑过 Leaks 和 Zombies - 好的。并且下面的ASSERTs 不会触发。

UISegmentedControl 是使用 Interface Builder 创建的(视图上共有 4 个)。我已经验证了连接。我尝试在-viewDidLoad-viewWillAppear-viewDidAppear 中调用-loadPreferences

我还缺少什么技巧吗?我应该调用needsUpdate 或其他方法来重新绘制控件吗?

杰夫

-(void)loadPreferences

   NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
   ...

    int days = [userDefaults integerForKey:kDirtyAfter];
    ASSERT(IsValidDirtyDays((DirtyDays)days));
    if(!IsValidDirtyDays((DirtyDays)days))
        days = (int)DirtyDaysDefault;

    int idx;
    switch(days)
    
        case DirtyDays1: idx = 0; break;
        case DirtyDays3: idx = 1; break;
        case DirtyDays7: idx = 2; break;
        case DirtyDays14: idx = 3; break;
        case DirtyDays28: idx = 4; break;
        default: idx = 1;
    

    // dirtyAfterSegment.selectedSegmentIndex = idx;
    [dirtyAfterSegment setSelectedSegmentIndex:idx];
    ASSERT(dirtyAfterSegment.selectedSegmentIndex == idx);

【问题讨论】:

【参考方案1】:

如果 Assert 没有触发,那么一定是在这段代码之后将索引更改为 0,或者代码本身总是使用第一个 case 语句。

在 valueChanged 上为段创建一个动作,并在该动作中设置断点以查看段何时被更改以及谁在更改它。

【讨论】:

谢谢肯德尔。我用手指复制/粘贴,出现在-valueChanged【参考方案2】:

您说您在界面生成器中创建了分段控件,您是否为它们创建了 IBOutlets 并连接它们?

【讨论】:

以上是关于UISegmentedControl:以编程方式设置索引?的主要内容,如果未能解决你的问题,请参考以下文章

UISegmentedControl以编程方式更改段数

如何以编程方式将 UISegmentedControl 添加到容器视图

如何在swift上以编程方式更改uisegmentedcontrol的字体大小和字体名称?

以编程方式在 UINavigationBar 下方的 UIToolbar 中添加 UISegmentedControl

在带有 XIB 的视图控制器上以编程方式初始化 UISegmentedControl

如何以编程方式在 iPad 的工具栏中添加 UISegmentedControl