UITextView自定義菜單選項(xiàng)(剛剛爬出坑來(lái))

前言

今天有一個(gè)小需求,就是在UITextView里面長(zhǎng)按顯示菜單那里面去自定義菜單,不用系統(tǒng)默認(rèn)顯示的投储。本來(lái)一個(gè)很好實(shí)現(xiàn)的小功能衡招,網(wǎng)上一查有很多篱昔。但是我按照人家給的思路去做了之后發(fā)現(xiàn),新增的自定義菜單是有了始腾,但是系統(tǒng)的還是沒(méi)有去掉州刽。結(jié)果傻眼了。然后摸索了一陣子浪箭,突發(fā)奇想的就換了個(gè)思路搞好了∷胍危現(xiàn)在想一下,確實(shí)自己很二了奶栖。

正文

API分析

顯示菜單說(shuō)白了就是一個(gè)VC匹表,用于顯示咱們這種長(zhǎng)按特殊需求的小界面门坷。
進(jìn)入U(xiǎn)IMenuController的API你會(huì)發(fā)現(xiàn)這是一個(gè)單例類(lèi),至于怎么發(fā)現(xiàn)的袍镀,看下構(gòu)造方法就知道了:

+ (UIMenuController *)sharedMenuController;

就這么一個(gè)構(gòu)造方法拜鹤,而且你想一下,菜單顯示這個(gè)確實(shí)是單例實(shí)現(xiàn)的最佳范例呀流椒,不可能同時(shí)在一個(gè)Windows出現(xiàn)敏簿。
UIMenuController里面的內(nèi)容很少,基本都能看懂宣虾。不懂得百度一下也就知道惯裕,我也不多說(shuō)了。
UIMenuController只是一個(gè)外表顯示绣硝,一個(gè)VC構(gòu)建了一個(gè)空的界面蜻势,里面有什么就需要你自己去填充了,當(dāng)然不可能阿貓阿狗都能填充鹉胖,這時(shí)候就需要UIMenuItem了握玛。
UIMenuItem的API就只有一個(gè)方法

NS_CLASS_AVAILABLE_IOS(3_2) __TVOS_PROHIBITED @interface UIMenuItem : NSObject 

- (instancetype)initWithTitle:(NSString *)title action:(SEL)action NS_DESIGNATED_INITIALIZER;

@property(nonatomic,copy) NSString *title;
@property(nonatomic)      SEL       action;

@end

熟悉不,和手勢(shì)的創(chuàng)建很像吧(本來(lái)想說(shuō)和UITabBarItem很像甫菠,但是仔細(xì)一想形式很像挠铲,作用很像,但是創(chuàng)建方法他們兩個(gè)有些不合適)寂诱。
這個(gè)方法就是給一個(gè)標(biāo)題一個(gè)事件拂苹,沒(méi)了√等鳎灰常簡(jiǎn)單有木有瓢棒。

第一次實(shí)踐進(jìn)行

然后我就按照我搜索的網(wǎng)上的各位人士給的方法去干:

- (void)viewDidLoad {
    [super viewDidLoad];
    //設(shè)置輸入視圖
    self.textView = [[UITextView alloc]initWithFrame:CGRectMake(10, 20, CGRectGetWidth(self.view.frame) - 20, CGRectGetHeight(self.view.frame) - 40)];
    self.textView.layer.borderWidth = 2;
    self.textView.layer.borderColor = [UIColor redColor].CGColor;
    self.textView.delegate = self;
    [self.view addSubview:self.textView];
    
    //設(shè)置菜單
    UIMenuItem *menuItem = [[UIMenuItem alloc]initWithTitle:@"響應(yīng)菜單" action:@selector(selfMenu:)];
    UIMenuController *menuController = [UIMenuController sharedMenuController];
    [menuController setMenuItems:[NSArray arrayWithObject:menuItem]];
}

然后,使用一個(gè)UIResponder類(lèi)特意聲明去處理的一個(gè)方法丘喻,響應(yīng)者類(lèi)可以實(shí)現(xiàn)這個(gè)方法脯宿,以根據(jù)當(dāng)前的上下文顯示或移除編輯菜單上的命令。(摘抄過(guò)來(lái)的泉粉,我感覺(jué)說(shuō)的挺容易理解的)连霉。

//隱藏系統(tǒng)菜單的方法
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    //允許顯示
    if (action == @selector(selfMenu:)) {
        return YES;
    }
    //其他不允許顯示
    return NO;
}

理論上,碼上這些搀继,應(yīng)該是可以隱藏系統(tǒng)的菜單顯示自定義的菜單了窘面,然后我去運(yùn)行:

運(yùn)行結(jié)果

這是怎么了?fuck the world叽躯。不是應(yīng)該是只顯示自定義的菜單了嗎财边,系統(tǒng)的不是應(yīng)該在UIResponder那個(gè)方法里面隱藏了嗎?剛開(kāi)始我有點(diǎn)懷疑我搜到的答案不對(duì)点骑,結(jié)果又搜了好幾個(gè)都是這樣酣难。然后自己鼓搗一會(huì)谍夭,結(jié)果還是好的,世界總是美好的憨募。

正確做法

繼承UITextView紧索,把實(shí)現(xiàn)自定義菜單代碼放在里面

#import "MyTextView.h"

@implementation MyTextView

- (instancetype)initWithFrame:(CGRect)frame{

    self = [super initWithFrame:frame];
    if (self) {
        UIMenuItem *menuItem = [[UIMenuItem alloc]initWithTitle:@"響應(yīng)事件" action:@selector(selfMenu:)];
        UIMenuController *menuController = [UIMenuController sharedMenuController];
        [
         menuController
         setMenuItems:[NSArray arrayWithObject:menuItem]];
        [menuController setMenuVisible:NO];
    }
    return self;
}

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(selfMenu:)) {
        return YES;
    }
    return NO;
}

//自定義的事件
- (void)selfMenu:(id)sender{
    
    
}
@end

然后,使用自定義的UITextView

- (void)viewDidLoad {
    [super viewDidLoad];
    //設(shè)置輸入視圖
    self.textView = [[MyTextView alloc]initWithFrame:CGRectMake(10, 20, CGRectGetWidth(self.view.frame) - 20, CGRectGetHeight(self.view.frame) - 40)];
    self.textView.layer.borderWidth = 2;
    self.textView.layer.borderColor = [UIColor redColor].CGColor;
    self.textView.delegate = self;
    [self.view addSubview:self.textView];
    
}

運(yùn)行:

運(yùn)行結(jié)果

正常運(yùn)行有木有菜谣,我感覺(jué)出問(wèn)題的原因應(yīng)該是和那個(gè)UIResponder的方法有問(wèn)題珠漂,因?yàn)槲以诮缑嫔线M(jìn)行的一切手勢(shì)事件他都會(huì)攔截的。所以直接在UITextView可能造成問(wèn)題尾膊,只是個(gè)人猜測(cè)媳危,大神知道了請(qǐng)告訴小弟呀。

結(jié)語(yǔ)

這也是一個(gè)小坑吧冈敛。估計(jì)會(huì)有人像我一樣遇到待笑,所以寫(xiě)在這,如果在遇到這個(gè)問(wèn)題的時(shí)候看到我這篇小文章抓谴,希望對(duì)你有幫助暮蹂。

備注:本文是自己寫(xiě)的一些理解,可能有不對(duì)之處癌压。如有請(qǐng)您能指出來(lái)仰泻,我馬上去校隊(duì)修改。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末措拇,一起剝皮案震驚了整個(gè)濱河市我纪,隨后出現(xiàn)的幾起案子慎宾,更是在濱河造成了極大的恐慌丐吓,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趟据,死亡現(xiàn)場(chǎng)離奇詭異券犁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)汹碱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)粘衬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人咳促,你說(shuō)我怎么就攤上這事稚新。” “怎么了跪腹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵褂删,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我冲茸,道長(zhǎng)屯阀,這世上最難降的妖魔是什么缅帘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮难衰,結(jié)果婚禮上钦无,老公的妹妹穿的比我還像新娘。我一直安慰自己盖袭,他們只是感情好失暂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鳄虱,像睡著了一般趣席。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上醇蝴,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天宣肚,我揣著相機(jī)與錄音,去河邊找鬼悠栓。 笑死霉涨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惭适。 我是一名探鬼主播笙瑟,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼癞志!你這毒婦竟也來(lái)了往枷?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凄杯,失蹤者是張志新(化名)和其女友劉穎错洁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體戒突,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屯碴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膊存。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片导而。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖隔崎,靈堂內(nèi)的尸體忽然破棺而出今艺,到底是詐尸還是另有隱情,我是刑警寧澤爵卒,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布虚缎,位于F島的核電站,受9級(jí)特大地震影響技潘,放射性物質(zhì)發(fā)生泄漏遥巴。R本人自食惡果不足惜千康,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铲掐。 院中可真熱鬧拾弃,春花似錦、人聲如沸摆霉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)携栋。三九已至搭盾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間婉支,已是汗流浹背鸯隅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留向挖,地道東北人蝌以。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像何之,于是被迫代替她去往敵國(guó)和親跟畅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • 內(nèi)容來(lái)自于 iOS文檔中 About Text Handling in iOS 部分 ios平臺(tái)提供了顯示及編輯文...
    縱橫而樂(lè)閱讀 6,768評(píng)論 2 21
  • 今天星期五……天氣不錯(cuò)溶推, 白天餓了一整天徊件, 下午開(kāi)攤時(shí)在樓下猛得喝了滿(mǎn)滿(mǎn)的幾碗粥……(讓你不賺錢(qián)……先餓你...
    南瓜南生閱讀 73評(píng)論 0 0
  • 最近虱痕,開(kāi)始早起。每天早上6:20起床舰褪,不在像之前那樣急匆匆的洗漱皆疹,可以不緊不慢的起床,隔天敷個(gè)面膜占拍,隨后做點(diǎn)簡(jiǎn)單的...
    漫不經(jīng)心張小漫閱讀 430評(píng)論 0 2
  • 周五中午上街吃飯時(shí),旁邊一個(gè)賣(mài)小倉(cāng)鼠的把女兒深深吸引了捎迫,她午飯都沒(méi)心思好好吃晃酒。 “媽媽?zhuān)}(cāng)鼠好機(jī)...
    墨玉蓮華閱讀 192評(píng)論 0 1