UIAlertController 实现UITextField校验(点击确认不消失)

效果图

UIAlertController 点击确认时候会消失,无法校验是否输入,所以在他dismiss前要先做校验

通过小技巧(点击确认在block中添加一个数组,使其崩溃)找到以下两个方法(系统版本不同)

_dismissAnimated:triggeringAction:triggeredByPopoverDimmingView:dismissCompletion:
_dismissAnimated:triggeringAction:triggeredByPopoverDimmingView:

hook掉以上两个方法

#import <JRSwizzle/JRSwizzle.h>

#pragma mark - Private

+ (void)load {
    
    SEL originalSelector = nil;
    SEL swizzledSelector = nil;
    
    // _dismissAnimated
    originalSelector = NSSelectorFromString(@"_dismissAnimated:triggeringAction:triggeredByPopoverDimmingView:dismissCompletion:");
    swizzledSelector = @selector(tm_dismissAnimated:triggeringAction:triggeredByPopoverDimmingView:dismissCompletion:);
    [UIAlertController jr_swizzleMethod:originalSelector withMethod:swizzledSelector error:nil];
    
    originalSelector = NSSelectorFromString(@"_dismissAnimated:triggeringAction:triggeredByPopoverDimmingView:");
    swizzledSelector = @selector(tm_dismissAnimated:triggeringAction:triggeredByPopoverDimmingView:);
    [UIAlertController jr_swizzleMethod:originalSelector withMethod:swizzledSelector error:nil];
}

- (void)tm_dismissAnimated:(BOOL)flag triggeringAction:(UIAlertAction *)action triggeredByPopoverDimmingView:(id)view dismissCompletion:(void (^)(void))completion {
    // 保证点击取消依旧可以消失
    if (action.style != UIAlertActionStyleCancel) {
        for (UITextField *textField in self.textFields) {
            if ([textField.text isEqualToString:@""]) {
                [textField placeholderShake]; // placeholder 抖动动画
                return;
            }
        }
    }
    
    [self tm_dismissAnimated:flag triggeringAction:action triggeredByPopoverDimmingView:view dismissCompletion:completion];
}

- (void)tm_dismissAnimated:(BOOL)flag triggeringAction:(UIAlertAction *)action triggeredByPopoverDimmingView:(id)view {
    // 保证点击取消依旧可以消失
    if (action.style != UIAlertActionStyleCancel) {
        for (UITextField *textField in self.textFields) {
            if ([textField.text isEqualToString:@""]) {
                [textField placeholderShake]; // placeholder 抖动动画
                return;
            }
        }
    }
    
    [self tm_dismissAnimated:flag triggeringAction:action triggeredByPopoverDimmingView:view];
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,887评论 1 32
  • AOP简介 AOP全名为 Aspect Oriented Programming- 面向切面编程。AOP是OOP(...
    lyuf阅读 4,241评论 0 0
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,638评论 4 61
  • 很多人早晨都喜欢喝豆浆吃油条,但也有一部分人发现即使是家里煮沸了豆浆,喝了也会有中毒的迹象。那么,什么样的豆浆能喝...
    舒乐泰阅读 2,895评论 0 0
  • 是时候该写点什么了。 忘记了上一次认认真真的写一篇文章是什么时候,只是脑海里觉得已经很久没有去记录一下生活了。明天...
    墨离c阅读 1,567评论 0 0

友情链接更多精彩内容