iOS使用UISearchBar的右边cancelButton的问题

本文介绍了在iOS开发中自定义UISearchBar右侧取消按钮的方法,包括通过遍历子视图和使用valueForKeyPath找到cancelButton,并进行标题、颜色及事件响应的设置。同时指出,必须设置cancelBtn.enabled = YES,以避免点击时触发searchBarTextDidBeginEditing方法。


苹果自带的UISearchBar还是蛮好用的,但是在使用过程中也遇到一些坑,比如如何找到searchBar右侧的取消button,以及第一次点击的时候会执行UISearchBar的代理方法:searchBarTextDidBeginEditing 的问题

  首先如何获取cancelButton并且进行自定义呢?

for (UIView *view in [[_searchBar.subviews lastObject] subviews]) {

        if ([view isKindOfClass:[UIButton class]]) {

            UIButton *cancelBtn = (UIButton *)view;

            cancelBtn.enabled = YES;

            [cancelBtn setTitle:@"取消" forState:UIControlStateNormal];

            [cancelBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

            [cancelBtn addTarget:self action:@selector(cancelButtonClicked:) forControlEvents:UIControlEventTouchUpInside];

        }

    }

上面这是复杂一点的方式,下面用更简单的方式获取,那就是利用kvo原理:

UIButton *cancelBtn = [_searchBar valueForKeyPath:@"cancelButton"];

    cancelBtn.enabled = YES;

    [cancelBtn setTitle:@"取消" forState:UIControlStateNormal];

    [cancelBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

    [cancelBtn addTarget:self action:@selector(cancelButtonClicked:) forControlEvents:UIControlEventTouchUpInside];


大家可能注意到,其中有一行代码 cancelBtn.enabled = YES; 为什么要写这句代码呢?是因为searchBar加载出来以后右侧的取消按钮是默认enabled = NO,所以才会出现点击的时候执行searchBarTextDidBeginEditing方法。注意一点,在搜索完成,searchBar失去焦点的地方,也需要获取到cancelBtn并且设置 cancelBtn.enabled = YES;

比如在点击键盘上的搜索按钮:

//键盘上搜索按钮被点击

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar

{

    [searchBar resignFirstResponder];

    UIButton *cancelBtn = [searchBar valueForKeyPath:@"cancelButton"]; //首先取出cancelBtn

    cancelBtn.enabled = YES;

}

这样点击取消按钮就会直接退出搜索页面,而不是执行searchBarTextDidBeginEditing方法。

希望以上内容对你有帮助!


### 如何在 iOS使用 Objective-C 动态加载 Tab Bar 图标 在 iOS 开发中,`UITabBarController` 是用于管理多个视图控制器的容器控件。通过设置 `UITabBarItem` 的属性可以动态更改其显示效果,包括图标和标题。以下是基于提供的 Swift 示例转换而来的 Objective-C 实现方法。 #### 设置自定义 Tab Bar 图标的代码示例 以下代码展示如何在 Objective-C 中动态加载底部 Tab Bar 图标: ```objective-c // 初始化 UITabBarController UITabBarController *tabBarController = [[UITabBarController alloc] init]; // 加载自定义图片资源 UIImage *customImage = [UIImage imageNamed:@"customIcon"]; // 创建带有自定义图像的 UITabBarItem UITabBarItem *tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Tab 1" image:customImage selectedImage:nil]; // 配置 UIViewController 并关联到 UITabBarItem UIViewController *viewController = [[UIViewController alloc] init]; viewController.tabBarItem = tabBarItem; // 将配置好的 ViewController 添加到 TabBarController 中 NSArray *viewControllers = @[viewController]; tabBarController.viewControllers = viewControllers; ``` 上述代码实现了动态加载 Tab Bar 图标的功能[^1]。其中的关键在于创建 `UITabBarItem` 对象时传入自定义的 `image` 参数,并将其绑定至目标 `UIViewController` 上。 --- #### 关于系统按钮项的扩展说明 如果需要进一步定制导航栏中的按钮行为(如取消操作),可参考如下方式实现系统样式按钮的初始化[^2]: ```objective-c UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelClick)]; ``` 此部分代码适用于顶部导航条上的功能按键设计,而非直接作用于 Tab Bar 图标上。但两者均涉及 UI 控件的动态构建逻辑,因此具有一定的相似性。 --- #### 第三方库推荐 对于更复杂的交互需求或动画效果支持,建议引入第三方开源项目辅助开发。例如: - **MJPopupViewController**: 提供弹窗风格的内容呈现方案[^3]。 - 官方文档与社区维护的工具列表也可作为参考资料[^4]。 这些框架能够显著简化复杂场景下的界面搭建过程,同时提供丰富的预设选项满足个性化需求。 --- ### 总结 综上所述,在 iOS 应用程序中利用 Objective-C 编程语言完成 Tab Bar 图标的动态加载是一项基础却重要的技能点。通过合理运用标准 API 和外部依赖库相结合的方式,开发者可以高效达成预期的设计目标。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值