我正在为我的学校项目开发一个小型转换器应用程序,这个应用程序不会在App Store中发布,只是为了学校成绩。我想知道是否有人知道this app
中的这位开发人员是怎么做的建立了转换价值的连接?我能想象的最简单的方法是使用switch case,但这会产生太多不必要的代码:
if (first column is distance) then if(second column is metres)
case0:third column is yards -> do something
case1:third column is kilometers ->do something
case2:third column is metros ->do nothing
等...
感谢您的回答。
编辑:
感谢快速回答,这是我到目前为止所做的,iOS模拟器正确显示三列选择器,其中第二列显示取决于第一列的行。你能告诉我这有什么好处吗?也许有些事情是不必要的复杂的?
#import "konverterViewController.h"
@interface konverterViewController ()
@end
@implementation konverterViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.fizVelicine = [[NSArray alloc] initWithObjects:@"distance",@"mass" , nil];
self.udaljenostJedinice = [[NSArray alloc] initWithObjects:@"meter", @"kilometer", @"yard", @"inch", nil];
self.masaJedinice = [[NSArray alloc] initWithObjects:@"kilogram",@"dekagram",@"gram",@"tone" , nil];
}
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
UILabel *retval = (id)view;
if (!retval) {
retval = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f,
[pickerView rowSizeForComponent:component].width,
[pickerView rowSizeForComponent:component].height)];
}
retval.opaque = NO;
retval.backgroundColor = [UIColor orangeColor];
retval.adjustsFontSizeToFitWidth = YES;
retval.font = [UIFont systemFontOfSize:12];
if (component == 0) {
retval.textAlignment = NSTextAlignmentCenter;
retval.text = [self.fizVelicine objectAtIndex:row];
}
else if ([self.odabir isEqualToString:@"distance"]){
retval.textAlignment = NSTextAlignmentCenter;
retval.text = [self.udaljenostJedinice objectAtIndex:row];
}
else {
retval.textAlignment = NSTextAlignmentCenter;
retval.text = [self.masaJedinice objectAtIndex:row];
}
return retval;
}
// returns the number of 'columns' to display.
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 3;
}
// returns the # of rows in each component..
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent: (NSInteger)component
{
if(component== 0)
{
return [self.fizVelicine count];
}
else
{
if([self.odabir isEqualToString:@"distance"]){ return [self.udaljenostJedinice count];}
else {return [self.masaJedinice count];}
}
}
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
if(component == 0)
{
return [self.fizVelicine objectAtIndex:row];
}
else {
if([self.odabir isEqualToString:@"distance]){
return [self.udaljenostJedinice objectAtIndex:row];}
else {
return [self.masaJedinice objectAtIndex:row];
}
}
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
if (component == 0) {
self.odabir=[[NSString alloc] initWithFormat:@"%@" , [self.fizVelicine objectAtIndex:row]];
[pickerView reloadAllComponents];}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
答案 0 :(得分:2)
听起来你对如何在顶部初始化选取器部分感到困惑。我想你需要一个数组结构数组:
@[@"distance", @[@"meters", @"inches", @"cubits", @"whatevers"],
@"weight", @[@"grams", // etc
告诉选择器您有三个段。第一个段可以作为每个子阵列的第一个元素制造(并缓存,如果需要)。后两个段从数据结构中获取它们的值,由第一部分的值索引。
EDIT;您可能需要一种可帮助您计算转换的数据结构。对于每种测量,想象一下NxN表,其中N是车轮上的单位数。一行让你查看左轮设置,列让你查看右轮。该表应包含进行计算所需的内容。如果所有度量线性相关,如英寸 - 米,则表格可以简单地包含浮点数(包裹为NSNumber)转换因子。
// conversion factors for distance, units as the first value, conversion factors in a subarray
// meters = 1*meters, 39.37*inches, 2.19*cubits, etc
NSArray *conversions =
@[@"meters", @[@1.0, @39.37, @2.19, //etc
@"inches", // etc. conversions to meters inches cubits etc.
你可能会注意到这个数组包含一些浪费。只需要一半的桌子,因为英寸 - >米只是米 - 英寸的倒数),但我认为这个空间足够小,不用担心这个问题。您可能还注意到该表仅适用于单元之间的简单线性关系。摄氏至华氏温度需要不同的治疗方法。对于任意转换的最一般处理可能是执行计算的块数组。但我建议更简单地开始。
再次编辑:
现在,要获取转换公式,请获取当前选择器选项并查找转换因子:
NSInteger fromUnitsIndex = [self.picker selectedRowInComponent:1];
NSArray *fromArray = self.conversions[fromUnitsIndex];
// the second member of this array is an array of conversion factors
NSArray *conversionNumbers = fromArray[1];
NSInteger toUnitsIndex = [self.picker selectedRowInComponent:2];
NSNumber *conversionNumber = conversionNumbers[toUnitsIndex];
这听起来像一个有趣的项目。祝你好运!