UIPickerView 依赖于 UITableView [英] UIPickerView depending on UITableView
问题描述
我没有太多编程经验,所以这是我的问题:
I don't have much experience in programming, so here is my question:
我正在尝试编写转换器应用程序.最后,您可以输入一个数字.然后我有一个两个组件 UIPickerView
.使用第一个组件,您选择输入格式(例如°Celcius).使用第二个组件,您选择输出格式(例如°华氏度),以便将摄氏度转换为华氏度.
I'm trying to write a converter app. At the end, you can enter a number. Then I have a two component UIPickerView
. With the first component, you select the input format (e.x. °Celcius). With the second component, you select the output format (e.x. °Fahrenheit), in order to convert °Celcius into °Fahrenheit.
但我想添加更多单位(重量、能量等).我希望它们显示在 UITableView
上.如果我在 UITableView
中选择某个单元格,UIPickerView
必须更新其委托.更准确地说,我有单位名称(例如 eV、Joule、cal、erg 等)的数组必须以某种方式在 detailViewController
(我有我的 UIPickerView
).
But I want to add more units (weight, energy etc.). I want them to display on a UITableView
. If I select a certain cell in the UITableView
, the UIPickerView
has to update its delegate. More precisely, the array in which I have the names of the units (e.x. eV, Joule, cal, erg, etc...) must be somehow implemented in the detailViewController
(where I have my UIPickerView
).
这是我的代码:
#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
推荐答案
如果我没猜错,您正在寻找这样的东西.
If I am not wrong you are looking for something like this.
要拥有它,您必须按如下方式实现 UIPickerView 方法
To have it so you must implement UIPickerView methods as follows
-(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 中,您可以按如下方式重新加载选择器视图.
In UITableView Delegate you can reload the picker View as follows.
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[self.unitPicker reloadAllComponents];
}
要为具有组件和单元的表格创建项目,您可以使用 .plist 文件,如下所示
To create the items for Table which has components as well units , you can use .plist file as follows
为了帮助您使用 UITableView 方法,我添加了所需的代码.
To help you with UITableView Methods I am adding the required code.
- (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];
}
变化如果您希望它显示如下所示,则需要对我的代码进行微调.
CHANGES If you want it to show as displayed below, minor tweaks to my code is required.
@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
请在此处找到演示项目
这篇关于UIPickerView 依赖于 UITableView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!