Как получить доступ к методу доступа к окну моего делегата приложения из другого объекта? - PullRequest
11 голосов
/ 23 апреля 2011

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

У меня есть контроллер представления содержимого верхнего уровня, который хочет настроить свое свойство представления из физических измерений свойства окна делегата приложения.Это то, о чем несколько человек уже задавали вопросы.([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 У меня есть следующий тестовый код ...

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

[myAppDelegatesInstanceName window].

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

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

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

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

Ответы [ 3 ]

22 голосов
/ 23 апреля 2011

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

[[[UIApplication sharedApplication] delegate] window];

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

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

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

3 голосов
/ 21 ноября 2015

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

let window:UIWindow? = (UIApplication.sharedApplication().delegate?.window)!
2 голосов
/ 28 декабря 2016

Свифт 3

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