UIPickerView и UITextField получают значение из UIPickerView - PullRequest
0 голосов
/ 26 марта 2012

Хорошо, я не могу понять, как подойти к этому.

У меня есть UITextField, который я динамически добавляю в UITableView в соответствии с определениями XML-файла. В XML-файле я могу указать список в качестве одного из типов данных, а затем я добавляю UIPickerView, который отображает список для inputView моего конкретного UITextField.

У меня проблемы с выяснением того, как взять выбранное значение из UIPickerView и добавить его в свойство text моего UITextField

Мой UIPickerView - это пользовательский класс, но я не добавил никаких дополнительных функций, я только переопределил его, чтобы сделать возможным передачу источника данных в UIPickerView как свойство.

Вот мой PickerViewDataSourceAndDelegate.h

#import <Foundation/Foundation.h>

@interface PickerViewDataSourceAndDelegate : UIPickerView <UIPickerViewDelegate, UIPickerViewDataSource>

@property (nonatomic, strong) NSMutableArray *pickerData;

@end

И это .m файл

#import "PickerViewDataSourceAndDelegate.h"

@implementation PickerViewDataSourceAndDelegate 

@synthesize pickerData;

-(id)init {
    if (self = [super init])
    {
        self.pickerData = [[NSMutableArray alloc] init];
    }
    return self;
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView {

    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component {
    return [self.pickerData count];
}

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return [self.pickerData objectAtIndex:row];
}

@end

Вот как я добавляю UITextField с UIPickerView в качестве inputView

    for(NodeProperty *nodeproperty in node.properties)
    {
        if(nodeproperty.flowDirection == (FlowDirection*)Output)
        {
            if([nodeproperty.typeName isEqualToString:@"System.String"] && nodeproperty.extendedType == (ExtendedType*)None && [nodeproperty.enumValues count] == 0)
            {
                ...
            }
            else if([nodeproperty.typeName isEqualToString:@"System.String"] && nodeproperty.extendedType == (ExtendedType*)MultilineText && [nodeproperty.enumValues count] == 0)
            {
                ...
            }
            else if([nodeproperty.typeName isEqualToString:@"System.Boolean"] && nodeproperty.extendedType == (ExtendedType*)None && [nodeproperty.enumValues count] == 0)
            {
                ...
            }
            else if([nodeproperty.typeName isEqualToString:@"System.Double"] && nodeproperty.extendedType == (ExtendedType*)None && [nodeproperty.enumValues count] == 0)
            {
                ...
            }
            else if([nodeproperty.typeName isEqualToString:@"System.String"] && nodeproperty.extendedType == (ExtendedType*)None && [nodeproperty.enumValues count] > 0)
            {
                UILabel *fieldLabel = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, 290, 20)];
                fieldLabel.text = nodeproperty.name;
                [rowsInSectionLabels addObject:fieldLabel];

                PickerViewDataSourceAndDelegate *pickerDataDel = [[PickerViewDataSourceAndDelegate alloc] init];

                pickerDataDel.pickerData = nodeproperty.enumValues;
                pickerDataDel.dataSource = pickerDataDel;
                pickerDataDel.delegate = pickerDataDel;

                UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(5, 25, 290, 30)];
                [textField setBorderStyle:UITextBorderStyleRoundedRect];
                textField.inputView = pickerDataDel;
                [rowsInSection addObject:textField];
            }
            else
            {
              ....

Для пространства я пропустил часть пространства, если некоторые вещи неясны, я с удовольствием объясню.

Каждая вещь работает без исключений, я просто хочу получить выбранное значение из средства выбора

Ответы [ 4 ]

1 голос
/ 26 марта 2012

Я нашел свое собственное решение, что слова как талисман, мне пришлось создать метод делегата для передачи значения обратно в мой UITextField.

Сначала я объявил протокол в моем PickerViewDataSourceAndDelegate.h

@protocol PickerRowSelected
-(void) selectedARowAndValueIs:(NSString*)aValue;
@end

Затем я добавил члена:

id <PickerRowSelected> adelegate;

и добавил свойство

@property (nonatomic, strong) id<PickerRowSelected> adelegate;

Затем я добавил эту функцию

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    [adelegate selectedARowAndValueIs:[self.pickerData objectAtIndex:row]];
}

И вконтроллер, который содержит текстовое поле, которое я добавил:

pickerDataDel.adelegate = self;

И реализовал мой новый метод делегата

-(void) selectedARowAndValueIs:(NSString *)aValue
{
    UITextField *aview = (UITextField*)[self.view findViewThatIsFirstResponder];
    aview.text = aValue;
}

Смотрите мой ответ на этот вопрос, чтобы найти представление, которое является первым респондентом

Найти представление, которое является первым респондентом

1 голос
/ 26 марта 2012

См. протокол делегата в представлении выбора . Реализуйте этот метод:

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

Здесь вы можете получить соответствующее значение из модели и обновить текстовое поле.

Чтобы определить, какое текстовое поле является текущим, вам необходимо выяснить, какое из текстовых полей является первым респондентом.

Имейте все текстовые поля в IBOutletCollection или массиве, итерируйте их и найдите то, которое является первым респондентом.

Или, если у вас есть делегаты текстового поля, вы можете установить ivar для текущего текстового поля в методе делегата didBeginEditing и использовать его в методе делегата представления выбора выше.

0 голосов
/ 26 марта 2012
- (void)pickerView:(UIPickerView *)pickerView1 didSelectRow: (NSInteger)row inComponent:(NSInteger)component {
    NSInteger selectedRow = [pickerView1 selectedRowInComponent:0];
    NSString *selectedPickerRow=[yourArrayOfElements objectAtIndex:selectedRow];





    // Handle the selection
}

Передать строку в текстовое поле

0 голосов
/ 26 марта 2012

Используйте -[UIPickerView selectedRowInComponent:], чтобы определить, какая строка выбрана, а затем вернуть объект с этим индексом в массив данных.

...