For investors
股價:
5.36 美元 %For investors
股價:
5.36 美元 %認(rèn)真做教育 專心促就業(yè)
先聲明一下,下面用到的方法是本人已經(jīng)過實際運行達(dá)到預(yù)期效果后的總結(jié),諸位在參考時可少走一些彎路,放心嘗試。
我們所要達(dá)到的預(yù)期效果是,用UIWebView加載網(wǎng)頁,長按某單詞后彈出我們自定義的菜單欄,不顯示系統(tǒng)本身自帶的,點擊某一菜單進(jìn)行對應(yīng)的處理。
首先,先自定義需要的菜單欄
[cpp]
UIMenuController *menuController = [UIMenuController sharedMenuController];
UIMenuItem *menuItemCiYi = [[UIMenuItem alloc] initWithTitle:@"看詞義" action:@selector(ciYi:)];
UIMenuItem *menuItemSound = [[UIMenuItem alloc] initWithTitle:@"聽發(fā)音" action:@selector(listeningSound:)];
UIMenuItem *menuItemShengCi = [[UIMenuItem alloc] initWithTitle:@"加入生詞本" action:@selector(addWord:)];
NSArray *mArray = [NSArray arrayWithObjects:menuItemCiYi,menuItemSound,menuItemShengCi, nil];
[menuItemCiYi release];
[menuItemSound release];
[menuItemShengCi release];
[menuController setMenuItems:mArray];
可以看出,每個菜單對應(yīng)的操作方法名,至于這段代碼寫在什么位置,稍后再說,這也是需要額外注意的地方。
自定義一個繼承UIWebView的控件CustomWebView,手動處理某一菜單對應(yīng)的操作
在CustomWebView.m中
[cpp]
//
// CustomWebView.m
// LrcWebViewTest
//
// Created by Andy on 12-6-20.
// Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//
#import "CustomWebView.h"
@implementation CustomWebView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
-(void)awakeFromNib{
}
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
if(action == @selector(ciYi:) || action == @selector(listeningSound:) ||action == @selector(addWord:)){
return YES;
}
return NO;
}
-(IBAction)ciYi:(id)sender;{
NSLog(@"ciYi");
}
-(IBAction)listeningSound:(id)sender{
NSLog(@"listeningSound");
}
-(IBAction)addWord:(id)sender{
NSLog(@"addWord");
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
@end
通過重寫-(BOOL)canPerformAction:(SEL)action withSender:(id)sender函數(shù),告知菜單欄哪些菜單可以顯示。
然后就是討論這個自定義的菜單欄,應(yīng)該寫在什么位置。#
之前是寫在CustomWebView.m的initWithFrame方法中,但是長按后菜單欄一直沒有出來,后來發(fā)現(xiàn),如果是通過xib添加此控件的話,通過斷點跟蹤就可發(fā)現(xiàn),它是不會執(zhí)行initWithFrame方法的,所以那段代碼應(yīng)該寫在-(void)awakeFromNib方法中,如果是通過代碼添加的,就應(yīng)該寫在initWithFrame方法中,否則不執(zhí)行添加菜單的操作。
還有一點是,剛剛在嘗試過程中發(fā)現(xiàn),如果將添加菜單欄的代碼寫在添加UIWebView控件界面的ViewDidLoad中也可以達(dá)到對應(yīng)的效果,也許你會問,這樣做的話是改變了那個界面的菜單欄,會不會那個界面中彈出的菜單欄都是同一個樣子?答案是不會的,因為通過重寫
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender這個方法可以篩選出需要的菜單項,而自定義的WebView中已經(jīng)重寫了這個方法,所以在webview中彈出的菜單是需要的菜單項,在其他控件中例如TextField控件,彈出的依舊會是系統(tǒng)默認(rèn)的菜單項,只是出于程序可讀性,可維護(hù)性考慮,最好在自定義的控件中修改菜單性,單獨封裝起來。
【免責(zé)聲明】本文部分系轉(zhuǎn)載,轉(zhuǎn)載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點和對其真實性負(fù)責(zé)。如涉及作品內(nèi)容、版權(quán)和其它問題,請在30日內(nèi)與聯(lián)系我們,我們會予以更改或刪除相關(guān)文章,以保證您的權(quán)益!