2013-07-10 5 views
1

У меня есть экран со многими текстовыми полями на нем. Для одного конкретного текстового поля мне нужно, чтобы он показывал сборщик, из которого пользователь может выбирать имена состояний, как только пользователь выбрал состояние, нажав на имя состояний, сборщик должен исчезнуть.Показать UIPickerView при нажатии UITextField

Я не совсем уверен, как это сделать, я создал файл 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 

А вот мой .М файл:

#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

Unrelated к вашей проблеме, но это может быть полезно. Вы можете прекратить использование @synthesize (http://www.techotopia.com/index.php/The_Basics_of_Modern_Objective-C). Это много пустых печатей. – h4labs

+0

И не нужно также для всех этих общественных иваров. Просто используйте свойства. – 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

Спасибо за ответ, но это не сработало. Я получил пару ошибок после того, как вложил это. После устранения этих ошибок сборщик появился и никогда не исчезал, он также был пуст. Это то, что я добавил. [link] (http://i.imgur.com/mqs6hKE.png) Когда я запустил его, я прокомментировал эту строку. Еще раз спасибо. – FidelCashflo

+0

Я думаю, что вам нужно использовать: // возвращает число «столбцов» для отображения. - (NSInteger) numberOfComponentsInPickerView: (UIPickerView *) pickerView { return 1; } // возвращает # строк в каждом компоненте .. - (NSInteger) pickerView: (UIPickerView *) pickerView numberOfRowsInComponent: (NSInteger) компонент { возвращение listArr.count } –

+1

я не мог получить эту работу , Но я нашел другое решение, здесь: [link] (http://asanhussain.blogspot.com/search/label/Click%20on%20UITextField%20to%20show%20a%20UIPickerView) Спасибо за вашу помощь! – FidelCashflo

2

Я думаю, что вам нужно реализовать методы делегата для UITextField, когда метод

- (void)textFieldDidBeginEditing:(UITextField *)textField 

называется установить рамку uipicker и показать его.

Смежные вопросы