我是Swift的新手,我正在try 将搜索功能添加到UIViewController类的UITableView中.我在谷歌上搜索了很多,发现UISearchDisplayController已经被弃用,取而代之的是UISearchController.当我试图搜索教程时,我没有找到任何专门针对UITableView的教程.其中一些是在UITableViewController年实施的.以下是我的问题:

  1. 我们能在UIViewController类的UITableView中实现UISearchController吗?(我想我们可以)

  2. 如果可以,请将这些代码转换成Objective-C语言.如果有一些非常好的教程,请告诉我.

    @property (strong, nonatomic) UISearchController *searchController;
    
    UITableViewController *searchResultsController = [[UITableViewController alloc] init];
    
    // Init UISearchController with the search results controller
     self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsController];
    
    // Link the search controller
    self.searchController.searchResultsUpdater = self;
    

Source

EDIT :

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating {

    override func viewDidLoad() {

       super.viewDidLoad()
       self.view.backgroundColor = UIColor.blackColor() 
       self.addTableViewWithSection() 
       self.searchResultsController = UITableViewController()           
       var controller = UISearchController(searchResultsController: nil)            
       controller.searchResultsUpdater = self           
       controller.dimsBackgroundDuringPresentation = false   
    }
}

*然而,在线控制器上.searchResultsUpdater=self我得到了eroor as不能将"ViewController"类型的值分配给"UISearchResultsUpdating"类型的值.. So i really doubt if i can use 101 in 102 type class.

推荐答案

是的,搜索工作的方式已经从根本上改变了,因为我认为这是一个更好的系统.对于大多数简单的实现,新系统更好、更直接.使用它非常简单.

首先,让你的班级遵守UISearchResultsUpdating协议.

class MyTableViewController: UITableViewController, UISearchResultsUpdating {}

将其添加到搜索控制器属性:

class MyTableViewController: UTableViewController, UISearchResultsUpdating {
    let searchController = UISearchController(searchResultsController: nil)
}

在viewDidLoad中添加搜索栏:

override func viewDidLoad() {
    super.viewDidLoad()

    searchController.searchResultsUpdater = self
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.sizeToFit()
    self.tableView.tableHeaderView = searchController.searchBar
}

最后,实现UISearchResultsUpdating协议中的updateSearchResults:for方法:

func updateSearchResults(for searchController: UISearchController) {

}

当然,这种方法的实现将取决于从何处搜索数据.在您键入搜索内容时,它会用搜索内容更新当前的表视图.确保更新数据源并在updateSearchResultsForSearchController方法中重新加载表视图.同样,它会随着您的输入而更新,因此,如果您要搜索的数据很大,或者您是从internet进行搜索,请确保在该方法中添加一些并发性.

如果您想使用其他控制器填充搜索结果,可以在初始化searchController属性时传递该VC.

EDIT:我重读了你的问题,似乎我忘了添加一些重要的内容.

UITableViewController有一个名为tableView的成员.您可以抓取控制器的表视图,但要填充UITableView,无需touch 它.不能将SearchController逻辑directly与UITableView一起使用.你得和控制器合作才能把它送到那里.使用UITableViewController委托和数据源方法,使用搜索结果更新表UI.

请阅读ViewUITableController,了解如何使用ViewUITable搜索结果.

Swift相关问答推荐

多个提取来计算核心数据中的记录

为表单部分赋予背景 colored颜色 /渐变

启用完成并发判断以及如何解决警告(续)

如何让CTFontCreateUIFontForLanguage与汉字和表情包协同工作?

try 在小部件内部读取核心数据的SwiftUI总是返回空吗?

格式化单位和度量值.为什么从符号初始化的单位不能产生与静态初始化相同的结果

正在接收具有不完整数据错误的URL请求

UIView.convert(_ point:to:)的意外行为

如何在 SwiftUI 中创建条件内容?

如何在 SwiftUI 中获取视图的位置

如何确定扩展中的具体类型?

使用协议捕获 SwiftUI 视图

更改该函数的参数之一时,如何将这些 SwiftUI 异步任务合并到一个任务中以从函数中获得正确的结果

.onTapGesture 不适用于 Stepper,仅适用于其文本

在 Swift 中将两个字节的 UInt8 数组转换为 UInt16

如何从 Button 获取标签名称?

iOS:检测设备是否为 iPhone X 系列(无框)

Swift 中惰性 var 的优势是什么

如何在 Swift 中将 NSURL 转换为字符串

如何在 Swift 中重写 setter