0

そこで、ユーザーが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];

しかし、それはまだクリッピングです。何が起こっているのかを正確に示すために写真を添付し​​ました。

ここに画像の説明を入力してください

4

2 に答える 2

3

この行の数値が少しずれているようです。

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

次のようにする必要があります。

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

iPhone 画面の幅は 420 ピクセルではありません :) 従来の画面は 320 幅 (縦向き) または Retina ディスプレイでは 640 幅です。他の場所にもエラーがある可能性がありますが、これは私にとって際立っています。

于 2012-05-06T20:36:55.447 に答える
0

まず、フレームの幅と高さが正しいことを確認しますか。

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

このフレームを使用したピッカービューの幅と高さは0であるため、正しく表示できません。幅または高さを指定してUIDatePickerを作成してみてください。

また、UITabBarControllerの一部であるコントローラーを使用してUIActionSheetを表示しようとしていますか... ??? もしそうなら、代わりに

[datesheet showInView:self.view];

使用する

[datesheet showFromTabBar:self.tabBarController.tabBar];
于 2012-05-06T04:40:36.840 に答える