2011-08-09 6 views
0

죄송합니다. 조금 길지만 가능한 한 설명이 잘되고 싶습니다. 여러 클래스와 2 개의 nib 파일로 테스트 응용 프로그램을 만들고 있습니다 (각 클래스는 하나의 펜촉의 소유자입니다). nib 파일 중 하나에는 텍스트 필드가 있고 다른 하나에는 버튼이 있습니다. 다른 펜촉보기의 단추를 눌렀을 때 텍스트 필드 안에있는 내용을 기록하려하지만 null을 반환합니다. 클래스 (ViewClass) 중 하나에서 나는이 있습니다 :null을 반환하는 코코아 텍스트 필드

- (IBAction)startAction:(id)sender { 
MyClass *anInstance = [[MyClass alloc] init]; 
NSString *string= [anInstance name]; 
NSLog(@"startAction logged: %@", string); 

"이름"은 MyClass의 속성입니다.

- (id)init { 
if (self = [super init]) { 
    [self setName:[nameInput stringValue]]; 
    NSLog(@"init value: %@", name); 
} 
return self; 

는 "NameInput"는 텍스트 필드입니다 : 내가 뭘 원하는 anInstance가 초기화 될 때 MyClass의 초기화 방법은이 작업을 수행 MyClass에, 그런 식의 초기화 설정 "이름"을 가지고 있습니다. 이 생각하면이 텍스트 필드에 있던 것은 무엇이든 반환하지만 대신 null이 나타납니다. setName:@"text"을 사용하면 잘 전달되기 때문에 텍스트 필드에 문제가있는 것입니다.

이전에 내 자신의 getter에서이 작업을 수행했는데이 경우 메서드가 자신의 클래스에서 호출되었을 때 null을 반환하지 않았지만 초기화되고 다른 클래스에서 호출 된 경우 null을 반환했습니다. 그것은 말하는 유지하는 것이,

- (NSString *)name { 
NSLog(@"nameMethod = %@", [nameInput stringValue]); 
return [[[nameInput stringValue] retain] autorelease]; 

이 방법, 나는 모든 올바르게 설정을 말할 수 있지만, 일이 일어나고 나는 ViewClass에서 MyClass의 init을 할 때, 그리고 "이름"을 얻으려고 : 나는이 사용 텍스트 필드는 null입니다.

단추가있는 펜촉이 MyView (NSViewController의 하위 클래스)에 속해 있고 텍스트 필드가 MyClass (NSObject의 하위 클래스)에 속해 있는지 확인하는 것은 확실하지 않습니다.

누군가 필드가 올바르게 연결되지 않았다고 제안했지만, 사실이라면 자신의 클래스에서 호출 할 때 작동하지 않았을 것입니다. 다른 누군가가 텍스트 필드가 nil로 초기화되는 문제가있을 수 있다고 언급 했으므로 위의 init 작업을 시도했습니다. 어느 쪽도 지금까지 일하지 않았다.

도움 주셔서 감사합니다.

답변

5

IBOutlets는 awakeFromNib까지 연결되는 것이 보장되지 않습니다. 이는 객체의 init 메소드가 실행 된 후입니다. 펜촉을 awakeFromNib에 설치해야합니다.

내가 집에 돌아 왔다고 편집 : 죄송합니다. 전에 충분히 신중하게 읽지 않았습니다. 위에서 말한 것은 사실 이었지만 더 깊은 문제가 있습니다. 이제 두 개의 다른 객체 (코드에서 생성 된 객체, 코드에서 생성 된 객체)도 다루고 있음을 알 수 있습니다. 콘센트가 인터페이스 요소에 연결되어있는 펜촉에 개체가있는 경우 해당 클래스의 다른 개체에도 요소를 참조하는 인스턴스 변수가 없습니다. 독립적으로 생성 된 두 개의 MyClass 인스턴스는 프로그램의 모든 NSArray가 동일한 항목 세트를 보유하는 것보다 더 많은 인스턴스 인스턴스 변수를 공유하지 않습니다. 펜촉의 인스턴스를 사용하려면 인스턴스를 사용해야합니다.

어떻게하는지는 프로그램을 구성하는 방법에 달려 있습니다. 간단한 [self magicallyGetObjectFromNib]은 없습니다. 어떻게 든, 한 물체는 다른 물체를 (예를 들면, 펜촉의 소유자를 아는 것에 의해) 찾아야하거나, 두 물체를 알고있는 물체에 의해 다른 물체에 관해 말해야합니다.

+0

init에서 awakeFromNib로 옮겨서 이제는 나 자신의 getter 메소드가 필요하지 않습니다. 하지만이 STILL은 ViewClass에서 사용될 때만 작동합니다. * anInstance = (...); [인스턴스 awakeFromNib]; 다른 클래스에서 호출 할 때 여전히 null을 반환합니다. 실제 문제는 ViewClass가 MyCLass에 텍스트 필드의 이름 문자열을 반환하도록 지시하는 것입니다. 하지만 도움 덕분에 @ 척. – Elbimio

+0

당신이 의미하는 바를 이해하는 것 같아요. * anInstance를 여러 번 추가하는 대신 여러 개의 독립적 인 객체를 만들려고합니다. 동일한 펜촉을 모두로드하려고합니다. – Elbimio

+0

@Elbimio : 아니요, 모든로드를 원하지 않습니다. 또 다시 펜촉로. 이것은 펜촉의 여러 복사본을 인스턴스화합니다.이 복사본은 사용자가 상호 작용하는 것과 다릅니다. 이미 생성 한 참조를 얻고 싶습니다. – Chuck

0

동일한 개체의 필드에서 값을 추출하려고 시도 할 때 초기화 루틴에 있고 분명히 초기화 될 것으로 예상됩니다. '그런 일 없을거야.

+0

awakeFromNib로 이동하면 다른 클래스에서 호출 할 때 여전히 작동하지 않는 문제를 해결하지 못했습니다. – Elbimio

+0

개체 인스턴스가 액세스하려는 필드에도 연결되어 있습니까? 나는 추측하고있다. 'nameInput'을 참조 할 곳을 확인하십시오. –

관련 문제