【问题标题】:issue with custom tab bar and navigation controller自定义标签栏和导航控制器的问题
【发布时间】:2011-09-16 05:46:28
【问题描述】:

好的,我有以下内容:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{    
    MainViewController * tabBarController = [[MainViewController alloc] init];
    [self.window addSubview:tabBarController.view];
    [self.window makeKeyAndVisible];
    [tabBarController release];

    [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|
     UIRemoteNotificationTypeAlert|
     UIRemoteNotificationTypeSound];

    return YES;

}

这里,MainViewController 只是 UITabBarController 的一个子类,在 MainViewController 的 viewDidLoad 里面我有:

- (void)viewDidLoad
{
    [super viewDidLoad];

 NSMutableArray *localControllersArray = [[NSMutableArray alloc] initWithCapacity:3];

MapViewController * map = [[MapViewController alloc] init];
    [localControllersArray addObject:map];

    //[localNavigationController release];
    [map release];


    ListViewController * voteSpot = [[ListViewController alloc] initWithTabBar];
    [localControllersArray addObject:voteSpot];

    //[localNavigationController release];
    [voteSpot release];


    ProfileViewController * profile = [[ProfileViewController alloc] initWithTabBar];
    [localControllersArray addObject:profile];

    //[localNavigationController release];
    [profile release];


    self.viewControllers = localControllersArray;
    [localControllersArray release];
}

现在我能看到的只是:

知道为什么是白屏吗?

这是我的 initWithTabBar 示例:

-(id) initWithTabBar {
    if ([self init]) {
        self.navigationItem.title=@"Map";
    }
    return self;
}

暂时忽略底部的标签栏(中间缺少一个),这正是我想要的。我感到困惑的是与每个标签关联的 viewController,它上面什么都没有,而实际上 MapViewController 有一个 MapView它。当我单击任何选项卡时,它将在int retVal = UIApplicationMain(...) 崩溃(程序接收信号:EXC_BAD_ACCESS)

更新:

如果你想调试它,我已经在git hub 上传了一个示例代码,你可以在那里下载整个项目(这是一个简单的测试项目,我保证)

【问题讨论】:

    标签: iphone objective-c ipad uiviewcontroller


    【解决方案1】:

    您应该将控制器添加到 TabBarControllers viewControllers 属性。像这样:

    self.viewControllers = [NSArray arrayWithObjects:map, voteSpot, profile, nil];
    

    编辑:对不起,我没有看到你已经有了。不过根据实际问题,上面的sn-p其实可以解决你的问题。

    一些事情:

    1. 我看不到您的 localControllersArray 的创建。是否自动发布?
    2. 您遇到的错误表明存在内存问题(即访问已释放的变量)。您可以在构建方案中设置 NSZombieEnabled = YES 以准确找出导致问题的变量。
    3. 我个人喜欢在应用程序委托中创建视图控制器并在那里分配它们。不过,没有理由(据我所知)它不应该在 viewDidLoad 中工作。

    编辑 2: 查看您的项目后,我能够通过将 applicationDidFinishLaunchingWithOptions 方法更改为如下所示来启动并运行并显示您的选项卡视图:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        BaseViewController * tabBarController = [[BaseViewController alloc] init];
    
        NSMutableArray *localControllersArray = [[NSMutableArray alloc] initWithCapacity:3];   
    
        //MapViewController * map = [[MapViewController alloc] init];
        //UINavigationController* mapNavController = [[[UINavigationController alloc]
        //                                              initWithRootViewController:map] autorelease];
        //[map release];
        //[localControllersArray addObject:mapNavController];
    
    
        ProfileViewController * profile = [[ProfileViewController alloc] init];
        [localControllersArray addObject:profile];
        [profile release];
    
        tabBarController.viewControllers = localControllersArray;
        [localControllersArray release];
    
        self.window.rootViewController = tabBarController;
        [self.window makeKeyAndVisible];
        [tabBarController release];
        return YES;
    }
    

    【讨论】:

    • 你看不到我上面的代码吗?如果我没有那个,那么我就不会有每个标签栏的标题。
    • 我创建了一个示例项目并将其上传到 GitHub,介意帮助我吗?链接在帖子底部
    • 数组不是自动释放的,用viewControllers数组的分配更新了代码。我也只是试着把它移到应用程序委托,没有效果
    • 让它在本地工作。请注意,我注释掉了地图部分;它正在正确加载视图,但找不到“MKMapView”
    • 那是因为我忘了导入 MapKit 库,除了它可以工作..谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-04-24
    • 2017-01-17
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多