2012-11-25 2 views
2

끌어서 놓은 파일 (NSURL)을 허용하는보기 기반 NSTableView가있는 샌드 박스 ARC 응용 프로그램을 작성하고 있습니다. 나는 테이블 뷰에 하나 개의 파일을 드래그 할 수 있습니다makeViewWithIdentifier를 호출합니다. owner : ARC가 ivar을 다시 만듭니다.

- (NSView *)tableView:(NSTableView *)tv 
    viewForTableColumn:(NSTableColumn *)tc 
        row:(NSInteger)row 
{ 
    // `files' is an NSMutableArray* ivar containing NSURLs 
    // that have been dropped into this table 
    NSURL *url = [files objectAtIndex:row]; 
    NSString *fileName = [url lastPathComponent]; 
    NSImage *icon = [self iconForURL:url]; 

    NSTableCellView *view = [tv makeViewWithIdentifier:[tc identifier] owner:self]; 
    [[view textField] setStringValue:fileName]; 
    [[view imageView] setImage:icon]; 

    return view; 
} 

하고 올바르게 표시 나는 다음 NSTableViewDelegate 방법에 몇 가지 중요한 기묘에 달렸다. 내가 두 번째 파일을 드래그 할 때, 나는이 오류 얻을 : - 실제로 새 개체 인스턴스가된다 - makeViewWithIdentifier:owner: 호출 후

*** Canceling drag because exception 'NSRangeException' (reason '*** -[__NSArrayM insertObject:atIndex:]: index 1 beyond bounds for empty array') was raised during a dragging session

디버거를 통해 스테핑을, 나는 files는 "빈 될"것을 발견했다. 나는 이것이 내가 이해할 수없는 ARC의 일부분이라고 가정한다. 그러나 그 물체는 자신의 ivar (기본적으로)에 대한 강한 참조를 가지고있다. 어떻게 내게 공개되어 다시 만들어 지나요? (향후 릴리스에 강한 참조를 보관합니다 바라고)

  1. 테이블 셀 뷰의 소유자로 바르를 통과;

    나는이 문제를 해결하기 위해 두 해킹 때우기 또는

  2. ivar의 개체를 가리키고 ivar을 이전 개체에 다시 할당하는 로컬 변수를 만듭니다 (그 동안 대체 배열을 생성하므로 분명히 낭비입니다).

무엇이 여기에 있습니까? 이러한 대안은 필요하지 않습니다.

답변

2

호출 : -makeViewWithIdentifier : owner : 소유자에게 -awakeFromNib 메시지가 전송됩니다. 이것은 문서화되어 있지만 헤더 파일에만 있습니다 (EDIT : 주 문서가이 파일을 참조하도록 업데이트되었습니다).

파일 배열이 단순히 -awakeFromNib에서 다시 초기화되는 것으로 상상합니다.

주어진 경우 (nib가 아닌보기 프로토 타입을로드하는)의 솔루션은 단순히 nil을 소유자로 전달하는 것입니다. 등록 된 펜촉을로드하는 다른 구현 (-registerNib : forIdentifier :)에는 대개 대리인이 될 수도있는 소유자가 필요할 수도 있습니다. 따라서 -awakeFromNib에 대한 여러 번 호출을 감지하고 트랩해야 할 수 있습니다. nib 로딩을 플래그하는 속성을 설정하고 필요한 초기화를 한 번만 수행하는 것은 간단합니다. 이 방법에 대한 애플의 문서는이를 반영하도록 업데이트되었습니다

참고 :

Note that awakeFromNib is called each time this method is called, which means that awakeFromNib is also called on owner, even though the owner is already awake.

+0

이 문제를 방지하는 방법에 대한 표준 패턴이 있습니까 - 다른 곳에서 인스턴스 변수를 초기화하는가? – Richard

+0

위의 업데이트 된 솔루션을 참조하십시오. '-awakeFromNib'의 ivar 초기화가 표준입니다. 소유자를 올바르게 처리하면 모든 것이 잘됩니다. –

관련 문제