Подклассы UIWindow - PullRequest
       3

Подклассы UIWindow

5 голосов
/ 13 января 2012

Я просто пытаюсь создать подкласс UIWindow, чтобы перехватывать некоторые уведомления.Наряду с кодом, перечисленным ниже, я также захожу в MainWindow.xib и обновляю объект UIWindow до моего подкласса.Он загружается нормально, проблема в том, что вкладки на панели вкладок не отвечают (в приведенном ниже примере я добавил только одну вкладку, но в моем приложении их несколько (это не проблема)).Кто-нибудь может увидеть, что я могу делать не так?Спасибо.

UISubclassedWindow.h

#import <UIKit/UIKit.h>

@interface UISubclassedWindow : UIWindow 
{

}

@end

UISubclassedWindow.m

    #import "UISubclassedWindow.h"

    @implementation UISubclassedWindow

- (id) initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) 
    {
        NSLog(@"init");
    }
    return self;
}

    - (void)makeKeyAndVisible
    {
        [super makeKeyAndVisible];
        NSLog(@"makeKeyAndVisible");
    }

    - (void)becomeKeyWindow
    {
        [super becomeKeyWindow];
        NSLog(@"becomeKeyWindow");

    }

    - (void)makeKeyWindow
    {
        [super makeKeyWindow];
        NSLog(@"makekeyWindow");
    }

    - (void)sendEvent:(UIEvent *)event
    {
    }

    - (void)dealloc 
    {
        [super dealloc];
    }

    @end

AppDelegate.h

import

@ class UISubclassedWindow;

@interface My_AppAppDelegate : NSObject <UIApplicationDelegate> 
{
    UISubclassedWindow *window;
}

@property (nonatomic, retain) IBOutlet UISubclassedWindow *window;

@end

AppDelegate.m

@synthesize window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{   
    UITabBarController *tabBarController = [[UITabBarController alloc] init];

    MainViewController *mainViewController = [[MainViewController alloc] initWithViewType: 0];
    UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController: mainViewController];
    mainNavigationController.title = @"Main";
    [[mainNavigationController navigationBar] setBarStyle: UIBarStyleBlack];

    [tabBarController setViewControllers: [NSArray arrayWithObjects: mainNavigationController,  nil]];

    [self.window setRootViewController: tabBarController];
    [self.window makeKeyAndVisible];

    [mainViewController release];
    [mainNavigationController release];
    [tabBarController release];

    return YES;
}

Ответы [ 2 ]

4 голосов
/ 24 января 2012

Проблема заключалась в том, что я включал метод события UIWindows - (void) sendEvent: (UIEvent *), но не вызывал super. Я позвонил супер на это, и все было исправлено.

2 голосов
/ 13 января 2012

edit: обратите внимание, что это отвечает на исходный вопрос, прежде чем основная перезапись изменит всю проблему

Сначала вы должны выяснить, есть ли документированный способ (какой-либо вызов илипереопределенный метод), чтобы изменить высоту навигационной панели.Я очень сомневаюсь, что есть один.И я также сомневаюсь, что UIWindow - это место, где его нужно искать - навигационная панель является частью UINavigationController.

Если не существует законного способа заставить высоту оставаться 44px, вы можете попробовать несколько вещей:

  1. (не рекомендуется) сломать весь механизм авторотации UINavigationController, обрабатывать вращение контроллеров представления самостоятельно, например, из UIWindow, как вы это делаете сейчас.UINavigationController только «почувствует» изменение размера и не знает, что он действительно вращается.UINavigationController не должен выполнять вращения, поэтому -shouldAutoRotate.. { return NO; }.В качестве быстрой проверки посмотрите, что произойдет, если вы просто установите для фрейма самого верхнего VC значение CGRectMake(0,0,480,320); (либо из вашего подкласса UINavigationController, либо из подкласса UIWindow).Если все по-прежнему работает нормально, то вам нужно только добавить часть авторотации.
  2. (рекомендуется), не полагайтесь на UINavigationController для рисования панелей навигации, а делайте все сами.Не очень весело, но на 99% гарантирую, что вы получите его, и он не сломается при каждом обновлении iOS.
  3. (нейтральное, быстрое и грязное исправление) для ландшафтного режима, поместите ваш собственный UINavigationBar поверхобычного.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...