我正在为我的学校项目开发一个小型转换器应用程序,该应用程序不会在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] 删除。
我来说两句