以下のコードは、XCode 3.2.2、iPhone OS 3.1.3 で 1 つの UIActionSheet を作成します。アクション シートには日付ピッカーが埋め込まれています。
しかし、XCode 3.2.3、iOS4 で 2 つのシートを作成し、一方を他方の上に重ねるようです。
また、コンソールに次のエラーが表示されます (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 デリゲート メソッドが 2 回呼び出されていました。以前のバージョンではなく、IOS4 でこれが当てはまる理由がわかりません。とにかく、BOOL hasDisplayedSheet があるようにコードを変更しました。これは、最初は viewDidLoad で NO です。次に、アクションシート作成コード (textFieldShouldBeginEditing デリゲート メソッド内) を if ステートメントで囲みました。
if (hasDisplayedSheet == NO) {
// actionsheet code
hasDisplayed = YES
}
シート ボタンをクリックするとhasDiplayedSheet
NO に戻ります。