如何在 UIActionSheet 中添加 UIPickerView

Posted

技术标签:

【中文标题】如何在 UIActionSheet 中添加 UIPickerView【英文标题】:how to add UIPickerView in UIActionSheet 【发布时间】:2009-12-24 16:27:59 【问题描述】:

我有输入 rating(1 - 5) 值的任务,所以我找到了以下日期选择器代码,谁能帮我修改下面的代码,以便添加 UIPickerView 以从 1 到 5 选择速率

UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:@"Ratings" 
                                              delegate:self
                                     cancelButtonTitle:@"Cancel"
                                destructiveButtonTitle:nil
                                     otherButtonTitles:nil];

UIDatePicker *pickerView = [[UIDatePicker alloc] init];
pickerView.datePickerMode = UIDatePickerModeDate;

[menu addSubview:pickerView];
[menu showInView:self.view];   
[menu sendSubviewToBack:pickerView];     
[menu setBounds:CGRectMake(0,0,320, 500)];

CGRect pickerRect = pickerView.bounds;
pickerRect.origin.y = -100;
pickerView.bounds = pickerRect;

[pickerView release];
[menu release];

如何做,评分的文本字段将自动输入 UIPIckerView 中的选定值

谢谢

【问题讨论】:

已经有人问过这个问题了。见这里:***.com/questions/1849873/… 【参考方案1】:
actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self     cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
actionSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;


    picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0,40, 320, 216)];
    picker.showsSelectionIndicator=YES;
    picker.dataSource = self;
    picker.delegate = self;
    picker.tag=SelectedDropDown;
    [actionSheet addSubview:picker];

UIToolbar *tools=[[UIToolbar alloc]initWithFrame:CGRectMake(0, 0,320,40)];
tools.barStyle=UIBarStyleBlackOpaque;
[actionSheet addSubview:tools];
[tools release];


UIBarButtonItem *doneButton=[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleBordered target:self action:@selector(btnActinDoneClicked)];
doneButton.imageInsets=UIEdgeInsetsMake(200, 6, 50, 25);
UIBarButtonItem *flexSpace= [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

NSArray *array = [[NSArray alloc]initWithObjects:flexSpace,doneButton,nil];

[tools setItems:array];
[doneButton release];
[flexSpace release];

//picker title
UILabel *lblPickerTitle=[[UILabel alloc]initWithFrame:CGRectMake(60,8, 200, 25)];
lblPickerTitle.text=@"";
lblPickerTitle.backgroundColor=[UIColor clearColor];
lblPickerTitle.textColor=[UIColor whiteColor];
lblPickerTitle.textAlignment=NSTextAlignmentCenter;
lblPickerTitle.font=[UIFont boldSystemFontOfSize:15];
[tools addSubview:lblPickerTitle];


[actionSheet showFromRect:CGRectMake(0,480, 320,215) inView:self.view animated:YES];
[actionSheet setBounds:CGRectMake(0,0, 320, 411)];
[actionSheet release];

【讨论】:

【参考方案2】:

首先,我认为您可能会将 UIPickerView 与 UIDatePickerView 混淆。日期选择器是一个无法自定义的专用选择器,而 UIPickerView 是专门用于自定义的。 Marc W 在他的评论中是正确的。我answered this question before 认为它提供了比尝试将选择器添加到 UIActionSheet 更好的解决方案。

那里有很多 UIPickerView 教程。

【讨论】:

链接已损坏,并不是真正的答案。如果您在回答之前回答了某些问题,那么它应该被标记为重复而不是这样回答。【参考方案3】:

此解决方案适用于横向和 4 英寸屏幕。

UIActionSheet *aac = [[UIActionSheet alloc] initWithTitle:@"Choose Date and Time"
                                                 delegate:self
                                        cancelButtonTitle:nil
                                   destructiveButtonTitle:nil
                                        otherButtonTitles:nil];


[datePicker addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged];

pickerDateToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
pickerDateToolbar.barStyle = UIBarStyleBlackOpaque;
[pickerDateToolbar sizeToFit];

NSMutableArray *barItems = [[NSMutableArray alloc] init];

UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
[barItems addObject:flexSpace];

UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(DatePickerDoneClick)];
[barItems addObject:doneBtn];

[pickerDateToolbar setItems:barItems animated:YES];

[aac addSubview:pickerDateToolbar];
[aac addSubview:datePicker];

[aac showFromTabBar:self.tabBarController.tabBar];
CGFloat wideth = self.view.frame.size.width;
if (UIDeviceOrientationIsLandscape([self interfaceOrientation])) 
   [aac setBounds:CGRectMake(0,0,wideth, 355)];
   [datePicker sizeToFit];
 else 
    [aac setBounds:CGRectMake(0,0, wideth, 470)];
    [datePicker sizeToFit];

picker = aac;

【讨论】:

【参考方案4】:
    //
    //  ViewController.m
    //  TestApplication
    //
    //  Created by Macbook on 08/02/14.
    //  Copyright (c) 2014 Macbook. All rights reserved.
    //

    #import "ViewController.h"

    @interface ViewController ()

    @end

    @implementation ViewController
    @synthesize isSelectDate;

    - (void)viewDidLoad
    
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    

    - (void)didReceiveMemoryWarning
    
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    

    #pragma mark -OpenActionshhetWithDatePicker Event

    -(void)openactionsheetWithDatePicker
    

            actionSheet = [[UIActionSheet alloc] initWithTitle:@"Choose Date" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:@"",@"",@"",nil];
            actionSheet.delegate = self;
            [actionSheet setActionSheetStyle:UIActionSheetStyleBlackOpaque];
            actionSheet.tag = 3;
            [actionSheet showInView:self.view];

           UIButton *btncancelpicker = [[UIButton buttonWithType:UIButtonTypeCustom]retain];
            [btncancelpicker setFrame:CGRectMake(5, 5, 70,30)];
            [btncancelpicker setBackgroundImage:[UIImage imageNamed:@"cancel.png"] forState:UIControlStateNormal];
            [btncancelpicker addTarget:self action:@selector(datePickerCancelClicked) forControlEvents:UIControlEventTouchUpInside];
            [actionSheet addSubview:btncancelpicker];

            UIButton *btndonepicker = [[UIButton buttonWithType:UIButtonTypeCustom]retain];
            if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft ||[UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight )
                [btndonepicker setFrame:CGRectMake(405, 5, 70,30)];
            else if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait ||[UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown )
                [btndonepicker setFrame:CGRectMake(240, 5, 70,30)];
            [btndonepicker setBackgroundImage:[UIImage imageNamed:@"done.png"] forState:UIControlStateNormal];
            [btndonepicker addTarget:self action:@selector(datePickerDoneClicked) forControlEvents:UIControlEventTouchUpInside];
            [actionSheet addSubview:btndonepicker];

            datePicker = [[UIDatePicker alloc]initWithFrame:CGRectMake(0, 45, 320, 190)];
            datePicker.datePickerMode = UIDatePickerModeDate;
            datePicker.date = [NSDate date];
            [actionSheet addSubview:datePicker];

    
    -(void)datePickerDoneClicked
    
        NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
        [outputFormatter setDateFormat:@"dd/MM/yyyy"];
        NSString *tmp=[outputFormatter stringFromDate:datePicker.date];
        if (isSelectDate==TRUE) 
            [btnfrom setTitle:tmp forState:UIControlStateNormal];
        
        else
            [btnTo setTitle:tmp forState:UIControlStateNormal];

        
        [outputFormatter release];

        [actionSheet dismissWithClickedButtonIndex:0 animated:YES];
    

    -(void)datePickerCancelClicked
    
        [actionSheet dismissWithClickedButtonIndex:0 animated:YES];
    

    #pragma mark -Button Click Event

    -(IBAction)btnfromPress:(id)sender
    
        isSelectDate=TRUE;
        [self openactionsheetWithDatePicker];
    
    -(IBAction)btnToPress:(id)sender
    
        isSelectDate =FALSE;
        [self openactionsheetWithDatePicker];
    
    -(IBAction)btnRoomPress:(id)sender
    
        [self openRoomPicker];
    
    -(void)openRoomPicker
    
        arrRooms = [[NSMutableArray alloc] init];

        [arrRooms addObject:@"1 Room"];
        [arrRooms addObject:@"2 Room"];

        roomPickerview.hidden=FALSE;
        roomPickerview.delegate=self;
        roomPickerview.dataSource=self;
        [roomPickerview selectRow:0 inComponent:0 animated:NO];
        NSString *strRoom= [arrRooms objectAtIndex:[roomPickerview selectedRowInComponent:0]];
        [btnRoom setTitle:strRoom forState:UIControlStateNormal];

    

    #pragma mark -PickerView Method

    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pv;
    
        return 1;
    

    - (NSInteger)pickerView:(UIPickerView *)pv numberOfRowsInComponent:(NSInteger)component;
    
        return [arrRooms count];
    


    - (void)pickerView:(UIPickerView *)_pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    
        switch ([roomPickerview selectedRowInComponent:0])
        
            case 0:
                NSLog(@"select row is 1");
                [btnRoom setTitle:[arrRooms objectAtIndex:row] forState:UIControlStateNormal];
                break;

            case 1:
                NSLog(@"select row is 2");
                [btnRoom setTitle:[arrRooms objectAtIndex:row] forState:UIControlStateNormal];

                break;

            default:
                break;
        
    
    //- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
    //
    //          UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20.0f, 0.0f, 300.0f, 60.0f)]; //x and width are mutually correlated
    //          label.textAlignment = NSTextAlignmentLeft;
    //    
    //          label.text = [arrRooms objectAtIndex:row];
    //    
    //          return label;
    //      
    //

    - (NSString *)pickerView:(UIPickerView *)pv titleForRow:(NSInteger)row forComponent:(NSInteger)component;
    
        if (arrRooms!=nil)
        
            return [arrRooms objectAtIndex:row];
        

        return @"";
    


    @end

//
//  ViewController.h
//  TestApplication
//
//  Created by Macbook on 08/02/14.
//  Copyright (c) 2014 Macbook. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIActionSheetDelegate,UIPickerViewDataSource,UIPickerViewDelegate>

    IBOutlet UIButton *btnfrom;
    IBOutlet UIButton *btnTo;
    UIActionSheet *actionSheet;
    UIDatePicker *datePicker;

    BOOL isSelectDate;
    IBOutlet UIButton *btnRoom;
    IBOutlet UIPickerView *roomPickerview;


    NSMutableArray *arrRooms;




@property(nonatomic,readwrite) BOOL isSelectDate;
-(IBAction)btnfromPress:(id)sender;
-(IBAction)btnToPress:(id)sender;
-(IBAction)btnRoomPress:(id)sender;
-(void)openactionsheetWithDatePicker;
-(void)openRoomPicker;


@end

【讨论】:

以上是关于如何在 UIActionSheet 中添加 UIPickerView的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIAlertController 上添加动态按钮?

iOS iPad 如何使用 UIActionSheet 创建 UIPopoverController? [复制]

在 iOS8 的 UIActionSheet 中添加 UIPickerView 的最佳解决方案是啥?

将 UIPickerView 添加到 UIActionSheet(底部的按钮)

在 iOS 7 中,如何更改 UIActionSheet 中选项的颜色?

如何在uiactionsheet中管理uipickerview