UIPickerView 依赖于 UITableView
Posted
技术标签:
【中文标题】UIPickerView 依赖于 UITableView【英文标题】:UIPickerView depending on UITableView 【发布时间】:2013-05-20 11:25:57 【问题描述】:我没有太多编程经验,所以这是我的问题:
我正在尝试编写一个转换器应用程序。最后,您可以输入一个数字。然后我有两个组件UIPickerView
。使用第一个组件,您可以选择输入格式(例如 °Celcius)。使用第二个组件,您可以选择输出格式(例如°Fahrenheit),以便将°Celcius 转换为°Fahrenheit。
但我想添加更多单位(重量、能量等)。我希望它们显示在UITableView
上。如果我在UITableView
中选择某个单元格,UIPickerView
必须更新其委托。更准确地说,我拥有单位名称(例如 eV、Joule、cal、erg 等)的数组必须以某种方式在detailViewController
(我有我的UIPickerView
)中实现。
这是我的代码:
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
<UITableViewDataSource,UITableViewDelegate,UIPickerViewDataSource,UIPickerViewDelegate>
@property (strong,nonatomic) IBOutlet UIPickerView *EinheitenPicker;
@property (weak,nonatomic) IBOutlet UITableView *EinheitenTableView;
@end
ViewController.m
#import "ViewController.h"
@interface ViewController ()
NSArray *EinheitenNameArray;
@end
@implementation ViewController
@synthesize EinheitenPicker,EinheitenTableView;
- (void)viewDidLoad
[super viewDidLoad];
EinheitenNameArray=[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"AlleEinheiten" ofType:@"plist"]];
[self.EinheitenTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES scrollPosition:UITableViewScrollPositionTop];
[self.EinheitenTableView.delegate tableView:self.EinheitenTableView didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
#pragma mark UItableView Delegate
- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
return 1;
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return EinheitenNameArray.count;
- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIdentifier=@"CellId";
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(cell==nil)
cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
cell.textLabel.text=[[EinheitenNameArray objectAtIndex:indexPath.row] objectForKey:@"Titel"];
return cell;
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
//NSLog(@"Chosen:%@",self.EinheitenPicker);
[self.storyboard instantiateViewControllerWithIdentifier:@"TestId"];
[self.EinheitenPicker reloadAllComponents];
#pragma mark UIPickerView Methods
- (NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView
return 2;
- (NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
NSIndexPath *selectedIndexPath=[self.EinheitenTableView indexPathForSelectedRow];
NSArray *units=[[EinheitenNameArray objectAtIndex:selectedIndexPath.row] objectForKey:@"Einheiten"];
if (component == 0)
return units.count;
return units.count;
- (NSString*) pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
NSIndexPath *selectedIndexPath=[self.EinheitenTableView indexPathForSelectedRow];
NSArray *units=[[EinheitenNameArray objectAtIndex:selectedIndexPath.row] objectForKey:@"Einheiten"];
return [units objectAtIndex:row];
@end
【问题讨论】:
仅使用xcode 标签来回答有关 IDE 本身的问题。谢谢! 【参考方案1】:如果我没记错的话,你正在寻找这样的东西。
要拥有它,您必须按如下方式实现 UIPickerView 方法
-(NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView
return 1;
-(NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
NSIndexPath *selectedIndexPath=[self.unitsTableView indexPathForSelectedRow];
NSArray *units=[[unitDataArray objectAtIndex:selectedIndexPath.section] objectForKey:@"units"];
return units.count;
-(NSString*) pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
NSIndexPath *selectedIndexPath=[self.unitsTableView indexPathForSelectedRow];
NSArray *units=[[unitDataArray objectAtIndex:selectedIndexPath.section] objectForKey:@"units"];
return [units objectAtIndex:row];
在 UITableView Delegate 中,您可以按如下方式重新加载选取器视图。
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
[self.unitPicker reloadAllComponents];
要为 具有组件和单元的表格创建项目,您可以使用 .plist 文件,如下所示
为了帮助您使用 UITableView 方法,我正在添加所需的代码。
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
unitDataArray=[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:<Name of plist File> ofType:@"plist"]];
[self.unitsTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES scrollPosition:UITableViewScrollPositionTop];
[self.unitsTableView.delegate tableView:self.unitsTableView didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
return unitDataArray.count;
-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
NSDictionary *unitData=[unitDataArray objectAtIndex:section];
return [[unitData objectForKey:@"units"] count];
-(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIdentifier=@"CellId";
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(cell==nil)
cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
cell.textLabel.text=[[[unitDataArray objectAtIndex:indexPath.section] objectForKey:@"units"] objectAtIndex:indexPath.row];
return cell;
-(NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
NSDictionary *unitData=[unitDataArray objectAtIndex:section];
return [unitData objectForKey:@"title"];
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
[self.unitPicker reloadAllComponents];
更改 如果您希望它如下所示,则需要对我的代码进行细微调整。
@implementation ViewController
@synthesize unitPicker,unitsTableView;
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
unitDataArray=[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"AllUnits" ofType:@"plist"]];
[self.unitsTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES scrollPosition:UITableViewScrollPositionTop];
[self.unitsTableView.delegate tableView:self.unitsTableView didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
#pragma mark UItableView Delegate
-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
return 1;//Changes 1
-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return unitDataArray.count;//Changes 2
-(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIdentifier=@"CellId";
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(cell==nil)
cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
cell.textLabel.text=[[unitDataArray objectAtIndex:indexPath.row] objectForKey:@"title"];
return cell;
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
[self.unitPicker reloadAllComponents];
#pragma mark UIPicker View Methods
-(NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView
return 1;//Changes 3
-(NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
NSIndexPath *selectedIndexPath=[self.unitsTableView indexPathForSelectedRow];
NSArray *units=[[unitDataArray objectAtIndex:selectedIndexPath.row] objectForKey:@"units"];//Changes 4
return units.count;
-(NSString*) pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
NSIndexPath *selectedIndexPath=[self.unitsTableView indexPathForSelectedRow];
NSArray *units=[[unitDataArray objectAtIndex:selectedIndexPath.row] objectForKey:@"units"];//Changes 5
return [units objectAtIndex:row];
@end
头文件也很简单。
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITableViewDataSource,UITableViewDelegate,UIPickerViewDataSource,UIPickerViewDelegate>
@property (weak,nonatomic) IBOutlet UIPickerView *unitPicker;
@property (weak,nonatomic) IBOutlet UITableView *unitsTableView;
@end
请找Demo project here
【讨论】:
非常感谢!您能否显示头文件,因为我在实施时遇到了一些麻烦。 @andyPaul 欢迎您,如果您还需要什么,请告诉我。有什么问题请追问。 感谢您的回答!我还有 3 个小问题: - 是否不需要在某处实现 unitDataArray(因为它不在 h 文件中)? - 你如何连接 xib 文件中的所有内容? - 是否也可以使用 Storyboard 创建所有内容,其中 UIPicker 和 UITableView 不在同一个视图中?你对我帮助很大,非常感谢,很抱歉成为一个绝对的初学者,我是 2 个月前开始的,对我来说这非常复杂! @andyPaul 欢迎您,绝对初学者先生,我现在在这封电子邮件中为您附加了一个演示项目,希望对您学习连接和其他内容有所帮助。 我还有一个小问题:我想要另一个ViewController
中的 UIPickerView。我必须使用prepareForSegue
-方法吗? @andyPaul以上是关于UIPickerView 依赖于 UITableView的主要内容,如果未能解决你的问题,请参考以下文章
iOS 7 用 UIPickerView 打开 UITableViewController 很慢
我怎么知道编辑开始于以 UIPickerView 作为输入的 UITextField ?