为什么我的Done按钮会在简单的FlipsideViewController应用程序中消失?

时间:2011-06-24 17:53:15

标签: iphone xcode ios4

我有一个简单的双屏应用程序,我在一年前使用Xcode 3中的“实用程序”项目模板构建。这创建了一个应用程序委托,一个主视图和一个翻转视图。翻转视图顶部有一个UINavigationBar,左侧有一个Done按钮。

我最终使用SDK 4.3升级到Xcode 4,当我现在构建应用程序时,完成按钮不会出现在模拟器或我的设备上。但是如果我使用Xcode 4“实用程序”模板创建一个新项目,“完成”按钮将显示并正常工作。不幸的是,升级删除了我的SDK 4.2文件,所以我无法重建SDK 4.2并测试是否有所不同。

我注意到新模板使用窗口的rootViewController属性设置主视图,而不是将主视图添加为窗口的子视图(more info here)。我尝试将此代码复制到我的app委托而不是addSubview代码,但视图根本没有显示,所以我一定错过了一些东西......但我还是会尽快维护iOS 3.0的兼容性。我找不到基于旧模板的较新“实用程序”模板和我自己的项目之间的任何其他区别。

我也尝试将“完成”按钮从leftButtonItem移动到Interface Builder中的rightButtonItem,但它仍然没有出现。

更多信息:

我在我的Xcode安装中可用的所有iPhone模拟器版本上尝试了这个。使用SDK 4.3构建时,完成按钮不会出现在iOS 4.0-4.3模拟器中......但它确实出现在iOS 5(beta)模拟器中。

接下来,我将IBOutlets连接到Interface Builder中的导航栏,导航项和完成按钮,以便我可以从我的代码中探测它们。当我使用presentModalViewController呈现flipside视图后立即检查它们时,我发现完成按钮(UIBarButtonItem)存在,但导航项的leftBarButtonItem为null。如果我将完成按钮分配给该属性,则会显示该属性。因此,当初始化或显示翻转视图时,按钮与leftBarButtonItem属性断开连接。

替代方法:

在Interface Builder中,如果我查看导航项的出口,我看到“完成”按钮链接到其leftBarButtonItem属性,但是如果我查看“完成”按钮的出口,则它没有链接。如果我将其链接到导航项,则会出现按钮!通过此设置,“完成”按钮将导航项显示为插座,导航项将“完成”按钮显示为插座两次。新的实用程序应用程序模板中不需要这样,所以我不知道为什么需要它。它似乎有效,但如果有人有解释或更好的解决方案,我会保留我的答案点。

1 个答案:

答案 0 :(得分:1)

与自定义BarButtonItem有类似的问题,虽然我不确定它是同样的问题,但它们非常接近。所以,我发布了一个答案,以防万一有人偶然发现你的问题:)

<强>问题: 使用以下代码将自定义UIBarButtonItem添加到具有自定义背景的导航栏。当您按下另一个视图控制器并返回时,自定义UIBarButtonItem不会出现,但您可以继续触摸它曾经的位置并调用其目标操作。 这个问题只发生在iOS4.3模拟器上,没有iOS5模拟器上的解决方案,一切正常。 (一切都在iOS5设备上正常工作,无法在iOS4.3设备上尝试代码)

    UIButton* doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [doneButton setBackgroundImage:[UIImage imageNamed:@"barbutton.png"] forState:UIControlStateNormal];
    [doneButton setTitle:@"Done" forState:UIControlStateNormal];
    doneButton.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:12.0];
    [doneButton.layer setCornerRadius:5.0];
    [doneButton.layer setMasksToBounds:YES];
    [doneButton.layer setBorderWidth:0.2];
    [doneButton.layer setBorderColor:[[UIColor blackColor] CGColor]];
    doneButton.frame = CGRectMake(0.0, 0.0, 70.0, 30.0);
    [doneButton addTarget:self action:@selector(doneButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    doneBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:myLocationButton];
    self.navigationItem.leftBarButtonItem = doneBarButtonItem;

<强>解决方案: 添加以下与设置UIButton图层的z-index相关的代码行为我解决了这个问题。

[doneButton.layer setZPosition:2];

注意 您需要包含<QuartzCore/QuartzCore.h>才能使用与图层相关的属性/方法