在多个 viewController 中显示的通用或单个 uipickerview

Posted

技术标签:

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

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

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

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

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

我做了什么..

我创建了一个新文件并使用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];

【讨论】:

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

以上是关于在多个 viewController 中显示的通用或单个 uipickerview的主要内容,如果未能解决你的问题,请参考以下文章

具有相同操作的所有 viewController 的通用导航栏

当用户单击不同的单元格时,如何在一个 ViewController 下显示多个 webview/URL

如何popToRootViewController在navigationController堆栈上有多个viewController,并且只显示一个过渡?

一个 ViewController 中的多个 CollectionView

在显示之前将 ViewController 加载到 ContainerView 中,因此没有可见的过渡

从单视图控制器向多个ViewControllers发送“StringValue”的可能方法?