3

Ipadの[完了]ボタンでUIPickerViewを表示するという1つの問題に直面し ました。多くのリンクやブログで詳細な調査を行い、「UIActionSheetからUIPickerViewを表示する」という提案を受けました

これに関連する投稿をたくさん見ましたが、良い答えはありませんので、重複して閉じないでください。

また、私はそれを行うためのいくつかの良いコードを取得することができました、そしてそれは私のiPhoneデバイスでうまくいきました。しかし、私はiPadデバイスで問題が見つかりました。アクションシートがフルビューで表示されていません。下のスクリーンショットをご覧ください。これが結果でした!!!

IpadのDonボタン付きのUIPickerView

これを行うために使用されるコードは、以下に貼り付けられています。

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil
                                                    delegate:nil
                                                    cancelButtonTitle:nil
                                                    destructiveButtonTitle:nil
                                                    otherButtonTitles:nil];

[actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];

CGRect pickerFrame = CGRectMake(0, 40, 0, 0);

UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
pickerView.showsSelectionIndicator = YES;
pickerView.dataSource = self;
pickerView.delegate = self;

[actionSheet addSubview:pickerView];
[pickerView release];

UISegmentedControl *closeButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Close"]];
closeButton.momentary = YES;
closeButton.frame = CGRectMake(260, 7.0f, 50.0f, 30.0f);
closeButton.segmentedControlStyle = UISegmentedControlStyleBar;
closeButton.tintColor = [UIColor blackColor];
[closeButton addTarget:self action:@selector(dismissActionSheet:) forControlEvents:UIControlEventValueChanged];
[actionSheet addSubview:closeButton];
[closeButton release];

[actionSheet showInView:[[UIApplication sharedApplication] keyWindow]];

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

次に、サンプルピッカーを介してgithubから優れたサンプルアプリケーションをダウンロードしました

ダウンロード後、必須のクラスのみをアプリケーションにコピーしました。

アクションシートを介してUIPickerView+Doneボタンを表示するために使用している方法を以下に説明します。

ActionStringDoneBlock done = ^(ActionSheetStringPicker *picker, NSInteger selectedIndex, id selectedValue) {

        if ([myLabel respondsToSelector:@selector(setText:)]) {
            [myLabel performSelector:@selector(setText:) withObject:selectedValue];
        }
    };

    ActionStringCancelBlock cancel = ^(ActionSheetStringPicker *picker) {

        NSLog(@"Block Picker Canceled");
    };

    NSArray *colors = [NSArray arrayWithObjects:@"Red", @"Green", @"Blue", @"Orange", nil];//picker items to select


    [ActionSheetStringPicker showPickerWithTitle:@"Select a Block" rows:colors initialSelection:0 doneBlock:done cancelBlock:cancel origin:myButton];

コードの最後の行では、パラメーターをoriginとして使用しています。オブジェクト(ボタン、ラベルなど)を渡すことができます。

アクションシートは、渡されたオブジェクトとして原点を取ります。

ここで私の問題が再び発生しました:)。私は自分の条件に従って時間を選択するためにセグメント制御を使用しました。

原点パラメーターとしてmySegmentを指定すると、アクションシートの原点矢印がセグメントコントロールの中央から表示されます。選択したタブからではなく、これは非常に悪いため、貴重なユーザーに混乱をもたらします。

そのため、セグメントセクションの下に個別のラベルを追加し、前述のメソッドのoriginパラメータにラベルを付けて、問題を修正しました。

しかし、私はそれが良い修正ではないことを知っています:)

それを行う簡単な方法はありますか?

AppleはIpadでActionSheet+UIPickerView + DoneButtonをサポートしていますか?

この問題に関するヘルプはありがたいです

4

4 に答える 4

4

ここに画像の説明を入力

-(void)viewDidload
{
    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button1.frame = CGRectMake(165,165, 135,35);
    [button1 setTitle:@"Type    @" forState:UIControlStateNormal];
    [button1 addTarget:self action:@selector(button1) forControlEvents:UIControlEventTouchUpInside];
    [s addSubview:button1];
}

-(void)button1
{
    items1 =[[NSMutableArray alloc]initWithObjects:@"H",@"E",@"T",@"K",nil];
    myPickerView1 =[[UIPickerView alloc] initWithFrame:CGRectMake(60,80,200,300)];
    myPickerView1.transform = CGAffineTransformMakeScale(0.75f, 0.75f);
    myPickerView1.delegate = self;
    myPickerView1.dataSource = self;
    myPickerView1.showsSelectionIndicator = YES;
    myPickerView1.backgroundColor = [UIColor clearColor];
    myPickerView1.tag=1;
    [myPickerView1 selectRow:1 inComponent:0 animated:YES];
    [self.view addSubview:myPickerView1];
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
{
    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
{
    switch (pickerView.tag)
    {
    case 1:
        return [items1 count];
            break;
    case 2:
        return [items2 count];
        break;
    }
    return 0;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    switch (pickerView.tag)
    {
    case 1:
        return[items1 objectAtIndex:row];
        break;
    case 2:
        return[items2 objectAtIndex:row];
        break;
    }
        return 0;
}

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    switch (pickerView.tag)
    {
    case 1:
        {
            [button1 setTitle:[items1 objectAtIndex:row] forState:UIControlStateNormal];
        }
        break;
    case 2:
        {
            [button2 setTitle:[items2 objectAtIndex:row] forState:UIControlStateNormal];
        }break;
    }
    pickerView.hidden = YES;
}
于 2012-08-03T18:10:01.743 に答える
2

を使用する必要がありますUIPopOverController

まず、 iPhone 用の UIPickerViewController を作成します。popOver にプッシュされる nib に必要です。でピッカーを初期化しますViewWithPicker

.h

#import <UIKit/UIKit.h>

@class ViewWithPickerController;

@protocol PopoverPickerDelegate

@required

- (void) viewWithPickerController:(ViewWithPickerController*) viewWithPickerController didSelectValue:(NSString*) value;

@end

@interface ViewWithPickerController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {
    IBOutlet UIPickerView *pickerView;
    id<PopoverPickerDelegate> delegate;
    NSMutableArray *array;  
}
@property(nonatomic, retain) IBOutlet UIPickerView *pickerView;
@property(nonatomic, assign) id<PopoverPickerDelegate> delegate;
@end

.marrayviewDidLoad、ピッカー メソッドを初期化した後:

// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)picker {
    return 1;
}

// returns the number of rows in each component.


- (NSInteger)pickerView:(UIPickerView *)picker numberOfRowsInComponent:(NSInteger)component {
    return [array count];
}

//returns the string value for the current row
- (NSString *)pickerView:(UIPickerView *)picker titleForRow:(NSInteger)row forComponent:(NSInteger)component {
   return [array objectAtIndex:row];
}

//handle selection of a row
- (void)pickerView:(UIPickerView *)picker didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    NSString *value = [pickerView.delegate pickerView:picker titleForRow:row forComponent:component];

    //notify the delegate about selecting a value
    if(delegate != nil)
        [delegate viewWithPickerController:self didSelectValue:value];
}

次に、viewWithPicker をメイン クラスにインポートし、ボタンを作成して、次のアクションを指定します。

- (IBAction) showPickerPopupAction:(id) sender {
    self.viewWithPickerController = [[[ViewWithPickerController alloc] initWithNibName:@"ViewWithPicker" bundle:[NSBundle mainBundle]] autorelease];


    viewWithPickerController.contentSizeForViewInPopover = 
    CGSizeMake(viewWithPickerController.view.frame.size.width, viewWithPickerController.view.frame.size.height);

    viewWithPickerController.delegate = self;

    self.popoverController = [[[UIPopoverController alloc]
                               initWithContentViewController:viewWithPickerController] autorelease];


    [self.popoverController presentPopoverFromRect:popoverButtonForPicker.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    popoverController.delegate = self;

}

特定の値を選択するには

- (void) viewWithPickerController:(ViewWithPickerController*) viewWithPickerController didSelectValue:(NSString*) value
{   
    yourLabel.text = [NSString stringWithFormat:@"%@ ",value];

}
于 2012-06-22T07:44:50.673 に答える
2

ここに画像の説明を入力

ピッカーの完了ボタンに UIPopoverController を使用し、ピッカーを取得してナビゲーションのキャンセルと完了ボタンを追加する View Controller クラスを作成します。

    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:nextViewController];
    _datePickerPopover = [[UIPopoverController alloc] initWithContentViewController:navigationController];
    nextViewController.datePickerPopover = _datePickerPopover;
    _datePickerPopover.delegate=self;
    [_datePickerPopover setPopoverContentSize:CGSizeMake(320, 453) animated:NO];
    if (isSearchOpen) {
        [_datePickerPopover presentPopoverFromRect:CGRectMake(btn.frame.origin.x+10+245, btn.frame.origin.y+100-scrollPointY, 44, 44) inView:self.splitViewController.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];  
    }
    else
    {
        [_datePickerPopover presentPopoverFromRect:CGRectMake(btn.frame.origin.x+10+245, btn.frame.origin.y+55, 44, 44) inView:self.splitViewController.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];//
    }
于 2012-06-22T04:37:00.727 に答える
1

iPad で UIPicker View の以下のコードを試してください。

-(IBAction)tDriveBtnPressed:(id)sender
{
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateStyle = NSDateFormatterMediumStyle;
txtDate.text = [NSString stringWithFormat:@"%@",
                [df stringFromDate:[NSDate date]]];
[df release];

UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 300, 44)];
pickerToolbar.barStyle = UIBarStyleBlackOpaque;
[pickerToolbar sizeToFit];
NSMutableArray *barItems = [[NSMutableArray alloc] init];
UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDone:)];
[barItems addObject:doneBtn];
[doneBtn release];
[pickerToolbar setItems:barItems animated:YES];
[barItems release];

datePicker = [[UIDatePicker alloc] init];
datePicker.datePickerMode = UIDatePickerModeDate;

CGRect pickerRect = datePicker.bounds;
datePicker.bounds = pickerRect;

UIViewController* popoverContent = [[UIViewController alloc] init];
UIView* popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 344)];
popoverView.backgroundColor = [UIColor whiteColor];

datePicker.frame = CGRectMake(0, 44, 320, 300);
[datePicker addTarget:self action:@selector(dateChange:) forControlEvents:UIControlEventValueChanged];
[popoverView addSubview:pickerToolbar];
[popoverView addSubview:datePicker];
popoverContent.view = popoverView;

//resize the popover view shown
//in the current view to the view's size
popoverContent.contentSizeForViewInPopover = CGSizeMake(320, 244);

//create a popover controller
popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
CGRect popoverRect = [self.view convertRect:[tDriveBtn frame] 
                                   fromView:[tDriveBtn superview]];

popoverRect.size.width = MIN(popoverRect.size.width, 100) ; 
popoverRect.origin.x  = popoverRect.origin.x; 
// popoverRect.size.height  = ; 

[popoverController 
 presentPopoverFromRect:popoverRect
 inView:self.view 
 permittedArrowDirections:UIPopoverArrowDirectionAny
 animated:YES];


//release the popover content
[popoverView release];
[popoverContent release];

}
-(void)dateChange:(id)sender
{
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateStyle = NSDateFormatterMediumStyle;
txtDate.text= [NSString stringWithFormat:@"%@",
               [df stringFromDate:datePicker.date]];
[df release];
}
- (void)pickerDone:(id)sender
{
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateStyle = NSDateFormatterMediumStyle;
txtDate.text= [NSString stringWithFormat:@"%@",
               [df stringFromDate:datePicker.date]];
[df release];

if (popoverController != nil) {
    [popoverController dismissPopoverAnimated:YES];
    self.popoverController=nil;
}  
}
于 2012-06-22T04:41:31.967 に答える