在弹出窗口的标签栏中取消导航控制器中的 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 无响应的主要内容,如果未能解决你的问题,请参考以下文章