ios 有很多私有的类和函数,令人忧伤的是这些官方都不给用,对于一个开发者来说这是相当纠结的一件事。但如果你知道这个私有方法怎么实现的话呢?完全可以自己改写这些私有类和方法,下面以改写UIVebView这个类的一些方法作为例子来说明一下。
UIWebView 了view结构大概如下:
UIWebView:
_UIWebViewScrollView(其实是scrollview)
多个UIImageView
UIWebBrowserView:
UIWebBrowserViewMinusAccessoryView
UIWebBrowserView 和 _UIWebViewScrollView都是我们不是能直接用的类,UIWebBrowserView下的UIWebBrowserViewMinusAccessoryView直接
的控制着webkit键盘的inputAccessoryView,即图中键盘上面这一栏。假设我们要去掉webkit键盘上面这一栏,自定义为我们自己的样式,应该怎么做呢?
首先要我们要在uiwebview对象中找到UIWebBrowserView的对象,直接遍历就Ok
1 /**
2 * 找到UIWebBrowserView的对象
3 */
4 UIView *browserView = nil;
5 for (UIView *subview in [[self.subviewsobjectAtIndex:0] subviews]) {
6 if ([NSStringFromClass([subview class]) hasPrefix:@"UIWebBrowserView"]) {
7 browserView = subview;
8 break;
9 }
10 }
11 // 拷贝 browserView 中的UIWebBrowserViewMinusAccessoryView
12 Class newClass = objc_duplicateClass(browserView, "UIWebBrowserViewMinusAccessoryView", 0);
13
14 // 编写自己的实现方法accessoryViewImp
15 IMP accessoryViewImp = [self methodForSelector:@selector(emptyInputAccessoryView)];
16
17 // 替换系统的inputAccessoryView方法 ,@@: 是type coding ,下面会讲到
18 class_replaceMethod(newClass, @selector(inputAccessoryView), accessoryViewImp, "@@:");
19
20 //注册类
21 objc_registerClassPair(newClass);
22
23 //重新设计browserView对象的类
24 object_setClass(browserView, newClass);
25
26 //载入自己的inputAccessoryView
27 [browserView reloadInputViews];
一个Object-c的方法实现类型IMP 至少有两个参数self 和 _cmd,如下
1 // IMP 类型的自定义方法
2 id emptyInputAccessoryView(id self , SEL _cmd /*, NSString *str 你的其它参数 */)
3 {
4 UIView *view = [[[UIView alloc] init] autorelease];
5 //自定义你自己的view
6 return view;
7 }
class_replaceMethod方法的最后一个参数是 type encodings ,用来标识IMP函数实现的返回值与参数,其中,
第一个字段@表示返回值是id类型
第二个字段@表示self参数
第三个字段:表示_cmd参数
第四个字段开始为用户定义的参数类型对应的encodings。
具体的type encodings 可以参考apple官方提供的 type encodings 对应表:
Code Meaning
c A char
i An int
s A short
l A long
l is treated as a 32-bit quantity on 64-bit programs.
q A long long
C An unsigned char
I An unsigned int
S An unsigned short
L An unsigned long
Q An unsigned long long
f A float
d A double
B A C++ bool or a C99 _Bool
v A void
* A character string (char *)
@ An object (whether statically typed or typed id)
# A class object (Class)
: A method selector (SEL)
[array type] An array
{name=type...} A structure
(name=type...) A union
bnum A bit field of num bits
^type A pointer to type
? An unknown type (among other things, this code is used for function pointers)
分享到:
相关推荐
Objective-C语言将决定尽可能的从编译和链接时推迟到运行时。只要有可能,Objective-C总是使用...本文档将具体介绍NSObject类以及Objective-C程序是如何和运行时系统交互的。特别地,本文档还给出来怎样在运行时动态地加
Object-C语言基础: 学习Object-C语言的基本语法和特性,了解Objective-C编程范式和iOS开发规范。 列表选择功能实现: 掌握实现iOS应用中列表选择功能的方法和技巧,包括列表的展示、数据的加载和选择状态的管理等...
Object-C语言教程 Object-C语言教程 Object-C语言教程 Object-C语言教程
这篇文章为您呈现了一份详尽的Object-C语言学习资源概览,旨在帮助初学者和经验丰富的开发者系统地学习Object-C编程,并通过实践案例和项目资源提升实际编程能力。 文章首先聚焦于Object-C语言教程,这是学习Object...
Object-Oriented Programming with Object-C Object-C 进阶书籍---面向对象
Object-C语言教程:Objective-C 简介
7. Object-C的description方法 8. Object-C的异常处理 9. id类型 10. 类的继承 11. 动态判定与选择器 12. 类别Category 13. 协议@protocol 14. 内存管理 15. 常用的类型 16. 写入和读取属性 17. 对象的...
Object-C_在iOS上使用Object-C进行RSA算法的加密+解密实现
在使用"MJExtension"进行JSON转模型时,开发者需要定义对应的模型类,并通过"MJExtension"提供的API来进行映射配置。开发者只需简单地设置一些属性和方法,就能够实现JSON数据和模型对象之间的转换,极大地简化了...
object-c基础教程object-c基础教程object-c基础教程
Object-C语言教程0220.zipObject-C语言教程0220.zipObject-C语言教程0220.zipObject-C语言教程0220.zipObject-C语言教程0220.zipObject-C语言教程0220.zipObject-C语言教程0220.zip
Objective-C支持类、对象、继承、封装、多态等面向对象的特性,同时它还具有动态运行时特性,可以在运行时修改类、对象的结构和行为。此外,Objective-C采用动态绑定,方法的调用在运行时确定,使得程序更加灵活。在...
Object-C语言实现列表选择项目源码.zipObject-C语言实现列表选择项目源码.zipObject-C语言实现列表选择项目源码.zip
Object-C期末复习资料,包含多道题目助力期末复习,成功考试过关
Object-C_使用object-c实现的iOS运行进度视图
EventBusObject-CVersion(EventBus的Object-C语言版本)
【Object-C】object-c入门基础 object-c入门基础 说明:object-c入门基础 object-c入门基础 (Object-c Start Basics) 文件列表: object-c入门基础.doc (27648, 2014-10-29) 【Object-C】object-c入门基础 object-c...