2009-08-26 2 views
0

이것은 매우 초보자 용 질문이며 이전에 여러 번 해본 적이 있지만 이번에는 누락되었습니다. 내 AppDelegate.h 파일에서바인딩에 따라 테이블 뷰가 업데이트되지 않음

내가있는 NSArray를 선언하고 속성으로 설정하십시오 awakeFromNib 메소드에서 AppDelegate.m 파일에 다음

@interface AppDelegate : NSObject { 
NSArray *lines; 

} 

@property(readwrite, retain) NSArray *lines; 
@end 

그리고 나는 그것을 ALLOC :

lines = [[NSArray alloc] init]; 

다음 줄 배열을 설정하는 메서드가 있습니다 :

NSString *fileContents = [NSString stringWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/sometextfile.txt"] encoding:NSUTF8StringEncoding error:NULL]; 
lines = [fileContents componentsSeparatedByString:@"\n"]; 

나는 배열 컨트롤러가있다 에 AppDelegate.self.lines 다음 테이블 열 Array Controller.arrangedObjects 바운드 있습니다. 배열이 업데이트되고 있음을 확인할 수 있지만 (NSLog를 사용하여 테스트 한) 테이블의 내용은 업데이트되지 않습니다 (공백으로 남음).

여기에 분명한 사실이 있습니까?

+0

'오류 : NULL'을하지 마십시오. 그 성명서에서 잘못 될 수있는 많은 것들이 있습니다. 그리고 당신은 어떤 것이 일어 났는지 알기를 원치 않습니다. –

답변

4

바인딩을 사용하는 경우에는 필요하지 않습니다. 둘 중 하나.

I have an array controller thats bound to "AppDelegate.self.lines" …

self?

@property(readwrite, retain) NSArray *lines;

아니요, 여기에서 copy을 사용하십시오. 그렇지 않으면 다른 사람의 가변 배열을 보유하고 자신이 변이 할 것이라는 것을 알게 될 것입니다. 그런 다음 "당신의"배열은 당신이 알지 못하는 사이에 변경 될 것입니다.

Then I have a method that sets the lines array:

lines = [fileContents componentsSeparatedByString:@"\n"]; 

위의 이유 때문에 테이블에 아무 것도 표시되지 않습니다. 당신은 속성을 거치지 않고 인스턴스 변수에 직접 액세스하고 있습니다. 직접 인스턴스 변수 액세스는 KVO 알림을 발생시키지 않으므로 어레이 컨트롤러는 절대로 변경 사항에 대해 알지 못합니다.

더 나쁜 것은 이전 배열을 유출하지 않고 (단순히 놓아 두지 않고 배열을 지정하기 만하면되므로)이 새로운 배열을 유지하는 것입니다. 새 배열을 유지하지 않으므로 인스턴스 변수는 곧 죽은 객체를 보유하게됩니다. 자동 보유는 setLines: 메서드로 수행되며, 호출 할 때만 호출됩니다.

self.lines = [fileContents componentsSeparatedByString:@"\n"]; 

프로퍼티 액세스가 암시 적 접근 메시지, 그래서 (나는 위의 제안대로 @property를 수정하면, 그것을 또는 사본)이 모두 배열을 유지하고 :

당신은 속성을 통해 갈 필요가 KVO 알림을 게시합니다.

+0

고맙습니다 톤 피터, 완벽하게 작동 :) – indragie

2

열에 정렬 된 객체가 있다고 가정하면 tablview 데이터 소스를 설정한다는 의미입니까? 테이블 뷰 데이터 소스를 라인 배열로 설정하지 않으려면

+0

그래, 나는 콘텐트 배열이 AppDelegate.self.lines로 설정된 어레이 컨트롤러를 가지고있다. 그런 다음 배열 컨트롤러의 arrangedObjects를 테이블 열에 바인딩합니다. t에 대한 dataSource를 설정하지 않았습니까? – indragie

+0

ennuikiller : 바인딩은 데이터 원본 대신 사용할 수 있습니다. –

0

read through this이 좋을 것입니다. 다이어그램과 설명이 좋습니다. 엔비 퀼러가 말하는 것은 정확합니다. 데이터 소스에 문제가 있다고 생각합니다. 이 작업은

[aTable setDelegate:aDelegate]; 
+0

데이터 소스/위임을 주 앱 대리인과 배열 컨트롤러에 설정하려고했으나 둘 다 작동하지 않았습니다. – indragie

관련 문제