2014-01-14 2 views
0

나는 학교 프로젝트를위한 작은 컨버터 애플 리케이션, 애플 리케이션 스토어에 게시되지 않습니다 학교 학년을위한 애플 리케이션에 최선을 다하고 있습니다. 이 개발자가 어떻게 된 것인지 아는 사람이 있는지 궁금합니다. this app객관적인 C 변환기 애플

값을 변환하는 연결을 만들었습니까? 내가 상상할 수있는 가장 간단한 방법은 스위치의 경우 함께하지만 너무 많은 불필요한 코드를 만들 것입니다 : 응답에 대한

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 

등 ....

감사합니다. 빠른 답변

감사합니다, 이것은 내가 지금까지 아이폰 OS 시뮬레이터 이초가 첫 번째의 행에 따라 표시되는 올바르게 세 개의 열 선택기를 표시하고 만든 것입니다 : 편집

. 이게 다 좋다고 나에게 말할 수 있니? 복잡한 일이 아닌가?

#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

처음에는 깨닫지 만, 다중 분기 if-else-if는 특히 첫 번째 세그먼트가 더 많아 질수록 조금 어색합니다. – danh

+0

고마워,하지만 내 주요 문제는 어떻게 변환 결과에 대한 데이터를 계산하는 데 사용할 수식을 알 수 있습니다. 어떻게 든 나는 어느 행이 1인지 알 필요가있다. 2. 계산을 위해 올바른 수식을 선택할 수 있도록 2.와 3. 열. 어쩌면 그렇게 할 생각이 있습니까? 예를 들어, 1. 행이 거리, 2.km와 3. 메트로 인 경우 올바른 결과를 얻으려면 첫 번째 값에 1000을 곱해야합니다. 어떤 작업을 사용할지 결정하는 가장 쉬운 방법은 무엇입니까? – user3194296

+0

. 나는 내 대답을 고쳤다. – danh

답변

2

상단에서 피커 섹션을 초기화하는 방법에 대해 의아해하고있는 것처럼 들립니다. 배열 배열 인 데이터 구조가 필요하다고 생각합니다.

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

피커에게 세 개의 세그먼트가 있음을 알리십시오. 첫 번째 세그먼트는 각 하위 배열의 첫 번째 요소로 제조 할 수 있습니다 (원하는 경우 캐시 할 수 있음). 두 번째 두 세그먼트는 첫 번째 섹션의 값으로 인덱싱 된 데이터 구조에서 값을 가져옵니다.

EDIT; 변환을 계산하는 데 도움이되는 데이터 구조가 필요할 것입니다. 각 종류의 측정에 대해 N이 바퀴의 단위 수인 NxN 표를 상상해보십시오. 행을 사용하면 왼쪽 휠 설정을 살펴보고 오른쪽 열을 사용하면 오른쪽 휠을 찾을 수 있습니다. 표에는 계산을 수행하는 데 필요한 것이 포함되어 있어야합니다. 모든 측정 값이 인치 - 미터와 같이 선형 적으로 관련되어 있으면 표에 단순히 floats (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]; 

그것은 재미있는 프로젝트처럼 들린다. 행운을 빕니다!

+0

대단히 감사합니다. 또한 아마도 당신은 내 엉망진창에서 주요 질문을 이해하지 못했습니다. 2. 그리고 3. 열의 값에 따라 사용할 연산을 어떻게 알 수 있습니까? 영어가 제 최고의 언어가 아니기 때문에 설명하기가 어렵습니다. 하지만 아마도 어딘가에 IF 루프가 있어야합니다. 2. 어디에서 테스트했는지 2, 3 열 중에서 선택해야합니다. 디스플레이에 미터 또는 킬로미터 또는 야드 등을 써야합니다. – user3194296

+0

예. 나는 (1) 피커 휠의 위치를 ​​아는 법을 설명하고 (2) 2 차원 배열로 훑어 보는 방법을 설명하기 위해 다시 편집했다. – danh

+0

대단히 감사합니다. 나는 이런 식으로하려고 노력할 것이다. 심지어 tho 나는 선택기에서 2와 3. 칼럼에서 선택된 행을 읽는 방법이 불분명하다. 이 데이터는 첫 번째 열의 값을 기준으로 연결됩니다. – user3194296