子类化UIWindow

时间:2012-01-13 00:55:43

标签: iphone objective-c ios cocoa-touch uiviewcontroller

我只是尝试将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 个答案:

答案 0 :(得分:4)

问题是我包括UIWindows - (void)sendEvent:(UIEvent *)事件方法,但没有调用super。我打电话给它,一切都已修复。

答案 1 :(得分:2)

编辑:请注意,这会在重大改写整个问题之前回答原始问题

首先应该找出是否有记录方式(某些调用或重写方法)来更改导航栏的高度。我非常怀疑有一个。而且我也怀疑UIWindow是否是寻找它的地方 - 导航栏是UINavigationController的一部分。

假设没有合法的方法强制高度保持44px,你可以试试几件事:

  1. (不推荐)打破UINavigationController的整个自动旋转机械,自己处理视图控制器的旋转,例如:来自UIWindow,就像你现在开始做的那样。 UINavigationController只会“感觉”调整大小并且不知道它实际上正在旋转。 UINavigationController不能进行旋转,因此-shouldAutoRotate.. { return NO; }。作为快速检查,如果您只是将最顶层VC的框架设置为CGRectMake(0,0,480,320);(来自您的子类UINavigationController或来自子类UIWindow),请查看会发生什么。如果一切仍然正常,那么您只需要添加自转部件。
  2. (推荐)不要依赖UINavigationController绘制导航栏,而是自己动手。这样做并不是很有趣,但99%的保证你会让它工作,并且不会在iOS的每次更新时中断。
  3. 对于横向模式,
  4. (中性,快速和肮脏的修复),将您自己的UINavigationBar放在常规UINavigationBar之上。