2 UIPickerViews, каждый из которых имеет свою собственную UILabel для отображения значения из NSMutableArray - PullRequest
0 голосов
/ 04 марта 2011

У меня есть 2 UIPickerViews и две UILabel в моем представлении, а UIPickerViews заполнены числами из NSMutableArray.

Сборщикам необходимо отправить туда выбранное значение в назначенную метку.Пример:

_pickerView1 (выбрано «18») _pickerOutputLabel1 (показывает «18»)

_pickerView2 (выбрано «7») _pickerOutputLabel2 (показывает «7»)

Я могучтобы это не сработало, _pickerView2 также отправляет свое значение _pickerOutputLabel1 вместо _pickerOutputLabel2.

Я пробовал пару вещей, но не могу понять, как заставить его работать.

Это код (я удалил свои попытки решить проблему, чтобы он хотя бы компилировался:)

// заголовочный файл

#import <UIKit/UIKit.h>



@interface UIPickerViewAndLabelsViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {


NSMutableArray *nrArray;
IBOutlet UIPickerView *_pickerView1;
IBOutlet UIPickerView *_pickerView2;

UILabel *_pickerOutputLabel1;
    UILabel *_pickerOutputLabel2;

}
@property (nonatomic, retain) IBOutlet UIPickerView *pickerView1;
@property (nonatomic, retain) IBOutlet UIPickerView *pickerView2;
@property (nonatomic, retain) IBOutlet UILabel *pickerOutputLabel1;
@property (nonatomic, retain) IBOutlet UILabel *pickerOutputLabel2;
@end

// файл реализации

#import "UIPickerViewAndLabelsViewController.h"

@implementation UIPickerViewAndLabelsViewController

@synthesize pickerView1 = _pickerView1;
@synthesize pickerView2 = _pickerView2;
@synthesize pickerOutputLabel1 = _pickerOutputLabel1;
@synthesize pickerOutputLabel2 = _pickerOutputLabel2;

/*
// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
*/


// 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 {

_pickerOutputLabel1 = [[UILabel alloc]initWithFrame:CGRectMake(400, 120, 50, 50)];
[self.view addSubview:_pickerOutputLabel1];

_pickerOutputLabel2 = [[UILabel alloc]initWithFrame:CGRectMake(400, 320, 50, 50)];
[self.view addSubview:_pickerOutputLabel2];

nrArray = [[NSMutableArray alloc] init];

for (int i=0;i<20+1;i++) {

    [nrArray addObject:[NSString stringWithFormat:@"%d", i]];
}



_pickerView1 = [[UIPickerView alloc] initWithFrame:CGRectMake(500, 120, 100, 162)];


_pickerView1.delegate = self;
_pickerView1.dataSource = self;
_pickerView1.showsSelectionIndicator = YES;
_pickerView1.transform = CGAffineTransformMakeScale(0.8, 0.8);
[self.view addSubview:_pickerView1];
[_pickerView1 release];
[_pickerView1 selectRow:0 inComponent:0 animated:NO];

_pickerOutputLabel1.text = [nrArray objectAtIndex:[_pickerView1 selectedRowInComponent:0]];


_pickerView2 = [[UIPickerView alloc] initWithFrame:CGRectMake(500, 320, 100, 162)];


_pickerView2.delegate = self;
_pickerView2.dataSource = self;
_pickerView2.showsSelectionIndicator = YES;
_pickerView2.transform = CGAffineTransformMakeScale(0.8, 0.8);
[self.view addSubview:_pickerView2];
[_pickerView2 release];
[_pickerView2 selectRow:0 inComponent:0 animated:NO];

_pickerOutputLabel2.text = [nrArray objectAtIndex:[_pickerView2 selectedRowInComponent:0]];


    [super viewDidLoad];
}







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


- (void)pickerView:(UIPickerView *)_pickerView1 didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    _pickerOutputLabel1.text=    [nrArray objectAtIndex:row];
}

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

- (NSString *)pickerView:(UIPickerView *)_pickerView1 titleForRow:(NSInteger)row forComponent:(NSInteger)component;
{
    return [nrArray objectAtIndex:row];

}








// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

- (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 {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


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

@end

Я пытаюсь в течение 3 дней, и я застрял.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 10 мая 2012

Вы также можете использовать это: - (void) pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger) строка в компоненте: (NSInteger) компонент {

if( [pickerView isEqual: picker ]){
    firststr = [firstArray objectAtIndex:row];
}



if( [pickerView isEqual: pickerAnother ]){

    secondstr = [secondArray objectAtIndex:row];


}

}

0 голосов
/ 04 марта 2011

В методах делегата UIPickerView вы назвали параметр pickerView "_pickerView1". Именование этого параметра так же, как и переменной экземпляра , не означает , что означает, что метод делегата будет вызываться только для этого средства выбора. Он просто становится локальным именем для любого средства выбора, вызывающего метод делегата.

Поскольку вы установили делегата для обоих сборщиков как самостоятельные, оба сборщика вызывают одни и те же методы.

Чтобы узнать, какой сборщик совершает звонок, есть несколько способов:

  • Установите разные значения тега для каждого из них при их создании и проверьте тег в методе делегата (например, _pickerView1.tag = 1; и в методе делегата: if (pickerView.tag == 1)...)

  • Или сравните непосредственно с переменной экземпляра. Например:

    - (void)pickerView:(UIPickerView *)pickerView //<-- std name as in doc
                didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {
        if (pickerView == _pickerView1)
              // Above:
              //   "pickerView" is the picker in which a row was selected
              //   "_pickerView1" is the actual instance variable
            _pickerOutputLabel1.text = [nrArray objectAtIndex:row];
        else
            _pickerOutputLabel2.text = [nrArray objectAtIndex:row];
    }
    


Кроме того, у вас есть IBOutlet перед объявлениями управления, но затем вы создаете их программно. Если вы используете Interface Builder для создания элементов управления, не создавайте их заново в коде. Если вы не используете IB, удалите IBOutlet.

...