UIBarButtonItem我用了这些姿势才能和你交互

UIBarButtonItem我用了这些姿势才能和你交互

下面是需求完成图(自己做了优化)

  • 字符串和传递进来的一样 则不允许进行提交交互
  • 当编辑框没有任何的编辑文字也不允许交互

因为系统是没有方式可以获取到 Done 按钮的,我们运用运行时倒是可以获取到这个按钮。

下面是获取按钮的逻辑。

UIButton *btn;
    for (UIView *view in self.navigationController.navigationBar.subviews) {
        if ([view isKindOfClass:NSClassFromString(@"UINavigationButton")]) {
            UIButton *btn = (UIButton *)view;
            btn.userInteractionEnabled = isAllowOperation;
            btn.enabled = isAllowOperation;
        }
    }

大家可以看出来,我们便利了 self.navigationController.navigationBar所有的子试图,找到 UINavigationButton这个类控件。因为我们这个界面只有一个元素,我们就逻辑就没做复杂的判断了。

我们在输入框文字进行改变的时候,动态获取发现是可以的。当我在 ViewDidLoad方法直接调用这个方法竟然这个按钮还没有添加。

当我们对已经存在的数据进行编辑的时候,如果进来没有做判断,可以允许用户进行编辑的时候,这是一个不好的交互体验。

我们要做就做的好一些,在 ViewDidLoad页面加载设置 Done按钮不允许用户进行交互。

但是刚才的方法已经不能获取到了。如果我们自定义按钮,自然是没有什么难度的,但是考虑到要自己设置按钮的颜色。如果之后全部更改颜色,这个地方就要改动,万一忘记改动就会出现问题。

所以觉得还是用系统的,之后禁用系统的交互。这样出问题的几率比较小。

我首先想到的利用 KVO最后发现对于数组 字典是无法进行 KVO,只能通过其他的方法。这是系统内部的数组,我们不清楚系统怎么添加的,简单的拦截 NSArray的添加元素方法或者重写或者会出现其他的问题。

唯一方法就是我们怎么知道界面展示的时候,什么时候子试图里面才有 Done这个按钮。

经过测试, viewDidLayoutSubviews方法和 viewDidAppear方法都可以获取到这个按钮。

但是调用是 viewDidLayoutSubviewsviewDidAppear之前。我们为了不出现页面已经出现在用户严重,按钮 Done从可用变成不可用。 我们在 viewDidLayoutSubviews 方法里面来进行判断。

- (void)setNeedDoneButtonOperation {
    NSString *nowEditString = self.editStringView.textFiled.text;
    /*!
     * 当正在编辑的字符串等于赋值过来字符串 或者没有编辑内容
     */
    BOOL isAllowOperation = nowEditString.length > 0 && ![nowEditString isEqualToString:self.editString];
    UIButton *btn;
    for (UIView *view in self.navigationController.navigationBar.subviews) {
        if ([view isKindOfClass:NSClassFromString(@"UINavigationButton")]) {
            UIButton *btn = (UIButton *)view;
            btn.userInteractionEnabled = isAllowOperation;
            btn.enabled = isAllowOperation;
        }
    }
}

这样我们在页面出现的时候,就已经禁用了 Done按钮。

突然想起来,没有任何一个编辑界面让用户进来就可以提交,都是用户改变了输入框的内容之后才可以进行提交的。 这样我们在进入这个页面直接禁用 Done也是可以的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iOS技术杂谈

NSNotificationCenter 通知的使用方法详解你要知道的KVC、KVO、Delegate、Notification都在这里

你要知道的KVC、KVO、Delegate、Notification都在这里 转载请注明出处 https://cloud.tencent.com/develop...

51960
来自专栏编程之旅

iOS开发——多线程完成短信获取按钮倒计时

现在的APP应用中,用手机获取短信验证码是非常常见的一个功能,而往往要求的效果就是在按下获取验证码之后,验证码的按钮开始倒计时,例如30秒后重新获取。而我们如何...

16240
来自专栏ShaoYL

UINavigationController

38160
来自专栏Web 开发

给iOS的WebView添加远程调试

定位到 didFinishLaunchingWithOptions 代码块中。

9700
来自专栏文大师的新世界

4. Navigation实战

本来想写一个应用redux的Navigation实战,但是发现react-native有又新的更新,新手怕误导大家,就直接用了别人的组件,看看怎么应用吧。本次在...

9720
来自专栏谈补锅

通知 - NSNotificationCenter

1、每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信;

13040
来自专栏iOS122-移动混合开发研究院

FXForms,自动生成iOS表单

1.简介 FXForms是一个简单的表单提交框架,他的作者是鼎鼎大名的 Nick Lockwood,你也许听说过他的其他的一些框架,比如 iCarousel. ...

30500
来自专栏DannyHoo的专栏

底牌项目中的选择牌谱上传功能--深刻理解UITableView复用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

9410
来自专栏一“技”之长

NSAlert组件应用总结 原

    在桌面软件开发中,当用户进行非法的操作或有风险的操作时,时长需要弹出警告框来提示用户。在OS X系统上,NSAlert是专门的警告框组件。其提供了简洁的...

12240
来自专栏每日一篇技术文章

go - os包 彻头彻尾用法使用

os包提供了操作系统函数的不依赖平台的接口。设计为Unix风格的,虽然错误处理是go风格的;失败的调用会返回错误值而非错误码。通常错误值里包含更多信息。例如,如...

32260

扫码关注云+社区

领取腾讯云代金券