同时实现 UISearchController 和 UISearchDisplayController
Posted
技术标签:
【中文标题】同时实现 UISearchController 和 UISearchDisplayController【英文标题】:Implement both UISearchController and UISearchDisplayController 【发布时间】:2014-08-08 17:40:17 【问题描述】:我正在尝试让我的 ios7 应用在 iOS8 上运行,我看到 UISearchController
替换了 iOS8 中的 UISearchDisplayController
。
当然,我可以使用UISearchController
代替UISearchDisplayController
,但我的应用不再适用于iOS7。
如何让我的应用在两个 iOS 版本上都运行?我需要为 iOS8 制作另一个故事板吗?
提前致谢
【问题讨论】:
【参考方案1】:如果您的部署目标设置为 iOS 7 并且您希望支持 iOS 8,您仍然可以使用 UISearchDisplayController
,它应该可以在 iOS 8 上正常运行,并且不会在 Xcode 中显示警告。我在实现UISearchDisplayController
的应用程序中没有遇到任何不当行为。当我决定不再支持 iOS 7 时,我会用UISearchController
完全替换它。
如果 8+,您可能能够检测操作系统版本并以编程方式实现 UISearchController
,但如果您使用情节提要,则很难同时实现这两者,除非您创建两个不同的情节提要,每个情节一个用于操作系统。但是当您需要支持以前的操作系统时,我真的觉得没有必要。弃用通常并不意味着它在最新的操作系统上运行时不再起作用,而是不建议再使用它,因为有更好的解决方案可用。在较新的 iOS 版本上运行时,不推荐使用的方法无法正常工作的情况很少见。
【讨论】:
谢谢!顺便说一句,有没有比使用 Storyboard 更好的方法? 不是真的,这更多是个人喜好。故事板/笔尖或纯代码,由您决定。 :) 弃用并不意味着在最新的操作系统上运行时它将不再工作 - 非常正确。除非 Apple 决定完全删除它(通常是由于非技术原因,例如“真正的”UUID),否则即使经过大量版本更新,旧类也不太可能被删除。考虑到应用程序的生命周期,通常您不需要立即开始使用最新的类。【参考方案2】:// Above ios 8.0
float os_version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (os_version >= 8.000000)
//Use UISearchController
// self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsController];
else
//use UISearchDisaplyController
// self.controller = [[UISearchDisplayController alloc]initWithSearchBar:self.searchBar contentsController:self];
【讨论】:
所以我必须从我的情节提要中删除 UISearchDisplayController 吗?而且我必须在同一个类中实现 UISearchController 和 UISearchDisplayController 的所有委托方法? (自我) 我认为这不是一个好主意,IMO。协议具有不同的签名,您必须声明它们同时符合两者,同时一次只满足一个。 从技术上讲,这是解决这类问题的方法,但对于整个 UI 类来说,工作量太大了。 通过现代的@available 检查,this answer 将成为今天实现这类事情的方法。仅在其他人碰巧遇到与我相同的问题时发表评论。以上是关于同时实现 UISearchController 和 UISearchDisplayController的主要内容,如果未能解决你的问题,请参考以下文章
进一步澄清“如何用objective c实现UISearchController”
用 UITableView 实现 UISearchController
UISearchController:searchBar 和 scopeBar 在第一次触摸事件上重叠