NSClassFromString 和 遍历UIView获取她所在的UIViewController的tips
一、NSClassFromString是NSObjCRuntime.h的方法
FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString *aClassName);
Description:Obtains a class by name.The name of a class.Parameters:aClassName The name of a classReturns:The class object named by aClassName , or nil if no class by that name is currently loaded
通过NSClassFromString创建类,可以使用里氏代换原则区创建子类
假设有一个类名为:DBHelper
一般创建她的Instance:
[[DBHelper alloc] init];
但是如果用NSClassFromString创建实体的话:
NSString * className = @"DBHelper";
Class class = NSClassFromString(className);
if (class)
{
DBHelper * dbHelper = class.new;
}
或者:
NSString * className = @"DBHelper";
id dbHelperObj = [[NSClassFromString(className) alloc] init];
这样写很明显的好处:
1.使用的时候,不必担心因为类不存在而报错,因为返回空的时候是nil,所以不会导致程序崩溃
2.方便使用里氏代换原则的模式
二、在自定义的UIView(hex)的控件类里面,如何获取她所在当前的UIViewController的小技巧
1.首先,确保你创建的类继承自UIView
2.其次,我们都知道大部分的UIKit类继承自UIResponder。
啥是UIResponder?
UIResponder中有很多我们耳熟能详的几种方法:
1》nextResponder
- (UIResponder * _Nullable)nextResponder Description: Returns the receiver's next responder, or nil if it has none. The next object in the responder chain to be presented with an event for handling. Returns: The next object in the responder chain to be presented with an event for handling.
2》响应链中的操作
- (BOOL)canBecomeFirstResponder; // default is NO - (BOOL)becomeFirstResponder; - (BOOL)canResignFirstResponder; // default is YES - (BOOL)resignFirstResponder; - (BOOL)isFirstResponder;
3》touch事件
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; - (void)touchesCancelled:(nullable NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; - (void)touchesEstimatedPropertiesUpdated:(NSSet * _Nonnull)touches NS_AVAILABLE_IOS(9_1);
etc.
3.所以我们用到UIResponder中nextResponder方法
for(UIView * view = self; view; view = view.superview)
{
UIResponder * nextResponder = [view nextResponder];
if ([nextResponder iskindOfClass:[UIViewController class]])
{
return (UIViewController *)nextResponder;
}
}
其实,还有回到跟视图的方法,你们可以试试写出来
NSClassFromString 和 遍历UIView获取她所在的UIViewController的tips的更多相关文章
- 【原创】ABAP根据文件路径获取文件所在目录(续)
在上一篇文章<ABAP根据文件路径获取文件所在目录>中,我主要的思路是采用 “SPLIT dobj AT sep INTO TABLE result_tab” 句型将文件全路径按分隔符“\ ...
- ionic 获取手机所在位置
之前项目中需要使用到定位功能,前边的文章提到的坐标位置是有问题的,是国际坐标,国内的环境使用google地图会出现问题,所以需要使用国内的地图进行坐标解析,因为国内和国外的坐标体系不一致,需要通过转换 ...
- C#: 获取执行程序所在路径和启动资源管理器
一. 获取执行程序所在路径 1.获取和设置当前目录的完全限定路径. string str = System.Environment.CurrentDirectory; //获取的是主程序目录,线程启 ...
- delphi根据进程PID获取程序所在路径的函数(用OpenProcess取得句柄,用GetModuleFileNameEx取得程序名)
uses psapi; {根据进程PID获取程序所在路径的函数}function GetProcessExePath(PID: Cardinal): string;varpHandle: THandl ...
- 编程乐趣:C#获取日期所在周、月份第一和最后一天
原文:编程乐趣:C#获取日期所在周.月份第一和最后一天 写了个小功能,需要用到以周为时间段,于是写了个获取周第一和最后一天的方法,获取月份的第一和最后一天就比较简单了.代码如下: public cla ...
- php根据IP获取IP所在城市
转载出处:php实现根据IP地址获取其所在省市的方法 //根据现有IP地址获取其地理位置(省份,城市等)的方法 function GetIpLookup($ip = ''){ if(empty($ip ...
- Android获取定位权限,获取设备所在的经纬度
转载请标明出处:http://www.cnblogs.com/tangZH/p/8969898.html 前言: 有时候我们仅仅是想要获取设备所在的经纬度,那么直接调用Android相关的api就可 ...
- shell脚本中获取当前所在目录地址
shell脚本中获取当前所在目录如下 #!/bin/bash work_path=$() cd ${work_path} work_path=$(pwd) cd ${work_path}/src
- Jquery遍历之获取子级元素、同级元素和父级元素
Jquery遍历之获取子级元素.同级元素和父级元素 Jquery的遍历,其实就当前位置的元素相对于其他元素的位置的关系进行查找或选取HTML元素.以某项选择开始,并沿着这条线进行移动,或向上(父级). ...
随机推荐
- 【python游戏编程之旅】第七篇---pygame中的冲突检测技术
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 上一个博客我们一起学习了pygame中的Sprite模块和如何加载动画:http://www.cnblogs ...
- nios II--实验6——串口软件部分
软件开发 首先,在硬件工程文件夹里面新建一个software的文件夹用于放置软件部分:打开toolsàNios II 11.0 Software Build Tools for Eclipse,需要进 ...
- mysql创建触发器
触发器语句只有一句话 可以省略begin和end CREATE trigger `do_praise` after insert on praise for each row update post ...
- 【python】实践中的总结——列表『持续更新中』
2016-04-03 21:02:50 python list的遍历 list[a::b] #从list[a] 开始,每b个得到一个元组,返回新的list 举个例子: >>> l ...
- 59-chown 简明笔记
改变文件的所有者或与文件相关联的组 chown [options] owner file-list chown [options] owner: group file-list chown [opti ...
- 提高你的数据库编程效率:Microsoft CLR Via Sql Server
你还在为数据库编程而抓狂吗?那些恶心的脚本拼接,低效的脚本调试的日子将会与我们越来越远啦.现在我们能用支持.NET的语言来开发数据库中的对象,如:存储过程,函数,触发器,集合函数已及复杂的类型.看到这 ...
- 【BZOJ 1455】罗马游戏
左偏树模板 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...
- ASP.Net Web Form<一> aspx文件编译及呈现
对比复习下JSP 1.jsp的本质是Servlet ,会在第一次被访问时会被翻译成一个类文件,从此对这个页面的访问都是由这个类文件执行后进行输出. aspx 本质是IHttpHandler 2.jsp ...
- 网页提示[Not allowed to load local resource: file://XXXX]错误
网页通过http 访问时, 点击打开文件的link.在Chrome 中会报 Not allowed to load local resource: file// XXXX 的错误 <!--Add ...
- html 语义化 资料
HTML: The Living Standard 理解HTML语义 什么是HTML语义化 为什么要语义化 写HTML代码时就注意什么 HTML 5的革新——语义化标签(一) header元素 foo ...