2014-12-02 2 views
0

응용 프로그램을 개발할 때 사전 형식의 값을 포함하고 있으며 그 값을 배열로 가져 오는 중입니다. 참고 : _detailedarray는 가변 배열입니다.iOS : 요소 배열을 단일 문자열에서 다른 배열로 추가

[_detailedarray addObject:[NSDictionary dictionaryWithObjectsAndKeys:_firstname ,  
    @"first_name" , _lastname , @"last_name" ,_phoneNumber,@"phone_Number" ,nil]]; 
    NSArray *ar=[[NSArray alloc]init]; 
    self.filtereditems=[NSMutableArray arrayWithCapacity:[_detailedarray count]]; 

    NSLog(@"array is,%@",ar); 
    CFRelease(phoneNumbers); 

} 
    [self.nametxt addTarget:self.autoCompleter action:@selector(textFieldValueChanged:) forControlEvents:UIControlEventEditingChanged]; 

_firstnamestring=[_detailedarray valueForKey:@"first_name"]; 

//_firstnamestring is a string and same _lastnamestring and _phnostring/// 

_lastnamestring=[_detailedarray valueForKey:@"last_name"]; 
_phonenostring=[_detailedarray valueForKey:@"phone_Number"]; 
_totalarray = [[NSMutableArray alloc] initWithObjects:_firstnamestring, 
_lastnamestring, _phonenostring, nil]; 

각 문자열은 6 개 값을 포함하고 내 문제가 코드 샘플을 보면

_ firstnamestring contains 6 values and _phonenostring cointains 6 values and 
_lastnamestring contains 6 values how to append the first name,last name and phone 
    no strings at every object at index and keep in single array. 
+0

클래스와 6 개의 값을 보유 할 배열을 갖는 것이 더 좋습니다. 귀하의 검색 정렬 등 인덱스를 잃어버린없이 일을 찾을 일이 될 것입니다. –

+0

@AnoopVaidya 그는 이미 각 엔트리에 대해 하나의 배열을 가지고 있습니다. (그 객체는 커스텀 객체보다는 사전이되었지만 엄청난 문제는 아닙니다.) 그것이'_detailedArray'입니다. 나에게 잘못 이해하지 말아라. 커스텀 객체가 더 의미가 있다고 생각한다.하지만 그의 질문이 "어떻게 하나의 배열을 얻는가"였다면 "당신은 이미 _detailedArray"라고 불렀다. " 나는이 질문을 얻지 못한다. – Rob

+0

@Rob : 질문을 올바르게 읽으면, 그는 'firstName' 등을 seggregate하고 싶습니다. 그러면 KVC ...'valueForKey : '에 의해 그들을 얻는 것이 쉬울 것이고, 매번 같은 순서로 얻을 것이고 그는 그것을 그의 배열 (들)에 저장할 수 있습니다. 이것에 대한 당신의 견해? –

답변

0

을 의미 하나 개의 배열에 그 배열에서 요소를 추가하는 방법을 당신이라는 배열을 가지고있는 것처럼, 그것은 본다 _detailedArrayfirst_name, last_namephone_Number의 세 키를 포함하는 사전의 배열입니다. 사전 배열에서 특정 키를 사용하여 valueForKey을 호출하면 해당 키의 값 배열을 얻습니다. 흥미 롭지 만 여기서는별로 유용하지 않습니다. 당신이 정말로 "첫째 마지막 전화"문자열의 배열을해야하는 경우

  1. , 당신이 직접 그를 구축해야합니다 :

    NSMutableArray *contactStrings = [NSMutableArray array]; 
    for (NSDictionary *contact in _detailedArray) { 
        [contactStrings addObject:[self stringForContact:contact]]; 
    } 
    

    내가 제안 할 수있는 방법 중 몇 가지가 있습니다 다음과 같이 stringForContact 정의 할 수 있습니다

    - (NSString *)stringForContact:(NSDictionary *)contact 
    { 
        return [NSString stringWithFormat:@"%@ %@ %@", contact[@"first_name"], contact[@"last_name"], contact[@"phone_Number"]]; 
    } 
    

    를 분명히, 당신은 생을 확장 것 모든 종류의 시나리오 (예 : 이름 없음, 성 등). 그러나 그것은 일반적인 생각을 설명합니다.

  2. 나는 위의 문자열 배열 구축 방법에 대해 신경 쓰지 않아야한다고 고백해야합니다. 첫째, 아무런 이점도 두 배의 메모리를 차지합니다 (예 : 한 번에 20 개의 연락처 만 표시 할 수 있지만 불필요하게 수천 개의 연락처에 대해이 전체 배열을 구축했을 수 있음).

    또한 이제 동기화해야하는 두 개의 배열 인 contactStrings_detailedArray이 있습니다. 예를 들어 미래 날짜에 정렬 기능을 추가하고 성으로 _detailedArray을 정렬하는 경우 contactStrings 배열을 다시 작성해야합니다 (그리고 contactStrings은 분명히 정렬 할 수 없습니다. 그 이유는 무엇에 관한 의미있는 데이터가 없기 때문입니다.) 문자열의 부분은 이름이고 성 부분은 몇 부분입니까?)

    저는 개인적으로 _detailedArray만을 사용하는 것을 선호합니다. 그리고 나서, 컨택트의 스트링 표현의 프리젠 테이션은 중복 모델 구조가 아닌 프리젠 테이션 이슈가됩니다. 단지 _detailedArray 자체를 사용 _detailedArray의 대부분 중복이다 문자열의 또 다른 배열을 구축하는 것보다 그래서 오히려

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
        static NSString *cellIdentifier = @"Cell"; 
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    
        NSDictionary *contact = _detailedArray[indexPath.row]; 
        cell.textLabel.text = [self stringForContact:contact]; 
    
        return cell; 
    } 
    

    :

    예를 들어, 테이블보기에서 _detailedArray 연락처를 보여주는 경우 cellForRowAtIndexPath처럼 보일 수 있습니다.

더 좋은 Anoop Vaidya이 제안, 나는 사용자 정의 Contact 클래스를 설계 조언 및 사용자 정의 객체의 배열과 사전의 배열을 바꿀 수 있습니다.그리고 나서 stringForContact 메소드를이 모델 Contact 클래스의 인스턴스 메소드로 만들 수 있습니다.이 메소드는보기 콘트롤러에서 바로 코딩합니다.

잘하면 모델은 기본 데이터의 구조를 캡처해야하며, 문자열의 중복 배열을 만드는 대신 필요한 경우 호출하는 별도의 메서드로 해당 개체의 문자열 표현을 만들 수 있습니다.