Objective c转换器应用程序

时间:2014-01-14 14:57:46

标签: ios iphone converter

我正在为我的学校项目开发一个小型转换器应用程序,这个应用程序不会在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

1 个答案:

答案 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];

这听起来像一个有趣的项目。祝你好运!