【问题标题】:Different behavior between iOS 4.3 and 5.0 with UIDatePicker code executioniOS 4.3 和 5.0 之间的不同行为与 UIDatePicker 代码执行
【发布时间】:2011-10-25 02:22:21
【问题描述】:

我在尝试在运行 iOS 5.0 的 iPhone 4S 和运行 iOS 4.3 的 iPad 上整理出相同代码的不同行为时遇到了一个令人困惑的问题。

视图控制器代码与带有日期选择器的视图相关联,用于输入出生日期。通过 Interface Builder,日期选择器与接收到的针对视图控制器方法的“Value Changed”动作相关联 -(IBAction)birthDate: (id)sender:

-(IBAction)birthDate: (id)sender {

//Code here executed when date of birth entered. Should not be executed when view loads.


}

在应用程序中,当视图加载时不执行此代码非常重要。我已经通过断点插入演示了当视图加载 iOS 5.0 时此代码不会执行,但当视图加载 iOS 4.3 时会执行,这会导致程序出现真正的问题(默认出生日期被解释为输入的出生日期) .我非常感谢有关如何防止 IBAction 代码在 iOS 4.3 中执行的建议,除非用户更改默认出生日期。我也很好奇为什么会存在这种行为差异。提前致谢。

【问题讨论】:

    标签: iphone ios4 datepicker ios5 uidatepicker


    【解决方案1】:

    这是对 iOS 5.0 中 UIPickerView 行为的记录更改 (Release Notes) 在 iOS 4.3 上绕过它的一种方法是在 loadView 的开头设置一个 BOOL,在结尾设置为 NO。

    您的值更改方法birthDate: 可以在处理更改之前检查此 BOOL 值是否为 NO。

    -(void)loadView
    {
        isViewLoading = YES; // isViewLoading is a BOOL ivar
        // load view
    }
    -(void)viewDidLoad
    {
        // what ever else
        isViewLoading = NO;
    }
    -(IBAction)birthDate:(id)sender
    {
        if (isViewLoading) return;
        // handle change
    }
    

    【讨论】:

    • 感谢您的代码。不幸的是,iOS 4.3 仍然存在同样的问题。放置此代码和顺序断点后,视图加载时的执行顺序是 loadView,然后是 viewDidLoad,然后是方法birthDate(此时为布尔值 NO)。我可以尝试任何其他建议吗?
    • 尝试 -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; }
    • 太棒了! viewDidLoad、birthDate、viewDidAppear 的执行顺序现在与您建议的布尔方案完美配合,运行 iOS 4.1、4.2、4.3 和 5.0。感谢您的大力帮助。
    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多