Как уже упоминалось ранее, я новичок из 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.