同一视图中的两个 uipicker

Posted

技术标签:

【中文标题】同一视图中的两个 uipicker【英文标题】:Two uipicker in the same view 【发布时间】:2012-02-05 09:41:54 【问题描述】:

我想做的是将两个 uipicker 放在同一个视图上,我在某处读到其中一个应该有自己的单独代表我试图这样做,但我无法使其正常工作。 有时,当我运行应用程序时,第二个应用程序只是停止工作,控制台上没有任何错误。 这是视图的 .h 文件:

@interface FirstViewController : UIViewController 

IBOutlet UIPickerView *cities;
NSMutableArray *array;
NSString *picked;


@property(nonatomic,retain) IBOutlet UIPickerView *cities;
@property(nonatomic,retain) IBOutlet NSMutableArray *array;

这里是 .m:

@implementation FirstViewController
@synthesize cities,array;

-(void) getCities:(NSString *)link
    url=link;
    NSString *str=[[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
    if([str length]==0)
        [str release];
        return;
    

    SBJsonParser *parser=[[SBJsonParser alloc] init];
    array=[[parser objectWithString:str] copy];
    [receivedData release];




- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView  // This method needs to be used. It asks how many columns will be used in the UIPickerView 
    return 1; // We only need one column so we will return 1. 



- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component  // This method also needs to be used. This asks how many rows the UIPickerView will have. 
    return [array count]; // We will need the amount of rows that we used in the pickerViewArray, so we will return the count of the array. 
 


- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component  // what happens when selecting rows
    picked=[array objectAtIndex:row];
 


- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component  //method asks for what the title or label of each row will be
    return [array objectAtIndex:row]; // We will set a new row for every string used in the array. 
 

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad

    [sv setScrollEnabled:TRUE];
    [sv setContentSize:CGSizeMake(320, 800)];
    [self getCities:@"any url"];

    [super viewDidLoad];



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);



- (void)didReceiveMemoryWarning

    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc. that aren't in use.



- (void)viewDidUnload

    [super viewDidUnload];

    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;



- (void)dealloc

    [super dealloc];


@end

对于第二个 uipicker,我在视图中添加了一个 nsobject,并将其类更改为我之前创建的“SecondPickerDelegate”,这是它的代码: .h

#import <UIKit/UIKit.h>


@interface FirstViewSecondPickerDelegate :  UIViewController<UIPickerViewDelegate>

    IBOutlet UIPickerView *specialities;
    NSMutableArray *array;
    NSString *picked;


@property(nonatomic,retain) IBOutlet UIPickerView *specialities;
@property(nonatomic,retain) NSMutableArray *array;
@property(nonatomic,retain) NSString *picker;

@end

.m 文件:

#import "FirstViewSecondPickerDelegate.h"
#import "JSON.h"


@implementation FirstViewSecondPickerDelegate
@synthesize specialities,array,picker;

-(void) getSpecialities:(NSString *)link
    url=link;
    NSString *str=[[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
    if([str length]==0)
        [str release];
        return;
    

    SBJsonParser *parser=[[SBJsonParser alloc] init];
    array=[[parser objectWithString:str] copy];
    for(int i=0;i<[array count];i++)
        NSLog(@"index %i",i);
        NSLog(@"value %@",[array objectAtIndex:i]);
    



- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView  // This method needs to be used. It asks how many columns will be used in the UIPickerView 
    return 1; // We only need one column so we will return 1. 



- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component  // This method also needs to be used. This asks how many rows the UIPickerView will have. 
    return [array count]; // We will need the amount of rows that we used in the pickerViewArray, so we will return the count of the array. 
 


- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component  // what happens when selecting rows
    picked=[array objectAtIndex:row];
 


- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component  //method asks for what the title or label of each row will be
    return [array objectAtIndex:row]; // We will set a new row for every string used in the array. 
 


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization
        picked=@"1";
        [self getSpecialities:@"http://localhost:8080/Test/gs"];
    


    return self;

/*
-(void) viewDidLoad
    [super viewDidLoad];



*/

- (void)dealloc


    [super dealloc];


- (void)didReceiveMemoryWarning

    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.


#pragma mark - View lifecycle

/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView


*/


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad


    [super viewDidLoad];



- (void)viewDidUnload

    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);


@end

如果有人有这种情况的工作示例,请提供帮助。

【问题讨论】:

【参考方案1】:

您不需要为同一视图中的两个 UIPickerView 提供单独的委托。

使用UIPickerViewtag属性,然后你可以在委托方法中区分它们。

【讨论】:

或者,有一个出口或 ivar 指向每个,并在委托/数据源方法中检查。 非常感谢,我给了每个选择器一个标签,并比较了PickerView 参数,现在它工作正常,再次感谢。

以上是关于同一视图中的两个 uipicker的主要内容,如果未能解决你的问题,请参考以下文章

在其他视图控制器的标签上显示 UIPicker 选择

UIPicker 视图的 UITextfield 问题

UIPicker 视图不显示来自 JSON 数组的数据

从单个 UIPicker 获取两个标签的值

同一个 UIViewController 中的两个选择器视图

在 ASP.Net MVC 中的同一视图中分离两个表单