美文网首页Tool
iOS开发常见问题-如何监听一个控件内部的事件

iOS开发常见问题-如何监听一个控件内部的事件

作者: 年轻岁月 | 来源:发表于2016-06-26 23:19 被阅读955次

    如何监听一个控件内部的事件

    • 如果继承自UIControl
    - (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
    
    • 代理

    • 通知

    • 利用内部的某些机制

      • 比如重写UITextField的becomeFirstResponderresignFirstResponder来监听UITextField的获得焦点和失去焦点事件

    监听UITextField的获得焦点和失去焦点事件

    • addTarget
    [textField addTarget:target action:@selector(editingDidBegin) forControlEvents:UIControlEventEditingDidBegin];
    [textField addTarget:target action:@selector(editingDidEnd) forControlEvents:UIControlEventEditingDidEnd];
    
    UIControlEventEditingDidBegin
    1.开始编辑
    2.获得焦点
    3.弹出键盘
    
    UIControlEventEditingDidEnd
    1.结束编辑
    2.失去焦点
    3.退下键盘
    
    • delegate
    textField.delegate = self;
    
    #pragma mark - <UITextFieldDelegate>
    - (void)textFieldDidBeginEditing:(UITextField *)textField
    {
    
    }
    
    - (void)textFieldDidEndEditing:(UITextField *)textField
    {
    
    }
    
    • 重写UITextField的becomeFirstResponderresignFirstResponder方法
    /**
     *  调用时刻 : 成为第一响应者(开始编辑\弹出键盘\获得焦点)
     */
    - (BOOL)becomeFirstResponder
    {
    
        return [super becomeFirstResponder];
    }
    
    /**
     *  调用时刻 : 不做第一响应者(结束编辑\退出键盘\失去焦点)
     */
    - (BOOL)resignFirstResponder
    {
    
        return [super resignFirstResponder];
    }
    
    • 通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(beginEditing) name:UITextFieldTextDidBeginEditingNotification object:textField];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(endEditing) name:UITextFieldTextDidEndEditingNotification object:textField];
    
    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    
    - (void)beginEditing
    {
    
    }
    
    - (void)endEditing
    {
    
    }
    

    通知相关的补充

    使用block监听通知

    // object对象发出了名字为name的通知, 就在queue队列中执行block
    self.observer = [[NSNotificationCenter defaultCenter] addObserverForName:UITextFieldTextDidBeginEditingNotification object:self queue:[[NSOperationQueue alloc] init] usingBlock:^(NSNotification * _Nonnull note) {
        // 一旦监听到通知, 就会执行这个block中的代码
    }];
    
    // 最后需要移除监听
    [[NSNotificationCenter defaultCenter] removeObserver:self.observer];
    

    一次性通知(监听1次后就不再监听)

    id observer = [[NSNotificationCenter defaultCenter] addObserverForName:UITextFieldTextDidBeginEditingNotification object:self queue:[[NSOperationQueue alloc] init] usingBlock:^(NSNotification * _Nonnull note) {
    
    
        // 移除通知
        [[NSNotificationCenter defaultCenter] removeObserver:observer];
    }];
    

    其他

    • 如果在线程A发出通知,那么就会在线程A中接收通知
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // 系统会在子线程中处理test这个通知
        [[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:nil];
    });
    

    相关文章

      网友评论

        本文标题:iOS开发常见问题-如何监听一个控件内部的事件

        本文链接:https://www.haomeiwen.com/subject/fslzdttx.html