2012-12-29 5 views
-1

싱글 톤 클래스를 사용하여 NSMutableArray를 뷰로 전송합니다.NSMutableArray에서 요소의 중복 된 출력 방지

문제점은 배열이 여러 번 표시된다는 것입니다.

지금은 세 개의 UITextField로 작업하고 있습니다. 각각은 배열에 추가되고 특정 형식으로 출력됩니다.

A/B

C

A/B

C

A/B

C

모든 I : 여기 내 출력처럼 보이는 것입니다 필요 표시 :

01 23,516,

A/B

C

다음

누군가가 나 누락 또는 재 작업 할 필요가 있는지 찾을 수 있다면 내 코드는 다음과 같습니다

UILabel * myLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 300, 200)]; 
    [myLabel setFont:[UIFont fontWithName:@"Helvetica" size:10.0]]; 
    myLabel.numberOfLines = 0; 

    NSMutableString * string = [NSMutableString string]; 

    Education * myEducation = [Education sharedEducation]; 

    for (Education * output in myEducation.educationOutputArray) 
    { 
     [string appendString:[NSString stringWithFormat:@"%@/%@ \n%@\n", [myEducation.educationOutputArray objectAtIndex:0], [myEducation.educationOutputArray objectAtIndex:1], [myEducation.educationOutputArray objectAtIndex:2], nil]]; 

    } 

    myLabel.text = string; 

    [self.view addSubview:myLabel]; 

:

텍스트를 표시하려면 텍스트를 저장하는 곳입니다 :

-(void)saveButtonTapped:(id)sender 
{ 
    [_educationArray addObject:_aTextField.text]; 
    [_educationArray addObject:_bTextField.text]; 
    [_educationArray addObject:_cTextField.text]; 

    Education * myEducation = [Education sharedEducation]; 
    myEducation.educationOutputArray = _educationArray; 

    [self.navigationController popViewControllerAnimated:YES]; 
} 

EDIT *

사용자가 텍스트 필드에 텍스트를 입력 할 때 동일한 세 개의 텍스트 필드를 사용하여 새로운 텍스트 세트를 추가 할 수도 있습니다.

for 루프를 제거한 경우 처음 만 표시됩니다. 모든 텍스트를 표시하려면 어떻게합니까? 이 오류에

[string appendString:[NSString stringWithFormat:@"%@/%@ \n%@\n", [output major], [output university], [output timeAtSchool]]]; 

결과 : 당신은 배열의 중복이없는

2012-12-29 17:03:07.928 EasyTable[14501:c07] -[__NSCFString major]: unrecognized selector sent to instance 0x7176850 
2012-12-29 17:03:07.941 EasyTable[14501:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString major]: unrecognized selector sent to instance 0x7176850' 
*** First throw call stack: 
(0x1c99012 0x10d6e7e 0x1d244bd 0x1c88bbc 0x1c8894e 0x6162 0xff817 0xff882 0xffb2a 0x116ef5 0x116fdb 0x117286 0x117381 0x117eab 0x1184a3 0x118098 0x2c10 0x10ea705 0x21920 0x218b8 0xe2671 0xe2bcf 0xe1d38 0x2e5213 0x1c61afe 0x1c61a3d 0x1c3f7c2 0x1c3ef44 0x1c3ee1b 0x1bf37e3 0x1bf3668 0x1e65c 0x240d 0x2335 0x1) 
libc++abi.dylib: terminate called throwing an exception 
+0

배열에 개체를 추가하는 방법과 관련이 있습니다. 코드를 추가 할 수 있습니까? – wattson12

+0

가능한 경우 앱의 스크린 샷이 도움이 될 수 있습니다. 자신이 너무 어렵게 만들 수도 있습니다. –

답변

0

한 번에 3 개의 요소를 배열에 추가 한 다음 나중에 한 번에 3 개씩 처리하려고합니다.

세 요소를 보유하는 컨테이너 클래스를 만들고 배열에 컨테이너 클래스의 인스턴스를 추가하는 것이 좋습니다.

그러나 실제로이 방법으로 작업하려는 경우 for/in 루프를 사용할 수 없습니다.

NSArray *array = myEducation.educationOutputArray; 
for (NSUInteger i = 0, count = array.count; i < count; i += 3) { 
    [string appendFormat:@"%@/%@\n%@\n", array[i], array[i+1], array[i+2]]; 
} 
0

: *

편집 두 내가이 시도 문제에 대한에 루프

for (Education * output in myEducation.educationOutputArray) 
{ 
    [string appendString:[NSString stringWithFormat:@"%@/%@ \n%@\n", [myEducation.educationOutputArray objectAtIndex:0], [myEducation.educationOutputArray objectAtIndex:1], [myEducation.educationOutputArray objectAtIndex:2], nil]]; 

} 

여기서 배열을 3 번 반복하고 (배열에 3 개의 객체가 있기 때문에) 매번 각 객체를 인쇄합니다. 나는 당신이 단지 appendString을해야한다고 생각한다 : for 루프를위한 루프 wihtout

+0

그 문제는 사용자가 여러 필드를 추가 할 수 있도록 허용하고 있다는 것입니다. 그래서 내가 할 경우에만 첫 번째가 표시됩니다 –

0

for 루프는 정말로 이상하다; 배열의 각 객체를 반복하지만 for 루프 내에서 색인을 하드 코드합니다. 나는 그곳에서 무슨 일이 일어나고 있는지 확신하지 못한다. 그러나 그것은 확실히 이상한 결과물의 원천이다. Education 개체에 대한 포인터는 사용자가 액세스해야하는 개체입니다. 루프를 통과 할 때마다 output 값을 사용하십시오.

독창성 문제가있는 경우 NSMutableArray 대신 NSSet을 사용하는 것이 좋습니다. 주문에 신경 쓰면 NSOrderedSet을 사용하십시오. 세트 콜렉션 유형은 중복 값을 허용하지 않습니다.

또 하나의 요점 : 색인 0, 1 및 2의 값만 액세스 할 것이라는 것을 알고 있다면 NSArray을 갖는 것이 중요하지 않습니다. 각 값을 별도로 저장하고 직접 액세스하십시오. 최소한 for 루프를 사용할 이유는 없습니다.

편집 :

당신이 당신의 배열 그것에 Education 객체를 가지고 있다고 생각하지만, 정말 일반 문자열이 있기 때문에 당신이 충돌하고 있습니다 : 당신이 메소드를 호출하려고 것을 말하는 것을

-[__NSCFString major]: unrecognized selector sent to instance 0x7176850

공지 사항을 major__NSCFString (사과가 내부적으로 사용하는 NSString의 개인 하위 클래스). 이는 배열에 생각하는 바가 포함되어 있지 않음을 나타내는 좋은 지표입니다. 세 개의 데이터로 Education 개체를 구성하여 배열에 데이터를 올바르게로드했는지 확인하십시오.

당신은 또한 당신이 기본적으로 무엇을 stringWithFormat:가하는 그 형식 문자열을 가지고 템플릿처럼 사용하고 템플릿의 자리를 채우기 위해 필요에 따라 그때는 많은 인수를

[string appendString:[NSString stringWithFormat:@"%@/%@ \n%@\n", output]];

을 시도한다고 제안 . %@은 개체의 설명을위한 자리 표시 자이므로 stringWithFormat:은 형식 문자열 다음에 세 개의 매개 변수가 각각 %@을 채울 것으로 예상됩니다.

+0

그는 동일한 물건을 추가, 그는 나던 우발 우연한 우물을 가지고 있지 않다 –

+0

나는 그것이 아래로 투표하지만 괜찮아요 생각하지 않습니다. 내 대답은 루프 문제에 대한 중복 _and_ 커버. –

+0

내가 ~했을 때 for 루프를 커버하지 않았다;) + 당신은 나머지를 다시 reformulated .. -1 다시했다;) –