2014-05-01 2 views
0

prepareForSegue 메서드를 통해 데이터를 전달할 수 있다고 말하지만, 내가하는 방식이 최적이 아니며 항상 코딩 기술을 향상 시키려고합니다. 이것이 올바른 방법인지 확인하고 있습니까? 그것은 작동하지만 '근본적으로'틀릴 수도 있습니다.연속 된 NSArray

은 내가 PLIST 내가이 작품 때문에

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
if ([segue.identifier isEqualToString:@"detailAll"]) { 
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
    DetailTableViewController *destViewController = segue.destinationViewController; 
    destViewController.title = [self.namesArray objectAtIndex:indexPath.row]; 
    destViewController.nameLabel = [self.namesArray objectAtIndex:indexPath.row]; 
    destViewController.legislationLabel = [self.legislationArray objectAtIndex:indexPath.row]; 
} 
} 

로 SEGUE 방법에 대한 준비를 통해 값을 전달하고 jQuery과

// Find out the path of recipes.plist 
NSString *path = [[NSBundle mainBundle] pathForResource:@"law" ofType:@"plist"]; 

// Load the file content and read the data into arrays 
self.dataArray = [NSArray arrayWithContentsOfFile:path]; 

//Sort the array by section 
self.sortedArray = [self.dataArray sortedArrayUsingDescriptors:@[ 
       [NSSortDescriptor sortDescriptorWithKey:@"Section" ascending:YES], 
       [NSSortDescriptor sortDescriptorWithKey:@"Title" ascending:YES]]]; 

//Title 
self.namesArray = [self.sortedArray valueForKeyPath:@"Title"]; 

self.sectionArray = [self.dataArray valueForKeyPath:@"Section"]; 

//Legislation 
self.legislationArray = [self.sortedArray valueForKeyPath:@"Legislation"]; 

을 채우는 있습니다. 그러나 이것을 수행하는 더 깨끗한 방법이 있습니까? 값이 다른 배열로 전달 된 다음 상세보기로 채워집니다. UItableview

+0

이것은 적절하고 깨끗합니다. 왜 그것이 잘못되었다고 생각 하는가? –

+0

알아두면 좋겠지 만, 값이 별도로 전달되는 대신 함께 전달 될 수 있다고 생각했습니다. 어쩌면 NSobject에서. – memyselfandmyiphone

+0

괜찮은 것 같습니다. 그러나 세부 값 VC가 해당 값을 편집 할 책임이있는 경우 속성에'copy' 속성이 필요하므로 나중에 취소 된 변경 사항은 원래 값에 영향을 미치지 않습니다. – Droppy

답변

1

특정 모델 객체를 사용하지 않으므로 현재 코드가 정상입니다.

그러나 더 강력한 작업 방법은 각 셀에서 나타내는 모델 개체를 나타내는 개체를 정의하는 것입니다. 여기에는 이름, 섹션 및 법규를 나타내는 속성이 있습니다. 테이블 뷰는 객체를 기반으로 각 셀을 구성하고 데이터 소스는 각 속성에 대해 여러 개의 배열 대신 단일 배열을 유지합니다.

세부보기 컨트롤러로 푸시하면이 모델 개체를 전달할 수 있습니다. 당신이 당신의 모델 객체에 다른 속성을 추가 한 경우, 당신은 당신의 세부 사항에 또 다른 배열과 재산을 추가 할 필요가 없습니다 것 (

  • 적은 코드
  • 더 확장 :

    이 방법은 몇 가지 장점이 있습니다 선명

만들기 모델 객체를 이해하는 뷰 컨트롤러) 특히 지금 특성의 자동 완성있어, 매우 간단합니다. 그냥 NSObject의 서브 클래스를 만들고, 헤더에 속성을 선언 : 모든 작업이 완료

@property(nonatomic,copy) NSString *title; 
@property(nonatomic,copy) NSString *name; 
@property(nonatomic,copy) NSString *legislation; 

합니다. 컴파일러는 이러한 속성을 자동으로 종합합니다.

+0

그게 내 생각 이었어. 이것에 대한 좋은 자료가 있습니까? 배열을 저장하는 NSobject를 검색해야합니까? – memyselfandmyiphone

+0

"재질"이 필요하지 않습니다. NSObject 서브 클래스를 만드십시오. 대답에 예제를 추가하겠습니다. – jrturton

1

나는 이것을 위해 라이브러리를 만들었습니다. https://github.com/stefanomondino/SMQuickSegue

은 기본적으로 당신이 (중 prepareForSegue 잊고, SEGUE을 수행)는 선택기 대응에 응답하면 대상 뷰 컨트롤러에 설정됩니다 특성/값의 사전 (그것이 그렇지 않으면 잘못된 매개 변수를 생략합니다)를 통해 전달합니다.