iOS 4 创建两个 UIActionSheet,3.1.3 创建一个?为啥?

Posted

技术标签:

【中文标题】iOS 4 创建两个 UIActionSheet,3.1.3 创建一个?为啥?【英文标题】:iOS4 creating two UIActionSheets, 3.1.3 creating one? Why?iOS 4 创建两个 UIActionSheet,3.1.3 创建一个?为什么? 【发布时间】:2010-06-30 13:03:00 【问题描述】:

以下代码在 XCode 3.2.2、iPhone OS 3.1.3 中创建一个 UIActionSheet。嵌入在操作表中的是日期选择器。

但它似乎在 XCode 3.2.3、ios4 中创建了两张工作表,一张重叠在另一张上。

另外,我在控制台中收到此错误(同样,仅适用于 XCode 3.2.3、iOS4):

wait_fences: failed to receive reply: 10004003

你认为问题是什么?

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 


    if ([textField tag] >0 )
    
        [self dismissKeyboard];
        NSString *dateTitle;
        dateFieldNumber = [textField tag];
        dateTitle = @"Enter your Birth Date";

        NSString *title = @"\n\n\n\n\n\n\n\n\n\n\n\n" ;
        UIActionSheet *actionSheet = [[UIActionSheet alloc] 
                                      initWithTitle:[NSString stringWithFormat:@"%@%@", title, NSLocalizedString(dateTitle, @"")]
                                      delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:@"Ok", nil];
        [actionSheet showInView:[UIApplication sharedApplication].keyWindow];
        UIDatePicker *datePicker2 = [[UIDatePicker alloc] init];
        self.datePicker = datePicker2;
        [datePicker2 release];

        self.datePicker.date = [NSDate date];

        [self.datePicker addTarget:self
                            action:@selector(changeDateInLabel:)
                  forControlEvents:UIControlEventValueChanged];
        self.datePicker.datePickerMode = UIDatePickerModeDate;

        NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSDate *currentDate = [NSDate date];
        NSDateComponents *comps = [[NSDateComponents alloc] init];
        [comps setYear:60];
        NSDate *maxDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
        [comps setYear:-60];
        NSDate *minDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
        [comps release];
        [calendar release];

        [self.datePicker setMaximumDate:maxDate];
        [self.datePicker setMinimumDate:minDate];

        [actionSheet addSubview:self.datePicker];

        return NO;
     else 
        return YES;
    


编辑

正如 Brian 在下面指出的,textFieldShouldBeginEditing 委托方法被调用了两次。我看不出为什么在 IOS4 而不是早期版本中应该是这种情况。无论如何,我已经更改了代码,所以有一个 BOOL hasDisplayedSheet,最初在 viewDidLoad 中是 NO。然后我用 if 语句将 actionsheet 创建代码(在 textFieldShouldBeginEditing 委托方法中)括起来,例如

if (hasDisplayedSheet == NO)    

// actionsheet code

hasDisplayed = YES

并在他们单击工作表按钮时将 hasDiplayedSheet 更改回 NO。

【问题讨论】:

只是想排除显而易见的问题 - textFieldShouldBeginEditing: 是否被调用了两次? 你是对的。它确实调用了 textFieldShouldBeginEditing 两次。我不知道为什么它会在 IOS4 而不是以前的操作系统中这样做。 【参考方案1】:

这个 SO post 有一个解决方案,可以将 UIDatePicker 添加到 UIActionSheet,这可能会直接帮助您。 或者这个post,看起来更好。

就个人而言,我永远无法让这些解决方案中的任何一个很好地工作,而且我不确定这会是 Apple 建议的方法吗?通过将UIView 动画化,将UIPickerView 作为子视图,我在Apple 应用程序中的这些UIPickerView 视图的外观和行为方面取得了完全的成功和统一——这个blog 帖子帮助我开始了。当我让这种行为正常工作时,我添加了一个 OverlayViewController 帮助器类以使我的(模态)视图背景半透明;见post。

有关 wait_fences 问题,请参阅 post。

【讨论】:

以上是关于iOS 4 创建两个 UIActionSheet,3.1.3 创建一个?为啥?的主要内容,如果未能解决你的问题,请参考以下文章

iOS iPad 如何使用 UIActionSheet 创建 UIPopoverController? [复制]

UIAlertView,UIActionSheet和iOS8推出UIAlertControl的基本使用

类似于 iOS 7 Safari 的 UIActionSheet-like 控件

iOS7 自定义按钮褪色与 UIActionSheet

在 iOS8 的 UIActionSheet 中添加 UIPickerView 的最佳解决方案是啥?

在 ios 中创建像 UiActionSheet 这样的自定义 uiView