そこで、ユーザーがUITextFieldをタップしたときに、キーボードの代わりにUIDatePickerを起動する方法に関するチュートリアルに従いました。私が得ている問題は、ピッカーが起動するとクリップされ、コンソールに次のメッセージが表示されることです。
Presenting action sheet clipped by its superview. Some controls might not respond to touches. On iPhone try -[UIActionSheet showFromTabBar:] or -[UIActionSheet showFromToolbar:] instead of -[UIActionSheet showInView:].
私は他の方法を試しましたが、どちらも機能しませんでしたし、期待もしていませんでした。誰かが以下のコードを見てアドバイスを提供できれば、それは素晴らしいことです。ありがとう :)
AddShiftViewController.h
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "Shift.h"
@interface AddShiftsViewController : UIViewController <UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *jobTitleField;
@property (weak, nonatomic) IBOutlet UITextField *startDateField;
@property (weak, nonatomic) IBOutlet UITextField *endDateField;
@property (nonatomic, strong) NSDate *startDate;
@property (nonatomic, strong) NSDate *endDate;
@property (nonatomic, strong) UIActionSheet *dateSheet;
- (void)setDate;
- (void)dismissPicker;
- (void)cancelPicker;
- (IBAction)addShift:(id)sender;
@end
AddShiftViewController.m
#import "AddShiftsViewController.h"
@interface AddShiftsViewController ()
@end
@implementation AddShiftsViewController
@synthesize jobTitleField;
@synthesize startDateField;
@synthesize endDateField;
@synthesize startDate, endDate, dateSheet;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
AppDelegate *dataCenter = (AppDelegate *)[[UIApplication sharedApplication] delegate];
}
- (void)viewDidUnload
{
[self setJobTitleField:nil];
[self setStartDateField:nil];
[self setEndDateField:nil];
[self setEndDate:nil];
[self setStartDate:nil];
[self setDateSheet:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (IBAction)addShift:(id)sender {
Shift *newShift = [[Shift alloc] init];
}
- (void)setDate {
dateSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
[dateSheet setActionSheetStyle:UIActionSheetStyleDefault];
CGRect pickerFrame = CGRectMake(0, 44, 0, 0);
UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame:pickerFrame];
[picker setDatePickerMode:UIDatePickerModeDateAndTime];
[dateSheet addSubview:picker];
UIToolbar *controlToolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, dateSheet.bounds.size.width, 44)];
[controlToolBar setBarStyle:UIBarStyleDefault];
[controlToolBar sizeToFit];
UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *setButton = [[UIBarButtonItem alloc] initWithTitle:@"Set" style:UIBarButtonItemStyleDone target:self action:@selector(dismissPicker)];
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelPicker)];
[controlToolBar setItems:[NSArray arrayWithObjects:spacer, cancelButton, setButton, nil] animated:NO];
[dateSheet addSubview:controlToolBar];
[dateSheet showInView:self.view];
[dateSheet setBounds:CGRectMake(0, 0, 420, 385)];
}
- (void)dismissPicker {
NSArray *listOfViews = [dateSheet subviews];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMMM d, yyyy at H:mm"];
for (UIView *subView in listOfViews) {
if ([subView isKindOfClass:[UIDatePicker class]]) {
if (self.startDateField.isEditing) {
self.startDate = [(UIDatePicker *)subView date];
[self.startDateField setText:[formatter stringFromDate:self.startDate]];
[dateSheet dismissWithClickedButtonIndex:0 animated:YES];
}
else if (self.endDateField.isEditing) {
self.endDate = [(UIDatePicker *)subView date];
[self.endDateField setText:[formatter stringFromDate:self.endDate]];
[dateSheet dismissWithClickedButtonIndex:0 animated:YES];
}
}
}
}
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
[self setDate];
return NO;
}
- (void)cancelPicker {
[dateSheet dismissWithClickedButtonIndex:0 animated:YES];
}
@end
Shifts.h(カスタムクラス)
#import <Foundation/Foundation.h>
@interface Shift : NSObject
@property (nonatomic, strong) NSString *jobTitle;
@property (nonatomic, strong) NSString *employer;
@property (nonatomic, strong) NSDate *startDate;
@property (nonatomic, strong) NSDate *endDate;
@end
編集
だから、私はに切り替えてみました:
[dateSheet showFromTabBar:self.tabBarController.tabBar];
しかし、それはまだクリッピングです。何が起こっているのかを正確に示すために写真を添付しました。