Общий или одиночный пользовательский просмотр для отображения в нескольких viewControllers

Я хочу знать, как я могу сделать общий / один UIPickerView отображать в нескольких ViewControllers,

Я хочу показать pickerView в нескольких ViewController. Теперь, как я могу его создать.

Я знаю, как создать его, как реализовать и написать его делегат для этого..

Но я не хочу создавать эти делегаты в каждом классе и писать эти методы снова и снова.

Что я сделал..

Я создал новый файл и унаследовал его UIPickerView, и создать NSArray property показать в нем. и также реализовал свой делегат, но теперь не знаю, как это сделать.

Покажите мне какой-нибудь пример, чтобы сделать общий UIPickerView или помочь мне его создать.

1 ответ

Решение

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

typedef void(^completionHandler) (NSString *selectedString);

@interface RDPickerController : NSObject <UIPickerViewDataSource, UIPickerViewDelegate>

@property (strong,nonatomic) UIPickerView *picker;

-(instancetype)initWithCompletionHandler:(completionHandler) completion;

В файле.m реализуйте любые необходимые вам источники данных и методы делегирования и вызовите блок завершения в pickerView:didSelectRow:inComponent: метод,

@interface RDPickerController ()
@property (strong,nonatomic) NSArray *data;
@property (copy,nonatomic) completionHandler compBlock;
@end

@implementation RDPickerController


-(instancetype)initWithCompletionHandler:(completionHandler)completion {
    if (self = [super init]) {
        _picker = [UIPickerView new];
        _picker.delegate = self;
        _picker.dataSource = self;
        _data = @[@"One", @"Two", @"Three", @"Four", @"Five", @"Six", @"Seven", @"Eight", @"Nine", @"Ten"];
        _compBlock = completion;
    }
    return self;
}


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


-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return self.data.count;
}


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


-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    self.compBlock(self.data[row]);
}

В ваших классах контроллеров вы можете создать и использовать подобный сборщик,

@interface ViewController ()
@property (strong,nonatomic) RDPickerController *pc;
@end

@implementation ViewController

- (IBAction)showPicker:(UIButton *)sender {
    self.pc = [[RDPickerController alloc] initWithCompletionHandler:^(NSString *selectedString) {
        NSLog(@"%@",selectedString);
        // do whatever with the returned data here
    }];

    [self.view addSubview:self.pc.picker];
}
Другие вопросы по тегам