2014-04-17 3 views
0

Mac 용 Objective-C/Xcode에서 첫 번째 프로젝트를 만들려고합니다.Objective-C의 모든 UI 인스턴스가 nil입니다.

지금까지 GitHub (https://github.com/phae-girl/multi-view-controllers-xibs)에서 예제를 복사했습니다. 메인 윈도우 내에 2 개의 서브 뷰를 갖는 방법의 예입니다. 이 예제는 훌륭하게 작동하지만 뷰 중 하나에 버튼을 추가하면 새 버튼에 대한 "- (IBAction) newButton : (id) sender {}"메서드에서 두 하위 뷰를 모두 "없음"으로 표시합니다. 텍스트 필드가 전환보기간에 가치를 유지하므로 액세스에 문제가 있다고 확신합니다.

나는 몇 시간 동안 검색을 해왔으므로 어떤 종류의 도움도 받으실 수 있습니다!

ps.
2. AppDelegate.h 내부의 AppDelegate에
3. Ctrl 키의 내부보기 버튼을 NSObject의 추가 서브 뷰에
1. Drag'n'drop 버튼 :
베이스로 GitHub의 프로젝트와 오류를 재현하려면
4. AppDelegate.m의 IBAction 호출 내에서 중단 점 설정

+1

모든 nil 포인터의 약 98 %는 세 가지 원인 중 하나로 인해 발생합니다. 1) 참조되는 개체를 실제로 만들지 못했습니다.3) 그런 다음 포인터를 기대하고, 어떤 클래스의 인스턴스를 생성하고 두 번째 클래스의 인스턴스에 대한 포인터를 저장 기적적으로 아직 생성되지 않은 포함하는 제 2 클래스의 다른 모든 인스턴스에 전달한다. 3) 사전에 존재하지 않는 키를 사용하여 사전에서 값 가져 오기. (즉, 위의 하나에 보조 것입니다 이후로는 전무 포인터를 사용하여 값을 가져 오는 물론, 계산 아니에요.) –

+0

@HotLicks을 : 그것은 좋은 요약입니다. Objective-C 태그의 맨 위에 붙일 수 있기를 바랍니다. – Chuck

+0

그러나이 경우에는 4) NIB의 개체를 File 소유자가 소유 한 인스턴스에 대한 포인터처럼 처리하는 것이 아니라 다른 방법으로 처리합니다. – stevesliva

답변

2

"App Delegate보기에 NSObject 추가"는 원하는 작업이 아닙니다. 그렇게하고 클래스를 프로젝트의 AppDelegate 클래스로 설정하면 방금 [NSApp delegate]이 아닌 AppDelegate의 두 번째 인스턴스가 만들어집니다. [NSApp delegate]과 달리 새 인스턴스에는 MainMenu.xib의 콘센트로 초기화 된보기 컨트롤러 속성이 없습니다

See my fantastic question here for more discussion. 날 믿어, 나는 너의 고통을 느낀다.

NSLog(@"This instance address: %p",self); 
NSLog(@"True app delegate address: %p",[NSApp delegate]); 

이해하는 중요한 건이 NIB의 개체가 는 NIB이로드 될 때을 만든 것을, 그리고 IBOutlets 이들에 대한 포인터 : 당신이 IBAction를에서이 작업을 수행 할 경우, 별도의 인스턴스 주소를 확인해야합니다 사물. NIB 개체를 코드의 개체에 대한 포인터로 생각하는 것은 너무 쉽지만 실제로는 반대입니다. 자리 표시자는 이러한 측면에서 쉽게 잘못된 길로 인도합니다. 문제를 해결하기 위해 어쨌든

, ...

당신은 NSViewController를 서브 클래스와 서브 뷰 XIB 새로운 하위 클래스에서 파일의 소유자의 사용자 정의 클래스를 만들고, 또한 MAINMENU에 반드시 올바른 뷰 컨트롤러 인스턴스를해야한다. xib는 새 하위 클래스입니다. 그런 다음 하위 뷰의 IBAction을 사용자 정의 클래스 헤더에 연결할 수 있습니다. File Owner의 클래스를 설정 했으므로 Xcode는 새 하위 클래스와 하위 뷰 NIB 간의 연결을 인식합니다. 그런 다음 연결된 프로젝트에서 수행되는 방식에 기반하여 적절한 인스턴스에 연결될 것이라고 믿습니다. 그렇지 않은 경우에는 this question to consider.

하위 뷰 NIB가 AppDelegate의 메소드를 호출하는 좋은 방법은 없습니다 수업. 기본 메뉴 (끝내기, 저장하기, 실행 취소하기 등)에만 해당되는 것으로 생각하고 어떤보기도 고려하지 않는 것이 좋습니다. 합니다 ("fantastic question"는 그것이 작동되도록하는 추한 방법을 보여줍니다 있다는 경고와 함께.)

당신은 NSViewController 서브 클래스가 [NSApp delegate]을 다시 참조하여 사용자의 코드를 가질 수있다 - [[NSApplication sharedApplication] delegate]에 대한 속기 - 필요한 경우, 당신은 최선을 다해 비록 그것을 피하십시오.

+0

"+1"또는 "감사합니다"라고 말하면 피하는 것이 좋지만 정말 저항 할 수는 없습니다. 고맙습니다. 그것은 내가 일반적으로 얻는 것보다 훨씬 명확하고 설명적인 설명이었습니다. –

+0

당신은 그것을 기대할 수 없습니다 ... 나는 단지 최근에 똑같은 문제에 부딪쳐서 그것에 대해 알아 냈습니다. – stevesliva