
課程咨詢: 400-996-5531 / 投訴建議: 400-111-8989
認真做教育 專心促就業(yè)
先聲明一下,下面用到的方法是本人已經過實際運行達到預期效果后的總結,諸位在參考時可少走一些彎路,放心嘗試。
我們所要達到的預期效果是,用UIWebView加載網頁,長按某單詞后彈出我們自定義的菜單欄,不顯示系統(tǒ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];
可以看出,每個菜單對應的操作方法名,至于這段代碼寫在什么位置,稍后再說,這也是需要額外注意的地方。
自定義一個繼承UIWebView的控件CustomWebView,手動處理某一菜單對應的操作
在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函數,告知菜單欄哪些菜單可以顯示。
然后就是討論這個自定義的菜單欄,應該寫在什么位置。#
之前是寫在CustomWebView.m的initWithFrame方法中,但是長按后菜單欄一直沒有出來,后來發(fā)現,如果是通過xib添加此控件的話,通過斷點跟蹤就可發(fā)現,它是不會執(zhí)行initWithFrame方法的,所以那段代碼應該寫在-(void)awakeFromNib方法中,如果是通過代碼添加的,就應該寫在initWithFrame方法中,否則不執(zhí)行添加菜單的操作。
還有一點是,剛剛在嘗試過程中發(fā)現,如果將添加菜單欄的代碼寫在添加UIWebView控件界面的ViewDidLoad中也可以達到對應的效果,也許你會問,這樣做的話是改變了那個界面的菜單欄,會不會那個界面中彈出的菜單欄都是同一個樣子?答案是不會的,因為通過重寫
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender這個方法可以篩選出需要的菜單項,而自定義的WebView中已經重寫了這個方法,所以在webview中彈出的菜單是需要的菜單項,在其他控件中例如TextField控件,彈出的依舊會是系統(tǒng)默認的菜單項,只是出于程序可讀性,可維護性考慮,最好在自定義的控件中修改菜單性,單獨封裝起來。
【免責聲明】本文部分系轉載,轉載目的在于傳遞更多信息,并不代表本網贊同其觀點和對其真實性負責。如涉及作品內容、版權和其它問題,請在30日內與聯系我們,我們會予以更改或刪除相關文章,以保證您的權益!