2012-05-06 34 views
0

所以,我跟着一个关于如何获得一个UIDatePicker而不是键盘的教程,当用户点击一个UITextField时。我得到的问题是,当选择器启动后,会短促的,它给在控制台此消息:showInView正在造成剪辑

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]; 

但它仍然是剪裁。我附上了一张图片,以向您展示到底发生了什么。

enter image description here

回答

3

看起来你可能得到的数字在这条线有点过:

[dateSheet setBounds:CGRectMake(0, 0, 420, 385)]; 

应该是:

[dateSheet setBounds:CGRectMake(0, 0, 320, 485)]; 

w iPhone屏幕的宽度不是420像素:)经典屏幕在Retina屏幕上宽320(纵向)或宽640。虽然在其他地方也可能有错误,但这一点对我来说很重要。

+0

是的,就是这样:)谢谢Nethfel。 – Barks

0

首先,你确定边框的宽度N高度是正确的。

CGRect pickerFrame = CGRectMake(0, 44, 0, 0); // (params) x , y, width, height 

使用此框架的选取器视图具有0宽度和0高度,因此它将无法正确显示其自身。尝试使用某种宽度或高度创建UIDatePicker。

另外,你是否试图显示UIActionSheet从属于UITabBarController的控制器...? 如果是这样,那么代替

[datesheet showInView:self.view]; 

使用

[datesheet showFromTabBar:self.tabBarController.tabBar]; 
+0

这些是在教程中使用的值,他们工作正常,所以我不认为就是这样。无论如何,我尝试将它们分别设置为320和300,但它没有改变任何东西。我附上了一张显示发生了什么的截图。我试图链接它使用showFromTabBar但没有运气:( – Barks