事件處理之nextResponder

一位仁,通過(guò)分類(lèi)向上傳遞信息

參考鏈接:http://www.reibang.com/p/eb775f5d9032

這里通過(guò)給UIResponder添加分類(lèi)方法:

- (void)routerInfo:(id)info;
- (void)routerInfo:(id)info sender:(UIResponder *)sender; //帶有發(fā)送者的方法

省去了向上傳遞數(shù)據(jù)的代理方法和block調(diào)用进胯。作者通過(guò)一個(gè)在cell上傳遞數(shù)據(jù)到控制器中的例子展示了nextResonder來(lái)處理事件信息處理的簡(jiǎn)便性逗鸣。這里有個(gè)注意點(diǎn)需要提一下:如果tableView是自定義的并且實(shí)現(xiàn)了- (void)routerInfo:(id)info方法蛋济,接收了數(shù)據(jù)旨袒。那么控制器中就不能響應(yīng)- (void)routerInfo:(id)info方法的事件了察绷。如果控制器還需要處理干签,在tableView中繼續(xù)調(diào)用該方法。

cell中的實(shí)現(xiàn):

@implementation OKTestTableViewCell
- (void)awakeFromNib {
    [super awakeFromNib];
    // Initialization code
}
- (IBAction)btnClick:(id)sender {
    [self.nextResponder routerInfo:self.label.text];
}
@end

tableView中的實(shí)現(xiàn):

@implementation OKTestTableView
//如果tableView中不實(shí)現(xiàn)拆撼,cell的事件就會(huì)向上拋給Controller處理容劳。
- (void)routerInfo:(id)info {
    NSLog(@"tableView中的routerInfo");
    id tableViewData = nil;
    //如果需要向上拋喘沿,那么就繼續(xù)調(diào)用
    [self.nextResponder routerInfo:tableViewData];
}
@end

如果tableView中沒(méi)有實(shí)現(xiàn)- (void)routerInfo:(id)info 方法,而控制器中實(shí)現(xiàn)了竭贩,那么控制器會(huì)直接獲取到cell中傳遞的信息蚜印。

控制器中:

- (void)routerInfo:(id)info {
    //如果tableView中沒(méi)有實(shí)現(xiàn),控制器就直接獲取cell傳遞的info信息
    NSLog(@"控制器的routerInfo:%@",info);
}

二留量,長(zhǎng)按顯示UIMenuController時(shí)窄赋,防止鍵盤(pán)退出

參考:http://www.reibang.com/p/b64a57538f74

實(shí)現(xiàn)長(zhǎng)按彈出UIMenu的功能,需要在長(zhǎng)按方法中設(shè)置控件(UILabel,UITextField)成為第一響應(yīng)者,并且在canBecome:

- (void)longClick:(UILongPressGestureRecognizer *)longGesture {

    if (longGesture.state == UIGestureRecognizerStateBegan) {
        // 菜單已經(jīng)打開(kāi)不需重復(fù)操作
        UIMenuController *menu=[UIMenuController sharedMenuController];
        if (menu.isMenuVisible)return;
        //如果要不收起鍵盤(pán)還需要復(fù)寫(xiě)nextResponder方法
        //        if ([textField isFirstResponder]) {
        //            textField.inputNextResponder = self;//關(guān)鍵代碼
        //        }else{
        //            [self becomeFirstResponder];
        //        }
          //注意要設(shè)置為第一響應(yīng)者
          [self becomeFirstResponder];
        UIMenuItem *copy = [[UIMenuItem alloc] initWithTitle:@"復(fù)制"action:@selector(copyItem:)];
        UIMenuItem *paste = [[UIMenuItem alloc] initWithTitle:@"粘貼" action:@selector(pasteItem:)];
        [menu setMenuItems:@[copy,paste]];

        [menu setTargetRect:self.bounds inView:self];
        [menu setMenuVisible:YES animated:YES];
       //如果復(fù)寫(xiě)nextResponder方法楼熄,還要在menu隱藏時(shí)忆绰,移除inputNextResponder
       // [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(menuWillHidden) name:UIMenuControllerWillHideMenuNotification object:nil];

    }
}

如果是可以輸入的控件需要在鍵盤(pán)彈起時(shí)還能復(fù)制等長(zhǎng)按操作,那么就要增加一個(gè)變量來(lái)保持自己的第一響應(yīng)者身份:

MATextView.h
@interface MATextView : UITextView
@property (nonatomic, weak) UIResponder *inputNextResponder;
@end

MATextView.m

@implementation MATextView
- (UIResponder *)nextResponder {
 if (_inputNextResponder != nil)
   return _inputNextResponder;
  else
    return [super nextResponder];
}
 
//在設(shè)置外部的responder后可岂,就不能執(zhí)行方法
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (self.inputNextResponder != nil) {
    return NO;
}
else {
    return [super canPerformAction:action withSender:sender];
}
}
@end

需要拷貝的自定義控件里错敢,必須設(shè)置為YES才能添加UIMenu

- (BOOL)canBecomeFirstResponder {
    return YES;
}

如果沒(méi)有實(shí)現(xiàn)本方法就只有自定義的item,如果實(shí)現(xiàn)了青柄,就是實(shí)現(xiàn)中的item

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    NSLog(@"%@", NSStringFromSelector(action));
    if (action == @selector(cut:)
        || action == @selector(copy:)
        || action == @selector(paste:) || action == @selector(copyItem:)|| action ==     @selector(pasteItem:)) {
        return YES; // YES ->  代表我們只監(jiān)聽(tīng) cut: / copy: / paste:方法
    }
    return NO; // 除了上面的操作伐债,都不支持
}

如下是照搬代碼供參考,如果添加了inputNextResponder還要將其置空:

- (void)copyBtnWillHidden{
    UIView *superView =  self.superview.superview.superview;
    KFChatToolView *toolView = [superView viewWithTag:kKF5ChatToolViewTag];
    if ([toolView isKindOfClass:[KFChatToolView class]]) {
            toolView.textView.inputNextResponder = nil;
    }
    self.chatMessageBackgroundView.highlighted = NO;
    [[NSNotificationCenter defaultCenter]removeObserver:self];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末致开,一起剝皮案震驚了整個(gè)濱河市峰锁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌双戳,老刑警劉巖虹蒋,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異飒货,居然都是意外死亡魄衅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)塘辅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)晃虫,“玉大人,你說(shuō)我怎么就攤上這事扣墩≌芤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵呻惕,是天一觀的道長(zhǎng)荆责。 經(jīng)常有香客問(wèn)我,道長(zhǎng)亚脆,這世上最難降的妖魔是什么做院? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上键耕,老公的妹妹穿的比我還像新娘寺滚。我一直安慰自己,他們只是感情好屈雄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布玛迄。 她就那樣靜靜地躺著,像睡著了一般棚亩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虏杰,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天讥蟆,我揣著相機(jī)與錄音,去河邊找鬼纺阔。 笑死瘸彤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的笛钝。 我是一名探鬼主播质况,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼玻靡!你這毒婦竟也來(lái)了结榄?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤囤捻,失蹤者是張志新(化名)和其女友劉穎臼朗,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蝎土,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡视哑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了誊涯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挡毅。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖暴构,靈堂內(nèi)的尸體忽然破棺而出跪呈,到底是詐尸還是另有隱情,我是刑警寧澤丹壕,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布庆械,位于F島的核電站,受9級(jí)特大地震影響菌赖,放射性物質(zhì)發(fā)生泄漏缭乘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堕绩。 院中可真熱鬧策幼,春花似錦、人聲如沸奴紧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)黍氮。三九已至唐含,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沫浆,已是汗流浹背捷枯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留专执,地道東北人淮捆。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像本股,于是被迫代替她去往敵國(guó)和親攀痊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理拄显,服務(wù)發(fā)現(xiàn)苟径,斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 聊天控制器(ChatViewController)界面搭建 14.聊天界面-工具條排版 1)搭建界面 添加聊天控制...
    夜空已沉寂閱讀 3,029評(píng)論 0 4
  • 1.自定義控件 a.繼承某個(gè)控件 b.重寫(xiě)initWithFrame方法可以設(shè)置一些它的屬性 c.在layouts...
    圍繞的城閱讀 3,391評(píng)論 2 4
  • 廢話不多說(shuō)凿叠,直接上干貨 ---------------------------------------------...
    小小趙紙農(nóng)閱讀 3,361評(píng)論 0 15
  • 情緒是一種表象化的人格表現(xiàn)盒件,可以從側(cè)面反映出人的素質(zhì)和氣質(zhì)蹬碧。 一、情緒即人格氣質(zhì) 一個(gè)情緒控制極佳的人炒刁,情緒表現(xiàn)得...
    陸河閱讀 556評(píng)論 1 3