1

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

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

除了设置启用属性,我发现如果最小值和最大值设置为相同的值,步进器将被禁用。我很确定这不会发生在我的应用程序中。这些值是硬编码的并传递给一个设置方法,自从许多应用程序版本之前我就没有更改过这个代码。

你知道发生这种情况的任何其他原因吗?我自己无法重现问题,而且它只影响部分用户,因此很难解决。

这是我创建 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)并且启用的属性为 YES。不幸的是,这消除了我关于这里可能发生的事情的两个理论......

4

1 回答 1

1

好的,这就是发生的事情。上面发布的方法是我真实方法的简化版本,它为 iOS 5 之前的设备提供了一些分支。为了帮助支持 iOS 5 之前的版本,我实际上将 stepperInput 声明为 UIControl,然后在不支持 UIStepper 的 iOS 版本上返回不同的内容。

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

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

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

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

于 2012-09-05T01:19:53.087 回答