Objective C Converter应用

用户名

我正在为我的学校项目开发一个小型转换器应用程序,该应用程序不会在App Store中发布,仅适用于学校年级。我想知道是否有人知道这个应用程序中的开发人员如何

建立转换值的连接?我能想到的最简单的方法是使用开关盒,但这会产生过多不必要的代码:

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
姓名

听起来您似乎在困惑如何初始化顶部的选择器部分。我认为您需要一个由数组组成的数据结构:

@[@"distance", @[@"meters", @"inches", @"cubits", @"whatevers"],
  @"weight",   @[@"grams", // etc

告诉选择器您有三个细分。可以将第一个段作为每个子数组的第一个元素制造(并缓存)。后两个段从数据结构中获取其值,并由第一部分的值索引。

编辑; 您可能需要一个可帮助您计算转化的数据结构。对于每种度量,请想象一个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];

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章