2

わかりUIPickerViewました。カスタムクラスに接続しようとしています。アイデアは、1つの通常のビューに3つのピッカービューを持つことです。

  1. これまでに、1つのビューを作成し、それをクラスTestView.hにバインドしました。
  2. 次に、ストーリーボードのビューにピッカービューを追加しました(iOS 5)
  3. 次に、このピッカービューのクラスを作成しました。

    @interface TestPickerView : UIPickerView <UIPickerViewDelegate, UIPickerViewDataSource> 
    {  
      NSArray *data;  
    }
    
  4. 次に、通常のビュー(TestView.h)にプロパティを追加しようとしました

    #import "TestPickerView.h"
    @interface TestView : UIViewController
      @property (strong, nonatomic) IBOutlet TestPickerView *myTestPicker;
    @end
    

しかし、通常のビュー内のUIPickerViewをこのクラス/プロパティにバインドするにはどうすればよいですか?

最終的には3つのUIPickerViewがあり、UIViewControllerこれらを制御するために3つの参照を含めることを考えましたUIPickerViews。そうすれば、通常のビューが読み込まれているときにプロパティを使用してデータ(データソース)を設定すると、PickerViewsが表示されます。うまくいけば、ビューの1つに値が発生したときに、通常のビューでも通知を受け取ることができます。

4

2 に答える 2

1

コントローラーなので、代わりにTestView>>と呼んでください。TestViewController

ストーリーボードで、PickerViewを選択し、そのクラス名をに変更しTestPickerViewます。

ここに画像の説明を入力してください
ここに画像の説明を入力してください

その後、3つを作成しIBOutlets、PickerViewsを接続します。それでおしまい。

//編集:説明するために、ピッカーをどのように区別するか。3つのアウトレットを作成します。例:

IBOutlet TestPickerView *picker1;
IBOutlet TestPickerView *picker2;
IBOutlet TestPickerView *picker3;

そして、デリゲートメソッドよりも、どのピッカーがデリゲートを呼び出したかを確認します。例:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    if(pickerView == self.picker1)
    {
        // picker1
    }
    else if(pickerView == self.picker2)
    {
        // picker2
    }
    else
    {
        // picker3
    }
}
于 2012-07-10T19:11:34.897 に答える
0

これが私のアプリやゲームのいくつかで私がやった方法です。

 #import <UIKit/UIKit.h>
    #pragma mark - Delegate Protocol 
    @protocol someDelegate
    @required
    -(void)somePickerFinishedPicking:(id)item;
    @end

    #pragma mark - Class interface 
    @interface SomePicker : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource>
    {
        NSMutableArray* dataSource;
    }

    #pragma mark - Property Istantiation 

    @property (nonatomic, retain) NSMutableArray* dataSource;
    @property (nonatomic, retain) id <someDelegate> pickDelegate;

    #pragma mark - Constructors / Destructors

    - (id)   initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
    - (void) didReceiveMemoryWarning;
    - (void) dealloc;
    - (void) createDataSource;

    #pragma mark - View Lifecycle
    - (void) viewDidLoad;

    #pragma mark - UIPicker Protocols

    -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
    -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
    -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;
    -(UIView*) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view;

    #pragma mark - Delegate Protocols

    -(void) handlePickerDidFinish:(id)item;

    @end

あなたの.mのためにこれ

#pragma mark - Class Implementation 
@implementation SomePicker

#pragma mark - Variable synthesize 
// ARRAYS
@synthesize dataSource;

// DELEGATES
@synthesize pickDelegate = _pickDelegate;

#pragma mark - Constructors / Deconstructors 
// Class initialization
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        dataSource = [[NSMutableArray alloc] init];
        [self createDataSource];
    }
    return self;
}

// Handles memory warning events
- (void)didReceiveMemoryWarning
{
    // Release the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

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

// Garbage Collection
- (void) dealloc;
{
    // Release what you need
    self.dataSource = nil;
    [super dealloc];
}

// Creates the occasion entries for the picker
-(void)createDataSource
{
    NSMutableDictionary* dataDictionary = [[NSMutableDictionary alloc] init];
    // create your data source here or just forget about this and pass it from the parentViewController.
    [dataDictionary release];
}

#pragma mark - View lifecycle
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad;
{
    [super viewDidLoad];

    UIPickerView* occasionsPicker = [[UIPickerView alloc] init];
    [occasionsPicker setDataSource:self];
    [occasionsPicker setDelegate:self];
    [occasionsPicker setTag:888];
    [occasionsPicker selectRow:500 inComponent:0 animated:YES];
    [self.view addSubview:occasionsPicker];
    [occasionsPicker release];

    [self handlePickerDidFinish:[[self.dataSource objectAtIndex:(500 % self.dataSource.count)] objectForKey:@"key"]];
}

#pragma mark - UIPicker Protocols

// Creates the rows in the picker.
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{   
    // Endless roll illusion else just bind it to the size of the data source
    return 1000;
}

// Determines the number of columns in the picker
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    // Add however many columns you need
    return 1;
}

// Handles the event when the user picks a row.
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    //this does something with the row selected
    [self handlePickerDidFinish:[[self.dataSource objectAtIndex:(row % self.dataSource.count)] objectForKey:@"key"]];
}

// Creates the custom view for each cell so the text shows in accordance to the App Style
-(UIView*) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
    UILabel* customRowLabel = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, [pickerView rowSizeForComponent:component].width, [pickerView rowSizeForComponent:component].height)] autorelease];

    customRowLabel.font = [UIFont fontWithName:@"HelveticaNeue" size: 16];
    customRowLabel.textColor = [UIColor colorWithRed:kColorRed green:kColorGreen blue:kColorBlue alpha:1];
    customRowLabel.textAlignment = UITextAlignmentCenter;
    customRowLabel.backgroundColor = [UIColor clearColor];

    customRowLabel.text = [[self.dataSource objectAtIndex:(row % self.dataSource.count)] objectForKey:@"key"];

    return customRowLabel;
}

#pragma mark - Delegate Protocols 
// Notifies Delegate class that an action has been perfomed and passes the Mood String selected
-(void)handlePickerDidFinish:(id)item
{
    [self.pickDelegate somePickerFinishedPicking:item];
}

@end

そして、親のViewControllerでそのようにインスタンス化します。

CGRect rectPicker = CGRectMake(60, 100, 200, 216);
self.somePicker = [[[SomePicker alloc] init] autorelease];
[self.somePicker setPickDelegate:self];
[self.somePicker.view setBackgroundColor:[UIColor clearColor]];
self.somePicker.view.frame = rectPicker;
[self.somePicker.view setTag:777];
[self.somePicker.view setAlpha:0];
[self.view addSubview:self.somePicker.view];

〜/行末

于 2012-07-10T19:27:29.653 に答える