0

ビューで 2 つの UIPicker を使用しています。最初のピッカーには 3 つのコンポーネントがあり、2 番目のピッカーには 1 つのコンポーネントがあります。しかし、アイテムを選択すると、最初のピッカーから正しいアイテムが表示されますが、選択した行に関係なく、常に2番目のピッカーから最初のアイテムが返されます。助けてください。

これが私が使用しているコードです。

-(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];
   }
}

ボタンが押されたイベントでは、2番目のピッカーが選択したアイテムを返すために次のようにしています:

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

1 に答える 1

0

2 つのピッカーを処理するには、2 つの別個のデリゲートを使用することをお勧めします。

それとは別に、Interface Builder を使用してビューを設定していると思います。その場合は、listPicker がファイルの所有者に正しくリンクされているかどうかを確認してください。listPicker が nil の場合、selectedRowInComponent: は常に null (NSInteger の場合は 0) を返すため、配列の最初の項目が常に選択されます。

編集: 個別のデリゲートのサンプル コード:

次のように、2 番目のクラスをデリゲートとして作成する必要があります。

FirstPickerDelegate.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 に変更してから、次のように接続する必要があります。 代替テキスト

今回は作りすぎた気がしますが、今日は機嫌がいいのでどうでもいいです :P

主な質問について: ボタンを押したときに listPicker が nil でないことを再確認してください。そうでない場合は、使用してみてください

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

エラーを追跡します。

于 2010-08-22T18:40:13.000 に答える