2

テキストフィールドの inputview プロパティからカスタム UIPickerView を取得するのに問題がありました。私はしばらくこれに取り組んでおり、いくつかの調査を行い、Apple の UICatalog の例に基づいて別のプロジェクトをまとめようとしました。

ただし、テキスト フィールド内をタップすると、ピッカー ビューの代わりに黒い画面が表示されます。私は何かを見落としていると確信していますが、何日も助けていただければ幸いです。

これは、この機能を他のアプリに追加できるかどうかを確認するためのテスト プロジェクトであり、多くのコードを UICatalog アプリからコピーしようとしたことを覚えておいてください。意味不明な点がありましたら申し訳ありませんが、ご不明な点がございましたらお気軽にお問い合わせください。ありがとうございました。

//  ViewController.h
//  TestPicker

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource>{

UIPickerView *picker;
     //The picker view the textfield responds to.

IBOutlet UITextField *myText;
     //The textfield which has the input view of a picker.

NSArray *testArray;
     //The array which values are loaded into the picker.
}

@end


//  ViewController.m
//  TestPicker


#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    picker.delegate=self;
    picker.dataSource=self;
    myText.delegate=self;

    [self createPicker];

    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    myText = nil;
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    } 
    else {
        return YES;
    }
}

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    picker = [[UIPickerView alloc] initWithFrame:CGRectZero];
    myText.inputView=picker;
    return YES;
}

-(void)textFieldDidBeginEditing:(UITextField *)textField{

}


- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    NSString *returnStr = @"";

    if (pickerView == picker)
    {
        if (component == 0)
        {
            returnStr = [testArray objectAtIndex:row];
        }
        else
        {
            returnStr = [[NSNumber numberWithInt:row] stringValue];
        }
    }

    return returnStr;
}

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

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


- (void)createPicker
{
    testArray = [NSArray arrayWithObjects:
                            @"John Appleseed", @"Chris Armstrong", @"Serena Auroux",
                            @"Susan Bean", @"Luis Becerra", @"Kate Bell", @"Alain Briere",
                        nil];


    picker = [[UIPickerView alloc] initWithFrame:CGRectZero];


    picker.showsSelectionIndicator = YES;   // note this is default to NO

    picker.delegate = self;
    picker.dataSource = self;

}

@end
4

1 に答える 1

3

問題はこの方法にあります:

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    picker = [[UIPickerView alloc] initWithFrame:CGRectZero];
    myText.inputView=picker;
    return YES;
}

viewDidLoad から呼び出された createPicker メソッドで既にピッカーを作成しているため、これにより別のインスタンスが作成されます (作成した最初のインスタンスで設定されているため、このインスタンスではデリゲートまたはデータ ソースが self に設定されません)。このメソッドの最初の行を削除するだけで機能します。

コードに関する他の 2 つのコメント。ピッカーをまだ作成していないため、viewDidLoad メソッドの最初の 2 行は何も実行していません。削除する必要があります。ピッカーで選択した値をテキスト フィールドに取得するには、pickerView:didSelectRow:inComponent: メソッドも実装する必要があります。

于 2012-06-10T05:33:04.080 に答える