Два средства выбора в представлении - приложение для iPhone

Я использую два UIPickers в представлении. первый сборщик имеет 3 компонента, а второй - один. но когда я выбираю элементы, он показывает правильные элементы из первого средства выбора, но всегда возвращает первый элемент из второго средства выбора независимо от выбранной строки. Пожалуйста помоги.

вот код, который я использую.

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
   if (pickerView == triplePicker) 
     return 3;
   else {
     return 1;
   }
}


-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
   if (pickerView == triplePicker) {  
      if (component == kColorComponent)
         return[colorList count];
      if (component == kClarityComponent)
         return[clarityList count];
      return[shapeList count];
   }
   else{
      return [listPickerItems count];
   }
}

-(NSString *)pickerView:(UIPickerView *)pickerView
            titleForRow:(NSInteger)row
           forComponent:(NSInteger)component 
{   
   if (pickerView == triplePicker) {  
      if (component == kColorComponent)
         return [colorList objectAtIndex:row];
      if (component == kClarityComponent)
         return [clarityList objectAtIndex:row];
      return [shapeList objectAtIndex:row];  
   }
   else{
      return [listPickerItems objectAtIndex:row];
   }
}

в событии, нажатом кнопкой, у меня есть следующее для второго средства выбора, чтобы вернуть выбранный элемент:

NSInteger pickrow = [listPicker selectedRowInComponent:0];
NSString *picked = [listPickerItems objectAtIndex:pickrow];

person ashp    schedule 22.08.2010    source источник


Ответы (1)


Я бы определенно предложил использовать двух отдельных делегатов для обработки двух сборщиков.

Кроме того, я предполагаю, что вы используете Interface Builder для настройки своего представления. Если это так, проверьте, правильно ли вы связали свой listPicker с владельцем вашего файла. Если listPicker будет равен нулю, тогда selectedRowInComponent: всегда будет возвращать null (0 для NSInteger), следовательно, всегда будет выбираться первый элемент в вашем массиве.

РЕДАКТИРОВАТЬ: пример кода для отдельных делегатов:

Вам нужно создать второй класс, который будет вашим делегатом, например:

ФёрстПикерДелегате.h

#import <Foundation/Foundation.h>

@class UntitledViewController;

@interface FirstPickerViewDelegate : NSObject <UIPickerViewDelegate, UIPickerViewDataSource> {
    NSArray* values;
    IBOutlet UntitledViewController* viewController;
}
-(void) loadData;

@property (nonatomic, retain) NSArray* values;
@property (nonatomic, assign) IBOutlet UntitledViewController* viewController;

@end

FirstPickerViewDelegate.m

#import "FirstPickerViewDelegate.h"


@implementation FirstPickerViewDelegate
@synthesize values;
@synthesize viewController;

-(id) init
{
    if ( self = [super init] )
    {
        [self loadData];
    }
    return self;
}

-(void) loadData
{
    NSArray* array = [[NSArray alloc] initWithObjects:@"first", @"second", @"third", nil];
    self.values = array;
    [array release];
}

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

-(void) dealloc
{
    self.values = nil;
    [super dealloc];
}
@end

Ваш ViewController (здесь UntitledViewController, извините за имя):

#import <UIKit/UIKit.h>

@class FirstPickerViewDelegate;
@interface UntitledViewController : UIViewController {
    IBOutlet UIPickerView* firstPicker;
    IBOutlet FirstPickerViewDelegate* firstDelegate;
}

@property (nonatomic, retain) IBOutlet UIPickerView* firstPicker;
@property (nonatomic, retain) IBOutlet FirstPickerViewDelegate* firstDelegate;

@end

По сути, вам нужно поместить NSObject в свой список объектов и изменить его класс на FirstPickerViewDelegate, а затем установить соединения следующим образом: alt  текст

Я чувствую, что на этот раз перестарался, но сегодня у меня хорошее настроение, так что неважно :P

О главном вопросе: дважды проверьте, что listPicker не равен нулю в момент нажатия кнопки, если это не так, попробуйте использовать

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

чтобы отследить ошибку.

person Mayjak    schedule 22.08.2010
comment
Я не уверен, как использовать двух отдельных делегатов для двух сборщиков. мой listPicker (второй сборщик) правильно связан с владельцем файла в IB. - person ashp; 22.08.2010
comment
ой.... моя ошибка. Спасибо за вашу помощь. Похоже, я не правильно подключил владельца файла к listPicker. Теперь он возвращает правильное значение для выбранной строки. - person ashp; 23.08.2010