同时实现 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”

如何用目标 c 实现 UISearchController

用 UITableView 实现 UISearchController

UISearchController:searchBar 和 scopeBar 在第一次触摸事件上重叠

Swift - 使用UISearchController实现带搜索栏的表格

UISearchController:用于显示和搜索的单个与单独的表格视图