我的iOS应用中的所有UISteppers都已被禁用

时间:2012-09-04 23:23:40

标签: ios5 uikit uistepper

我的应用在几个不同的视图中使用UIStepper控件。我发布了一个不应该影响这些视图的应用程序的小更新,我开始收到报告,现在应用程序中的所有UISteppers都被禁用了。一个用户发送了一个屏幕截图,并且步进控件显示为其启用属性设置为NO。但是,我的代码中根本没有设置此属性的地方,默认为YES。我在我的应用程序中搜索了“启用”一词的实例,以确保我不会以某种方式意外禁用它,我不是。

我认为启用属性的默认值可能在iOS版本之间发生了变化,但报告此版本的用户正在运行iOS 5.1.1,与我的开发设备相同。我只是开始听到这个应用更新的问题。

除了设置enabled属性外,我发现如果将min和max值设置为相同的值,将禁用步进器。我很确定我的应用程序中没有发生这种情况。这些值是硬编码的并传递给设置方法,而且我之前的许多应用程序版本都没有更改过此代码。

你知道为什么会这样吗?我自己无法重现这个问题,它只会影响一些用户,所以很难排除故障。

这是我创建UISteppers的代码,它的价值在于:

- (UIStepper *)makeStepperInput:(float )currentValue minValue:(float)minValue maxValue:(float)maxValue increment:(float)increment {
    int stepperWidth = 94;
    int stepperHeight = 27;
    CGRect stepperFrame = CGRectMake(0, 0, stepperWidth, stepperHeight);

    UIStepper *stepperInput = [[[UIStepper alloc] initWithFrame:stepperFrame] autorelease];
    stepperInput.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;

    [stepperInput setValue:currentValue];
    [stepperInput setMinimumValue:minValue];
    [stepperInput setMaximumValue:maxValue];
    [stepperInput setStepValue:stepValue];
    [stepperInput setContinuous:NO];

    NSLog(@"making stepper with values %f, %f, %f, %f (%i)", currentValue, minValue, maxValue, stepValue, stepperInput.enabled);

    [stepperInput addTarget:self action:@selector(onChange:) forControlEvents:UIControlEventValueChanged];

    return stepperInput;
}

更新:我有一个用户愿意使用上面的NSLog行安装调试版本。他向我发送了控制台输出,它显示步进器的最小值和最大值是正确的(在一种情况下为1和20),并且enabled属性为YES。不幸的是,这消除了我对这里可能发生的事情的理论......

1 个答案:

答案 0 :(得分:1)

好的,这就是发生的事情。上面发布的方法是我的真实方法的简化版本,它为iOS 5之前的设备提供了一些分支。为了帮助预支持iOS 5,我其实是宣告stepperInput作为UIControl,然后返回不同的IOS版本的东西,不支持UIStepper。

现在有趣的部分。我回滚了我的项目并开始查看我的构建设置,并记得在我上次发布之前,Xcode给了我一条关于我的构建设置过时的警报消息。我单击了按钮以允许Xcode进行所有建议的更改。这一次,我一次进行了一次更改,并在每次更改后测试了我的应用程序。

建议的第一个更改是“将编译器配置升级到LVVM”。 (“编译器配置设置为'com.apple.compilers.llvmgcc42'。这将升级到'Apple LLVM编译器4.0',这是iOS目标的推荐设置。”)一旦我做了这个改变,问题就出现了出现在我的测试设备上。因此,旧编译器似乎允许我在声明为UIControl的对象上设置UIStepper属性,而新编译器则不允许。事实上,当我改变上述输出步进的实际值,我的NSLog行,而不是传递到方法的价值,他们都返回0。有它的最大值和最小值都设定为0是什么让步进似乎是禁用。

我认为这不会影响所有用户,因为我无法重现它,但我使用较旧的构建设置而不是用于发布的构建设置进行测试。所以现在我认为这可能会影响所有用户,只有一些用户注意到了它。

无论如何,解决方案是重新组织我的代码,以便我可以将UIStepper声明为真正的UIStepper,因为较新的编译器不允许我以前做过的那种捏造。