Проблема со свойством inputvie w UITextField, вызывающим пользовательский UIPickerView

У меня возникли проблемы с извлечением пользовательского UIPickerView из свойства inputview текстового поля. Я работал над этим некоторое время, провел некоторые исследования и попытался составить отдельный проект на основе примера 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

1 ответ

Решение

Проблема в этом методе:

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

Вы уже создали средство выбора в своем методе createPicker, который вызывается из viewDidLoad, поэтому при этом создается другой экземпляр (для этого экземпляра не будет делегата или источника данных, для которых установлено значение self, поскольку они были установлены для первого созданного вами экземпляра). Если вы просто удалите первую строку этого метода, он должен работать.

Два других комментария к вашему коду. Первые 2 строки в методе viewDidLoad ничего не делают, так как вы еще не создали средство выбора - их следует удалить. Вам также необходимо реализовать pickerView:didSelectRow:inComponent: метод, чтобы получить выбранное значение вашего средства выбора в текстовое поле.

Другие вопросы по тегам