在多个 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