2013-07-10 68 views
1

我有一个屏幕上有许多文本字段。对于一个特定的文本字段,我需要它显示一个用户可以从中选择状态名称的选择器,一旦用户通过单击状态名称选择状态,选择器应该消失。单击UITextField时显示UIPickerView

我不太清楚如何做到这一点,我已经使Nib文件看起来像这样。

Nib

这里是我的头文件:

#import <UIKit/UIKit.h> 
#import "APIHelper.h" 

@interface AddNewAddressViewController : UIViewController <UIPickerViewDelegate,    
UIPickerViewDataSource, UITextFieldDelegate> 
{ 
    APIHelper *myAPIHelper;  
    NSMutableData *responseData; 
    NSURLConnection *theConnection; 

    UIPickerView *picker; 
    NSArray *stateNames; 

    @public IBOutlet UIImageView *imageNewAddressBox; 
    @public IBOutlet UIImageView *imageNewAddressBox1;  
    @public IBOutlet UIImageView *imageNewAddressBox2;  
    @public IBOutlet UIImageView *imageNewAddressBox3; 

    @public IBOutlet UILabel *labelNewAddress;  
    @public IBOutlet UILabel *labelStreetAddress;  
    @public IBOutlet UILabel *labelStreetAddressTwo;  
    @public IBOutlet UILabel *labelZipCode;  
    @public IBOutlet UILabel *labelState;  
    @public IBOutlet UILabel *labelCity;  
    @public IBOutlet UILabel *labelPhoneNumber;  

    @public IBOutlet UITextField *textFieldFullName; 
    @public IBOutlet UITextField *textFieldStreetAddress; 
    @public IBOutlet UITextField *textFieldPhoneNumber; 
    @public IBOutlet UITextField *textFieldStreetAddressTwo; 
    @public IBOutlet UITextField *textFieldCity; 
    @public IBOutlet UITextField *textFieldState; 
    @public IBOutlet UITextField *textFieldZipCode; 

    @public IBOutlet UIButton *buttonNext; 
} 

@property (nonatomic, strong) IBOutlet UIPickerView *picker; 
@property (nonatomic, strong) NSArray *stateNames; 

@property (nonatomic, strong) IBOutlet UIImageView *imageNewAddressBox; 
@property (nonatomic, strong) IBOutlet UIImageView *imageNewAddressBox1; 
@property (nonatomic, strong) IBOutlet UIImageView *imageNewAddressBox2; 
@property (nonatomic, strong) IBOutlet UIImageView *imageNewAddressBox3; 

@property (nonatomic, strong) IBOutlet UILabel *labelNewAddress; 
@property (nonatomic, strong) IBOutlet UILabel *labelStreetAddress; 
@property (nonatomic, strong) IBOutlet UILabel *labelStreetAddressTwo; 
@property (nonatomic, strong) IBOutlet UILabel *labelZipCode; 
@property (nonatomic, strong) IBOutlet UILabel *labelState; 
@property (nonatomic, strong) IBOutlet UILabel *labelCity; 
@property (nonatomic, strong) IBOutlet UILabel *labelPhoneNumber; 

@property (nonatomic, strong) IBOutlet UITextField *textFieldFullName; 
@property (nonatomic, strong) IBOutlet UITextField *textFieldStreetAddress; 
@property (nonatomic, strong) IBOutlet UITextField *textFieldPhoneNumber; 
@property (nonatomic, strong) IBOutlet UITextField *textFieldStreetAddressTwo; 
@property (nonatomic, strong) IBOutlet UITextField *textFieldCity; 
@property (nonatomic, strong) IBOutlet UITextField *textFieldState; 
@property (nonatomic, strong) IBOutlet UITextField *textFieldZipCode; 

@property (nonatomic, strong) IBOutlet UIButton *buttonNext; 

-(IBAction)addressTextFieldShouldReturn:(id)sender; 
-(IBAction)nextPressed; 

@end 

这里是我的.m文件:

#import "AddNewAddressViewController.h" 

@implementation AddNewAddressViewController 

@synthesize imageNewAddressBox; 
@synthesize imageNewAddressBox1; 
@synthesize imageNewAddressBox2; 
@synthesize imageNewAddressBox3; 
@synthesize labelNewAddress; 
@synthesize labelStreetAddress; 
@synthesize labelStreetAddressTwo; 
@synthesize labelZipCode; 
@synthesize labelState; 
@synthesize labelCity; 
@synthesize labelPhoneNumber; 
@synthesize textFieldFullName; 
@synthesize textFieldStreetAddress; 
@synthesize textFieldPhoneNumber; 
@synthesize textFieldStreetAddressTwo; 
@synthesize textFieldCity; 
@synthesize textFieldState; 
@synthesize textFieldZipCode; 
@synthesize buttonNext; 
@synthesize stateNames; 
@synthesize picker; 


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    self.stateNames = [[NSArray alloc] initWithObjects:@"Alabama", @"Alaska", @"Arizona", @"Arkansas", @"California", @"Colorado", @"Connecticut", @"Delaware", @"District of Columbia", @"Florida", @"Georgia", @"Guam", @"Hawaii", @"Idaho", @"Illinois", @"Indiana", @"Iowa", @"Kansas", @"Kentucky", @"Louisiana", @"Maine", @"Maryland", @"Massachusetts", @"Michigan", @"Minnesota", @"Mississippi", @"Missouri", @"Montana", @"Nebraska", @"Nevada", @"New Hampshire", @"New Jersey", @"New Mexico", @"New York", @"North Carolina", @"North Dakota", @"Ohio", @"Oklahoma", @"Oregon", @"Pennsylvania", @"Puerto Rico", @"Rhode Island", @"South Carolina", @"South Dakota", @"Tennessee", @"Texas", @"Utah", @"Vermont", @"Virginia", @"Virgin Islands", @"Washington", @"West Virginia", @"Wisconsin", @"Wyoming", nil]; 

    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 

    // clicking outside the textfields removes keyboard 
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] 
            initWithTarget:self 
            action:@selector(addressTextFieldShouldReturn:)]; 
    [self.view addGestureRecognizer:tap];  
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self setTitle: @"Update Address Book"]; 
} 

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

- (void)viewDidUnload { 
    [super viewDidUnload]; 
} 

-(IBAction)addressTextFieldShouldReturn:(id)sender 
{ 
    [textFieldFullName resignFirstResponder]; 
    [textFieldStreetAddress resignFirstResponder]; 
    [textFieldStreetAddressTwo resignFirstResponder]; 
    [textFieldPhoneNumber resignFirstResponder]; 
    [textFieldState resignFirstResponder]; 
    [textFieldCity resignFirstResponder]; 
    [textFieldZipCode resignFirstResponder]; 
    [sender resignFirstResponder]; 
} 

#pragma mark - 
#pragma mark PickerView DataSource 

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
{ 
    return 1; 
} 
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    return [stateNames count]; 
} 
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent: (NSInteger)component 
{ 
    return [stateNames objectAtIndex:row]; 
} 
@end 

因此,所有我希望它做的是,用户在点击textFieldState,从底部弹出一个包含所有状态名称的选择器,然后用户单击状态名称,该名称出现在textFieldState中。

任何帮助将不胜感激。谢谢。

+1

完全无关的问题,但它可能会有所帮助。你可以停止使用@synthesize(http://www.techotopia.com/index.php/The_Basics_of_Modern_Objective-C)这是浪费了很多输入。 – h4labs

+0

而且所有这些公共ivars都不需要。只需使用属性。 – rmaddy

回答

3

可以使用TextFielđelegate下后处理

#pragma mark- text delegate 
-(void)textFieldDidBeginEditing:(UITextField *)textField{ 
if (textField==txtMonth) { 
    [txtMonth resignFirstResponder]; 
    if (monthClick==0) { 
     monthPicker.hidden=NO; 
     monthPicker = [[AFPickerView alloc] initWithFrame:CGRectMake(98.0, 123.0, 126.0, 197.0)]; 
     monthPicker.dataSource = self; 
     monthPicker.delegate = self; 
     [monthPicker reloadData]; 
     if ([txtMonth.text isEqualToString:@""]) { 

      txtMonth.text=[NSString stringWithFormat:@"%i",1]; 
     } 
     [self.view addSubview:monthPicker]; 
     monthClick=1; 
    } 


} 

}

+0

感谢您的回应,但这并没有奏效。在把这些错误消除之后,我得到了一些错误。在消除了这些错误之后,拾取器出现并且从不消失,它也是空的。 这就是我所添加的。 [链接](http://i.imgur.com/mqs6hKE.png) 当我跑了它,我评论说,线。 再次感谢。 – FidelCashflo

+0

我认为你需要使用: //返回'columns'的数量来显示.-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 1; } // 返回行的#中的每个组件.. - (NSInteger的)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger的)组件{ 回报listArr.count } –

+1

我不能得到这个工作。但我发现另一个解决方案,在这里:[链接](http://asanhussain.blogspot.com/search/label/Click%20on%20UITextField%20to%20show%20a%20UIPickerView) 感谢您的帮助! – FidelCashflo

2

我认为你需要实现的UITextField,当

- (void)textFieldDidBeginEditing:(UITextField *)textField 

方法被称为设置uipicker的框架,并显示委托方法。

相关问题