UISearchController(使用、修改cancel文字)

本文介绍如何使用UISearchController替代UISearchDisplayController实现iOS应用中TableView的本地搜索功能。包括创建搜索结果展示TableViewController、初始化UISearchController及实现更新搜索结果等步骤。


[_searchController.searchBar setValue:@"取消" forKey:@"_cancelButtonText"]; 


iOS8之前我们使用UISearchDisplayController做TableView的本地搜索,查看UIKit库,苹果已经使用新控件取代它。

NS_CLASS_DEPRECATED_IOS(3_0, 8_0, "UISearchDisplayController has been replaced with UISearchController") __TVOS_PROHIBITED

使用UISearchDisplayController的时候,搜索结果的展示tableView系统已经帮我们封装好,但是使用UISearchController,我们需要提供一个搜索结果的展示TableView.

如何使用UISearchController实现搜索功能呢?

1创建一个搜索结果展示TableViewController

.h文件

#import <UIKit/UIKit.h>

@interface SearchResultVC : UITableViewController
// 搜索结果数据
@property (nonatomic, strong) NSMutableArray *resultsArray;
@end

.m

#import "SearchResultVC.h"

@interface SearchResultVC ()

@end

@implementation SearchResultVC

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
   return self.resultsArray.count;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"RESULT_CELL"];
    if (cell == nil) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"RESULT_CELL"];
    }
    cell.textLabel.text = self.resultsArray[indexPath.row];
    cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
    return cell;

}

2 创建一个UISearchController

- (void)initSearchController{
    SearchResultVC *resultTVC = [[SearchResultVC alloc] initWithStyle:UITableViewStylePlain];
    UINavigationController *resultVC = [[UINavigationController alloc] initWithRootViewController:resultTVC];
    self.searchController = [[UISearchController alloc]initWithSearchResultsController:resultVC];
    self.searchController.searchResultsUpdater = self;
    //self.searchController.dimsBackgroundDuringPresentation = NO;
    //self.searchController.hidesNavigationBarDuringPresentation = NO;
    self.searchController.searchBar.frame = CGRectMake(self.searchController.searchBar.frame.origin.x,self.searchController.searchBar.frame.origin.y,self.searchController.searchBar.frame.size.width,44);
    self.tableView.tableHeaderView = self.searchController.searchBar;
        self.searchController.searchBar.delegate = self;
}

3 实现UISearchController的UISearchResultsUpdating方法,当开始搜索的时候响应。并且实现筛选的逻辑

#pragma mark - UISearchResultsUpdating

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController{
    UINavigationController *navController = (UINavigationController *)self.searchController.searchResultsController;
    SearchResultVC *resultVC = (SearchResultVC *)navController.topViewController;
    [self filterContentForSearchText:self.searchController.searchBar.text];
    resultVC.resultsArray = self.tempsArray;
    [resultVC.tableView reloadData];
}

#pragma mark - Private Method
- (void)filterContentForSearchText:(NSString *)searchText{
    NSLog(@"%@",searchText);
    NSUInteger searchOptions = NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch;
    [self.tempsArray removeAllObjects];
    for (int i = 0; i < self.resultArray.count; i++) {
        NSString *title = self.resultArray[i];
        NSRange storeRange = NSMakeRange(0, title.length);
        NSRange foundRange = [title rangeOfString:searchText options:searchOptions range:storeRange];
        if (foundRange.length) {
            [self.tempsArray addObject:self.resultArray[i]];
        }
    }
}

完成了,就是这么简单,UI什么的可以自定义。简单demo可以去我github上下载: https://github.com/wangdachui/WTUISearchController


`pthread_cancel()` 是 POSIX 线程(pthreads)库中的一个函数,用于请求取消指定的线程。该函数不会阻塞调用线程,也不会等待目标线程终止;它仅发送取消请求,线程的实际终止取决于其取消状态和类型。 ### 函数原型 ```c int pthread_cancel(pthread_t thread); ``` - **参数**: - `thread`:要取消的目标线程的 ID。 - **返回值**: - 成功时返回 0,否则返回错误码。 线程可以通过设置取消状态(启用或禁用)和取消类型(延迟取消或异步取消)来控制对取消请求的响应方式。默认情况下,线程的取消状态是 `PTHREAD_CANCEL_ENABLE`,而取消类型是 `PTHREAD_CANCEL_DEFERRED`。 --- ### 使用示例 以下是一个使用 `pthread_cancel()` 的简单 C 语言示例: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> void* thread_function(void* arg) { int i = 0; while (1) { printf("Thread is running...\n"); sleep(1); i++; if (i == 3) { pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); // 禁用取消 printf("Cancellation disabled for 2 seconds\n"); sleep(2); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); // 重新启用取消 } } return NULL; } int main() { pthread_t thread; int rc; rc = pthread_create(&thread, NULL, thread_function, NULL); if (rc != 0) { fprintf(stderr, "Failed to create thread\n"); exit(EXIT_FAILURE); } sleep(5); // 让线程运行一段时间 printf("Cancelling thread\n"); rc = pthread_cancel(thread); if (rc != 0) { fprintf(stderr, "Failed to cancel thread\n"); exit(EXIT_FAILURE); } pthread_join(thread, NULL); printf("Thread was cancelled\n"); return 0; } ``` 在该程序中: - 创建了一个无限循环的线程,每秒打印一次消息。 - 主线程在等待 5 秒后调用 `pthread_cancel()` 请求取消子线程。 - 子线程在运行过程中会短暂禁用取消功能,以演示如何控制取消行为。 编译命令(例如使用 GCC)[^2]: ```bash gcc -pthread -o pthread_cancel_example pthread_cancel_example.c ``` --- ### 注意事项 - 被取消的线程可以注册清理处理程序(通过 `pthread_cleanup_push()` 和 `pthread_cleanup_pop()`),以便在线程被取消时执行必要的资源释放操作。 - 如果线程处于 `PTHREAD_CANCEL_DISABLE` 状态,则取消请求会被挂起,直到状态变为 `PTHREAD_CANCEL_ENABLE`。 - 在实际应用中,应谨慎使用 `pthread_cancel()`,因为不当的线程取消可能导致资源泄漏或死锁。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值