为啥我的完成按钮在一个简单的 FlipsideViewController 应用程序中消失了?

Posted

技术标签:

【中文标题】为啥我的完成按钮在一个简单的 FlipsideViewController 应用程序中消失了?【英文标题】:Why does my Done button disappear in a simple FlipsideViewController app?为什么我的完成按钮在一个简单的 FlipsideViewController 应用程序中消失了? 【发布时间】:2011-06-24 17:53:15 【问题描述】:

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

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

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

我也尝试在 Interface Builder 中将 Done 按钮从 leftButtonItem 移动到 rightButtonItem,但它仍然没有出现。

更多信息:

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

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

解决方法:

在 Interface Builder 中,如果我查看 Navigation Item 的 outlet,我会看到 Done 按钮链接到它的 leftBarButtonItem 属性,但如果我查看 Done 按钮的 outlet,它没有链接。如果我将它链接到导航项,那么按钮就会出现!使用此设置,完成按钮将导航项显示为出口,导航项将完成按钮显示为出口两次。在新的 Utility Application 模板中不需要这个,所以我不知道为什么这里需要它。它似乎有效,但如果有人有解释或更好的解决方案,我会为此保留我的答案点。

【问题讨论】:

【参考方案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> 才能使用层相关的属性/方法

【讨论】:

以上是关于为啥我的完成按钮在一个简单的 FlipsideViewController 应用程序中消失了?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的代码不会在测验结束时显示分数?

为啥我的反应图标不能在按钮中居中?

Angular Material - 为啥我的 md 按钮是全角的?

为啥我的停止按钮在这个 javascript 音频播放器上不起作用?

为啥我的栏按钮消失了?我的头衔没有改变?并且出现了一个不存在的表格视图?

为啥我必须执行两次按钮功能才能使我的逻辑正常工作?