【问题标题】:UIViewController question for iPhone/iPadiPhone/iPad 的 UIViewController 问题
【发布时间】:2024-01-02 06:24:01
【问题描述】:

我有一个带有一个 MainWindow.xib 文件的应用程序。然后我有 ViewControllerA.xib 和 ViewControllerB.xib。我的 MainWindow.xib 有一个 ViewController 指向两个 ViewControllerA.xib。

在 ViewControllerA 上,我有一个按钮,我希望该按钮在按下时将 ViewControllerB 移动到屏幕上。我该怎么做?

我尝试了这段代码,但我认为我遗漏了一些东西:

- (IBAction)btMyButton:(id)sender
{
    ViewControllerB * viewController = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:nil];
    [[UIApplication sharedApplication].keyWindow addSubview:viewController.view];
    [self.navigationController pushViewController:viewController animated:YES];
}

我的 ViewControllerB 确实出现了,但它在屏幕顶部被压扁,超过了前一个视图。非常感谢任何帮助。

谢谢

【问题讨论】:

  • 如果你没有使用导航控制器项目,你的 self.navigationController 可能没有添加到窗口中,它也可能是 nil。
  • 是的,你是对的,我没有 NavigationController。我是不是该?我想如果我放一个 NavigationController 我会在顶部放置一个栏。我不希望第一个屏幕顶部的栏,但是当用户单击按钮时,我将转到导航控制器视图。
  • 不想有bar就不需要了,如果只想push一个view controller可以使用[self presentModalViewController:animated:],然后调用dissmissModelViewController:animated :在调用present的视图上...这可以通过self.parentViewController来完成。
  • 导航控制器应该在应用程序委托上有一个出口,如果需要,您可以将其隐藏在您的第一个屏幕上。
  • 但是你可能应该开始一个新的导航项目,看看导航控制器是如何添加的,然后使用它,即使你隐藏了导航栏。

标签: iphone ipad ios4 xcode4


【解决方案1】:

删除第二行:

[[UIApplication sharedApplication].keyWindow addSubview:viewController.view];

您添加了两次视图。第 2 行和第 3 行都导致视图被添加到不同位置的视图层次结构中。

--更新-- 如果您删除了第二行并且没有看到您的视图,那么 self.navigationController 很可能是 nil。试试 [self presentModalViewController:]。

【讨论】:

  • 是的,我确实删除了它,然后什么也没发生,我根本看不到 ViewControllerB。另外,需要注意的是,我的 ViewControllerA 类中有这个按钮。所以我是在质疑自我?
【解决方案2】:

确保控制器 B 的视图具有正确的高度,您应该减去导航栏高度 44 像素和状态栏高度 20 像素。这些值适用于 iPhone。

  - (IBAction)btMyButton:(id)sender
    {
        //you should load from the main app bundle
        ViewControllerB * viewController = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:[NSBundle mainBundle]];
        // you don't need the following line      
        //[[UIApplication sharedApplication].keyWindow addSubview:viewController.view];
        [self.navigationController pushViewController:viewController animated:YES];
        [viewController release];
    }

更新 正如上面的评论所说,如果您可能没有导航控制器来将控制器 B 推入。因此,将导航控制器添加到主窗口而不是视图控制器,并将其根视图控制器设置为 Controller A。

希望对你有帮助,

【讨论】:

    【解决方案3】:

    您需要从主窗口中删除旧的视图控制器。

    - (IBAction)btMyButton:(id)sender
    {
    
    //Assuming you declare two Iboutlet controllerA, controllerB mapping with that view as class variable
    {
    if (self.controllerB == nil)
    {
        ViewControllerB * viewController = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:nil];
        self.controllerB = viewController;
    [viewController release];
    }
    [controllerA.view removeFromSuperview];
    [self.view insertSubview:controllerB.view atIndex:0];
    }
    
    }
    

    【讨论】: