Как получить доступ к методу доступа к окну Access Delegate из другого объекта?

Как уже упоминалось ранее, я новичок из Objective-C первого порядка, но прочитав 4 физических книги по этому предмету и загрузку электронных книг и документации, я все еще не могу найти то, что ищу.

У меня есть контроллер представления содержимого верхнего уровня, который хочет настроить его свойство вида из физических размеров свойства window делегата приложения. Это то, о чем несколько человек уже задавали вопросы. ([UIScreen mainScreen] не режет его по причинам, которые уже были переданы много раз ранее на этом форуме). Поэтому логический подход должен был бы для контроллера представления содержимого считывать кадр окна делегирования приложения. Теперь единственный ответ, который я нашел, который близок к этому, заключается в использовании [[[UIApplication sharedApplication] window] frame] - однако это работает только после того, как свойство окна было сделано keyAndVisible. Контроллер содержимого должен прочитать свойство окна делегата приложения до того, как он получит makeKeyAndVisible. Код идет в этом порядке....

Делегат приложения:

- (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;
}

В моем контроллере представления содержимого initWithNibName: nil bundle: nil method У меня есть следующий тестовый код...

- (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 еще не является ключевым и видимым. Итак, мой вопрос: Как называется экземпляр класса делегата приложения? Я знаю, что имя класса делегата приложения по умолчанию имеет значение myApplicationNameAppDelegate, но после имени экземпляра. Я хочу заменить вызов [[UIApplication sharedApplication] keyWindow] на что-то вроде:

[myAppDelegatesInstanceName window].

Развернуть это немного, как один метод доступа в других целевых объектах, которые не являются объектами потомков объекта, выполняющего запрос?

Как я уже сказал, я полный noob для всего этого, и это, вероятно, еще один немой вопрос noobie, но тот, на который никто, похоже, не ответил просто.

(Процедурно - мой домашний торф - существует множество способов получить содержимое окна в другие уровни охвата, от того, чтобы сделать глобально доступным окно для всего программного пакета, чтобы передать его в качестве конкретного параметра через различные функциональные иерархии - но этот предмет цели, кажется, отходит от установленной процедурной практики).

Если кто-то может помочь, я буду очень благодарен. Этот материал определенно не интуитивно! V.V.

Ответ 1

Вы можете получить доступ к делегату приложения через экземпляр singleton UIApplication:

[[[UIApplication sharedApplication] delegate] window];

Это особый случай, потому что вы можете получить доступ к объекту (экземпляр UIApplication), делегатом которого вы знаете, является объект, к которому вы хотите получить доступ. Общий случай:

Развернуть это немного, как один метод доступа в других целевых объектах, которые не являются объектами потомков объекта, выполняющего запрос?

Вам нужно передать ссылку на целевой объект на объект, с которого вы хотите получить доступ. Иногда это необходимо, но это также означает, что вы вводите плотную связь между этими двумя объектами, чего вы обычно хотите избежать, если сможете. Поэтому подумайте о каждом случае и посмотрите, есть ли другие возможные варианты.

Ответ 2

Используйте это для Swift:

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

Ответ 3

Swift 3

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