博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(iPhone/iPad开发)在UIWebView中自定义菜单栏
阅读量:7076 次
发布时间:2019-06-28

本文共 2374 字,大约阅读时间需要 7 分钟。

先声明一下,下面用到的方法是本人已经过实际运行达到预期效果后的总结,诸位在参考时可少走一些弯路,放心尝试。

我们所要达到的预期效果是,用UIWebView加载网页,长按某单词后弹出我们自定义的菜单栏,不显示系统本身自带的,点击某一菜单进行对应的处理。

首先,先自定义需要的菜单栏

UIMenuController *menuController = [UIMenuController sharedMenuController];
    UIMenuItem *menuItemCiYi = [[UIMenuItem alloc] initWithTitle:
@"
看词义
" action:@selector(ciYi:)];
    UIMenuItem *menuItemSound = [[UIMenuItem alloc] initWithTitle:
@"
听发音
" 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中

//
//
  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方法中,但是长按后菜单栏一直没有出来,后来发现,如果是通过xib添加此控件的话,通过断点跟踪就可发现,它是不会执行initWithFrame方法的,所以那段代码应该写在-(void)awakeFromNib方法中,如果是通过代码添加的,就应该写在initWithFrame方法中,否则不执行添加菜单的操作。

还有一点是,刚刚在尝试过程中发现,如果将添加菜单栏的代码写在添加UIWebView控件界面的ViewDidLoad中也可以达到对应的效果,也许你会问,这样做的话是改变了那个界面的菜单栏,会不会那个界面中弹出的菜单栏都是同一个样子?答案是不会的,因为通过重写

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender这个方法可以筛选出需要的菜单项,而自定义的WebView中已经重写了这个方法,所以在webview中弹 出的菜单是需要的菜单项,在其他控件中例如TextField控件,弹出的依旧会是系统默认的菜单项,只是出于程序可读性,可维护性考虑,最好在自定义的 控件中修改菜单性,单独封装起来。

转载地址:http://nucml.baihongyu.com/

你可能感兴趣的文章
如何编写一个可升级的智能合约
查看>>
Canvas&Paint 知识梳理(5) Paint#setShader
查看>>
我的《机器学习实战》读书笔记(1)
查看>>
美景听听Ai语音导游,助力华为荣耀PLAY手机发布
查看>>
js原型 && 继承
查看>>
SpringBoot使用LomBok
查看>>
IM即时通讯:如何跳出传统思维来设计聊天室架构?
查看>>
阿里云MaxCompute携手华大基因打造精准医疗应用云平台,十万基因组计算成本降低至1000美金以内...
查看>>
阿里云 ESS 弹性伸缩服务新功能来袭,更全面、更自动化的使用体验
查看>>
java反射技术
查看>>
javascript设计模式 之 2 策略模式
查看>>
新手学UI设计应该怎样入门?
查看>>
ReentrantLock的形象描述
查看>>
Spring-Mybatis 读写分离
查看>>
XSS AND CSRF
查看>>
GPUImage之摄像篇
查看>>
Spring Cloud Spring Boot mybatis 企业分布式微服务云(八)服务容错保护(Hystrix依赖隔离)【Dalston版】...
查看>>
iOS Url Scheme实现APP间通信、分享
查看>>
Hive如何处理小文件问题?
查看>>
转型web前端工程师怎样学才能拿高薪?
查看>>