2011-04-22 4 views
11

앞서 언급했듯이 나는 1 차 주문의 Objective-C 초보자이지만 주제에 대해 4 권의 실제 도서를 읽었으며 전자 책 및 문서의 버킷로드를 읽었지만 여전히 원하는 것을 찾을 수 없습니다.다른 객체에서 응용 프로그램 위임자의 윈도우 접근 자 메서드에 어떻게 액세스합니까?

응용 프로그램 대리인의 window 속성의 실제 크기에서 view 속성을 구성하려는 최상위 수준의 콘텐츠보기 컨트롤러가 있습니다. 이것은 여러 사람들이 이미 질문을 한 내용입니다. ([UIScreen mainScreen]는이 포럼에서 전에 여러 번 방영 된 이유 때문에 그것을 자르지 않습니다). 따라서 논리적 인 접근 방식은 콘텐츠 뷰 컨트롤러가 응용 프로그램 대리인의 창 프레임을 읽는 것입니다. 지금, 이것에 가까운 유일한 대답은 [[[UIApplication sharedApplication] window] frame]을 사용하는 것입니다 - 그러나 이것은 일단 window 속성이 keyAndVisible이되면 작동합니다. 콘텐츠 뷰 컨트롤러는 전에 앱 위임자의 윈도우 속성 을 읽어야 makeKeyAndVisible을 가져옵니다. 내 콘텐츠 뷰 컨트롤러의 initWithNibName에서

- (BOOL) application: (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions { 
// This next line is a test window frame for R&D purposes.... 
    [self setWindow: [[UIWindow alloc] initWithFrame: CGRectMake(0.0f, 20.0f, 320.0f, 320.0f)]]; 

    if ([self window]) { 
     contentViewController = [[ContentViewControl alloc] initWithNibName: nil bundle: nil]; // Content view controller instantiated here 

     if (contentViewController) { 
      [[self window] addSubview: [contentViewController view]]; 
      [[self window] layoutSubviews]; 
      [[self window] makeKeyAndVisible]; // Window made key and visible here 
      return YES; 
     } 
    } 

    return NO; 
} 

: 코드는 .... 순서로

앱 위임 간다 전무 번들 : 나는 다음과 같은 테스트 코드가 전무 방법 ...

- (id) initWithNibName: (NSString *) nibNameOrNil bundle: (NSBundle *) nibBundleOrNil { 
    self = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil]; 

    if (self) { 
     NSLog(@"%@", NSStringFromCGRect([[[UIApplication sharedApplication] keyWindow] frame])); 
     // This does not work. 
    } 

    return self; 
} 

App Delegate의 창이 아직 키가 보이지 않아서 작동하지 않습니다. 그래서 내 질문은 이렇습니다. 내 App Delegate Class 인스턴스의 이름은 무엇입니까? App Delegate의 클래스의 기본값은 myApplicationNameAppDelegate이지만 기본값은 입니다. [[UIApplication sharedApplication] keyWindow]에 대한 전화를 다음과 같이 바꾸고 싶습니다.

[myAppDelegatesInstanceName window]. 

조금 더 확장하면 쿼리하는 개체의 범위 하위 항목이 아닌 다른 대상 개체의 메서드에 액세스하는 방법은 무엇입니까?

내가 말했듯이, 나는 이것 모두에 대한 총괄 한 멍청이 다. 그리고 이것은 아마도 다른 벙어리 멍청한 질문 일 것이다. 그러나 그것은 아무도 간단한 방법으로 대답하지 않은 것으로 보인다.

(절차 적으로 - 내 집처럼 - 전체 프로그램 스위트에서 전역 적으로 액세스 할 수있는 창을 만드는 것부터 시작하여 특정 매개 변수로 전달하는 것까지 범위의 다른 수준으로 창을 가져 오는 많은 방법이 있습니다. 다양한 기능 계층 구조 - 그러나이 객관적인 것들은 확립 된 절차 적 관행에서 출발하는 것처럼 보입니다.

누구든지 도움을받을 수 있다면 정말 감사 할 것입니다. 이 물건은 확실히 직관적이지 않습니다! V.V.

답변

21

당신은 싱글을 통해 UIApplication 인스턴스를 응용 프로그램 대리자를 액세스 할 수 있습니다

[[[UIApplication sharedApplication] delegate] window]; 

당신은 객체 (UIApplication 인스턴스)를 그 위임 당신이 알고 액세스 할 수 있기 때문에 이것은하지만, 특수한 경우는 오브젝트 당신입니다 액세스하려고합니다. 일반적인 경우 :

조금 더 확장하면 쿼리하는 개체의 범위 하위 항목이 아닌 다른 대상 개체의 메서드에 액세스하는 방법은 무엇입니까?

대상 개체에 대한 참조를 액세스하려는 개체에 전달해야합니다. 이는 때로는 필요하지만이 두 객체간에 긴밀한 결합을 도입한다는 의미이기도합니다. 가능한 한 피하기를 원합니다. 따라서 각각의 경우에 대해 생각하고 가능한 다른 디자인이 있는지 확인하십시오. 스위프트에 대한

+0

는 빠른 응답을 당신에게 올레 감사합니다! 나는 그것을 시도 할 것이다. – VectorVictor

+0

미안해 보이지만, 나는 아직도 기쁨을 얻지 못하고있다. 귀하의 답변을 올바르게 이해한다면 제 구조는 다음과 같아야합니다 : [[(NumicatorAppDelegate *) [[UIApplication sharedApplication] delegate] window] frame]. 이 올바른지? – VectorVictor

+1

예. 오류가 있습니까? 또한 #import NumericAppDelegate.h를해야합니다. –

3

사용이 :

let window:UIWindow? = (UIApplication.sharedApplication().delegate?.window)! 
2

스위프트 3

if let window = NSApplication.shared().windows.first { 
     // access window. properties now 
    } 
+0

나는 당신이 'UIApplication.shared.windows.first'를 의미한다고 생각한다. –