"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]
에 대한 속기 - 필요한 경우, 당신은 최선을 다해 비록 그것을 피하십시오.
모든 nil 포인터의 약 98 %는 세 가지 원인 중 하나로 인해 발생합니다. 1) 참조되는 개체를 실제로 만들지 못했습니다.3) 그런 다음 포인터를 기대하고, 어떤 클래스의 인스턴스를 생성하고 두 번째 클래스의 인스턴스에 대한 포인터를 저장 기적적으로 아직 생성되지 않은 포함하는 제 2 클래스의 다른 모든 인스턴스에 전달한다. 3) 사전에 존재하지 않는 키를 사용하여 사전에서 값 가져 오기. (즉, 위의 하나에 보조 것입니다 이후로는 전무 포인터를 사용하여 값을 가져 오는 물론, 계산 아니에요.) –
@HotLicks을 : 그것은 좋은 요약입니다. Objective-C 태그의 맨 위에 붙일 수 있기를 바랍니다. – Chuck
그러나이 경우에는 4) NIB의 개체를 File 소유자가 소유 한 인스턴스에 대한 포인터처럼 처리하는 것이 아니라 다른 방법으로 처리합니다. – stevesliva