2009-07-31 2 views
1

다음과 같은 디자인의 응용 프로그램이 있습니다. 문서를 나열하는 표보기. 그리고 문서를 편집하는 ViewController.개체의 복사본을 원래 참조로 다시 할당하는 방법은 무엇입니까?

문서를 편집 할 때 객체 사본을 사용하려는 경우 사용자가 취소를 누르면 사본을 버립니다. 사용자가 저장을 선택하면 수정 된 문서를 원본으로 복사합니다. (너무 많기 때문에 모든 문서의 필드를 viewController의 속성으로 가질 수는 없습니다.)

테이블 뷰 컨트롤러 :

@interface 
@property (nonatomic,retain) Document *asignedDocument; 
@property (nonatomic,retain) Document *editedDocument; 

viewDidLoad{ 
    editedDocument= [assignedDocuemnt copy]; 
} 


IBAction save { 
    assignedDocument=editedDocument; 
} 

내 문제가 documentsArray에서 원본 문서 편집 된 버전으로 업데이트되지 않는 것입니다 :

SelectedRowAtIndex { 
    document= [documentsArray objectAtIndex:indexPath.row]; 
    viewController.assignedDocuemnt= document; 
} 

은 그 때 나는 항목이 수정보기 컨트롤러 클래스가 있습니다. 내가 무엇을 놓쳤는가?

답변

2

값을 복사 한 다음 복사본의 참조를 참조을 원본으로 다시 지정합니다. 그것은 확실히 작동하지 않을 것입니다.

먼저 테이블보기의 viewcontroller에서 추가 할 문서를 추적하십시오.

그런 다음 테이블 뷰의의 ViewController에 서로 선택한 문서를 대체에 대한 처리기를 추가

- (void)replaceSelectedDocument:(Document*)newDoc { 
    [documents replaceObjectAtIndex: editingIndex 
         withObject: newDoc]; 
} 

저장, 같은과 편집기 뷰 컨트롤러에서 테이블 뷰 컨트롤러의 새로운 메시지를 호출하려면 :

[tableViewController replaceSelectedDocument: editedDocument]; 

이렇게하는 더 좋은 방법은 명시 적으로 테이블 뷰 컨트롤러를 다시 호출하는 대신 대상 및 동작을 취하도록 편집기보기 컨트롤러를 수정하는 것입니다. 저장할 때, 작업 전화 :

[target performSelector: action withObject: editedDocument]; 

을하지만 당신은 아마 오늘을 극복 할 필요가 없습니다 학습 곡선의 다른 범프이다.

+0

답변 해 주셔서 감사합니다. 마지막 부분 인 "더 나은 방법"에 대해 자세히 설명해 주시겠습니까? 나는 문서 배열을 별도의 Data 클래스에 singleton으로 잡고있다. – Rod

+0

난 그냥 테이블보기 컨트롤러에 보낼 메시지를 하드 코딩 비해 더 의미. 'replaceSelectedDocument'를 보내면, 그 객체들을 영원히 결합 할 수 있습니다. 대신에'target : self action : @selector (replaceSelectedDocument :)'를 넘기면 융통성을 잃지 않게됩니다 : 에디터는 테이블 뷰 컨트롤러에 의해 실제로 호출 된 것을 신경 쓰지 않고 단지 보내야한다는 것을 알고 있습니다 완료 될 때 지정된 대상에 지정된 메시지. –

관련 문제