【问题标题】:Generic or Single uipickerview to show in multiple viewControllers在多个 viewController 中显示的通用或单个 uipickerview
【发布时间】:2014-08-30 13:41:34
【问题描述】:

我想知道如何使通用/单个UIPickerView 显示在多个ViewControllers 中。

我想在多个 ViewController 中显示一个 pickerView。现在我该如何创建它。

我知道如何像实现一样创建它并为其编写委托..

但我不想在每个类中创建这些委托并再次编写这些方法并再次......

我做了什么..

我创建了一个新文件并使用UIPickerView 继承它。并创建一个 NSArray property 以显示在其中。并且还实现了它的委托,但现在不知道该怎么做。

向我展示一些示例来制作通用 UIPickerView 或帮助我创建它..

【问题讨论】:

    标签: ios uipickerview uipickerviewdatasource uipickerviewdelegate


    【解决方案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];
    }
    

    【讨论】:

    • @Nepster,如果您需要将数据传递给这个类,只需将 init 方法更改为类似 initWithData:(NSArray *) data completionHandler:(completionHandler)completion,然后将您的数组传递给它.
    • 你能给我推荐一些我学习IOS的好教程吗?我有安卓背景...感谢您的指导..
    • @Nepster,对不起,我不知道有什么好的教程。我主要是通过阅读文档和制作许多小应用程序来测试东西来学习的。我还观看了斯坦福 CS193P 视频,我认为这是了解 iOS 速度的好方法。
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多