在弹出窗口的标签栏中取消导航控制器中的 UITableView 搜索后,UINavigationBar 无响应

Posted

技术标签:

【中文标题】在弹出窗口的标签栏中取消导航控制器中的 UITableView 搜索后,UINavigationBar 无响应【英文标题】:UINavigationBar unresponsive after canceling a UITableView search in nav controller in tab bar in a popover 【发布时间】:2010-08-05 19:25:19 【问题描述】:

好吧,这很奇怪,我可以很容易地用一个新项目重现它。

设置如下: 我有一个 UISplitViewController。在左侧,我有一个 UITabBarController。在这个标签栏控制器中,我有两个 UINavigationController。在导航控制器中,我有 UITableViewControllers。这些表格视图上有搜索栏。

好的,这种设置会发生什么情况,如果我处于纵向模式并在弹出窗口中调出此视图,然后我在其中一个表视图中开始搜索并取消它,导航栏就会变得无响应。也就是说,不能点击“返回”按钮以及右侧按钮。

如果我在横向模式下做同样的事情,这样我们就不会出现在弹出窗口中,这不会发生。导航栏保持响应。

所以,问题似乎只发生在弹出框内。

我还注意到,如果我进行搜索但单击搜索结果中的某个项目,最终会将某些内容加载到拆分视图的“详细视图”并关闭弹出框,然后返回到弹出框然后单击取消按钮进行搜索,导航栏是响应式的。

我的应用程序是一个通用应用程序,在 iPhone 界面中使用相同的标签栏控制器,它可以在那里正常工作,没有这个问题。


如上所述,我可以通过一个新项目轻松重现这一点。如果您想自己尝试,请按照以下步骤操作:

开始新项目 - 拆分视图

创建新的 UITableViewController 类(我命名为 TableViewController)

取消注释掉 viewDidLoad 方法以及 viewDidLoad 中的 rightBarButtonItem 行(这样我们将在导航栏中有一个编辑按钮)

输入要从 numberOfSectioinsInTableView 和 numberOfRowsInSection 方法返回的任何值

打开 MainWindow.xib 并执行以下操作:

请注意,您需要在中间的“查看模式”中查看 xib,以便展开项目的内容

将 Tab Bar Controller 拖入 xib 以替换 Navigation Controller 项

将导航控制器作为 Tab Bar Controller 下的另一个项目拖到 xib 中

删除标签栏控制器下的另外两个视图控制器(因此,现在我们的标签栏上只有一个导航控制器)

在导航控制器内部,拖入一个Table View Controller,用它来替换View Controller(Root View Controller)

将新的 Table View Controller 的类更改为上面创建的类(对我来说是 TableViewController)

双击新建的Table View Controller下的Table View将其打开(会显示在拆分视图控制器内的标签栏中)

将“搜索栏和搜索显示”拖到表格视图中

保存 xib

在模拟器中运行项目

在纵向模式下,单击根列表按钮以弹出弹出窗口

注意编辑按钮是可点击的

点击搜索框 - 我们进入搜索模式

点击取消按钮退出搜索模式

请注意“编辑”按钮不再起作用


那么,谁能帮我弄清楚为什么会这样?

谢谢,

标记

【问题讨论】:

【参考方案1】:

好的,从 Apple 开发者技术支持那里得到了答复。他们对其进行了调查,发现这是 UIPopoverController 中的一个错误。他给了我一种解决方法,但在取消搜索后导航栏中的右键最终会滑过屏幕。但是,至少它解决了这个问题。他还建议我向 Apple 发送错误报告,我也这样做了。希望他们会在 SDK 的下一版本中解决此问题。

这是 Apple 工程师回复的相关部分的副本:

我创建了自己的项目并深入了解了正在发生的事情,它看起来像是 UIPopoverController 中的一个错误,在 UISearchBar 被关闭后,导航栏中的某些内容被阻塞。

我现在找到了一种解决方法,尽管出现的动画并不是非常理想: - 使用 UISearchBarDelegate 的--searchBarCancelButtonClicked: 方法并添加以下内容:

self.navigationItem.rightBarButtonItem = nil; self.navigationItem.rightBarButtonItem = self.editButtonItem;

正如我所说,弹出框似乎正在将按钮推到导航栏上,因此它可能不是您要查找的内容。

【讨论】:

【参考方案2】:

我尝试了提到的 rightBarItem 技术,但它对我不起作用。我必须这样做(这也是一个 hack 真的)

[self.navigationController setNavigationBarHidden:YES animated:NO];
[self.navigationController setNavigationBarHidden:NO animated:NO];

这可能是因为我的 UINavigationBar 与弹出框不统一,但我不能肯定。

【讨论】:

以上是关于在弹出窗口的标签栏中取消导航控制器中的 UITableView 搜索后,UINavigationBar 无响应的主要内容,如果未能解决你的问题,请参考以下文章

电脑如何设置虚拟内存?

我的电脑的虚拟内存怎么设置?

如何设置PATH环境变量

如何设置PATH环境变量

在弹出窗口中显示 UISplitViewController

电脑明明有内存,却总是显示内存不足,是怎么回事?