首先感谢小易童鞋,这里自己也整理下这些容易忘记的代码
设置导航栏的背景颜色用barTintColor
self.navigationBar.barTintColor = [UIColor colorWithRed:3/255.0f green:101/255.0f blue:100/255.0f alpha:1.0f] ;
获取的.plist文件:
//1.从本地文件中读取数据(在实际项目开发中在这写网络请求) // 获取文件本地的路径 NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"json"]; // 把本地数据读取出来,不需要任何转换,就是二进制数据 NSData *jsonData = [[NSData alloc] initWithContentsOfFile:filePath];
NSString的字符串转换成的NSData类型的数据:
// NSString字符串转换成NSData类型的数据 NSData *jsondata = [result dataUsingEncoding:NSUTF8StringEncoding] ; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsondata options:NSJSONReadingMutableContainers error:nil] ;
获取文本的高度:
// Label中文字的大小默认是18 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
WeiBoModel *weiboModel = _dataList[indexPath.row] ; NSString *textString = weiboModel.text ; CGSize size = [textString sizeWithFont:[UIFont systemFontOfSize:18] constrainedToSize:CGSizeMake(kScreenWidth, 1000)] ; return size.height +20;
}
设置图片拉伸:
// 设置图片拉伸 UIImage *bgImage = [UIImage imageNamed:@"userinfo_shadow_pic.png"];
_bgImageView.image = [bgImage stretchableImageWithLeftCapWidth:15 topCapHeight:15];
设置图片圆角:
// 设置圆角 _userImageView.layer.cornerRadius = 25;
_userImageView.layer.masksToBounds = YES;
设置点击细胞然后不留下点击的痕迹:
// 设置没有痕迹 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES] ;
}
设置按钮中图片和文本的位置
button.imageEdgeInsets = UIEdgeInsetsMake(0, -100, 0, 0) ;
button.titleEdgeInsets = UIEdgeInsetsMake(0, -100, 0, 0) ;
延迟调用
// 延迟两秒钟调用yanchiAction方法 [self performSelector:@selector(yanchiAction) withObject:nil afterDelay:0.2] ;
刷新UICollectionView视图
[cell setNeedsLayout] ;
设置内填充
self.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) ;
设置tabBarView的标签栏没有内填充效果
self.automaticallyAdjustsScrollViewInsets = NO ;
判断字符串是否的开头
if([context hasPrefix:@"@"]) ;
请求数据从控制台打印成数据类型的数据方便进行JSON解析
po operation.responseString
禁止滑动视图滑动
scrollView.scrollEnabled = NO;
设置超出父视图部分不减切
_scrollView.clipsToBounds = NO ;
取消的UIScrollView的弹性效果
scrollView.bounces = NO;
滚动型禁止滑动
scrollView.scrollEnabled = YES;
判断点击的是哪个视图,返回值是个视图
tap.view.tap
这是的tableView没有默认的分割线
self.separatorStyle = NO ;
子视图超过父视图点击没反应
(注意:如果父视图是UIScrollView中,需要设置self.bgScrollView.clipsToBounds = NO ;,因为UIScrollView中默认会进行裁剪,会导致超出的部分没有了)
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { CGPoint hitPoint = [self.cardView.dayRateHelp convertPoint:point fromView:self]; if ([self.cardView.dayRateHelp pointInside:hitPoint withEvent:event]) return self.cardView.dayRateHelp; return [super hitTest:point withEvent:event];
}
用KVC修改UIPageControl的选中图片和默认图片(系统默认是不允许修改的)
[self.pageControl setValue:currentImage forKey:@"_currentPageImage"];
[self.pageControl setValue:pageImage forKey:@"_pageImage"];
清除文本视图按钮
textField.clearButtonMode = UITextFieldViewModeWhileEditing;
点击单元格不留下点击的痕迹
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES] ;
}
设置单元格选中的样式(无样式)
cell.selectionStyle = UITableViewCellSelectionStyleNone ;
设置标签栏的选种文字和图片颜色
self.tabBar.tintColor = [UIColor redColor] ;
故事版创建静态单元格,注意创建的UITableViewControl文件的.m文件中有部分自动创建的代码时需要删除的,如果是集成于baseTableViewControl也要删除代码
// 获取故事版 UIStoryboard *board = [UIStoryboard storyboardWithName:@"Main" bundle:nil];// 获取视图 MyTableViewController *myView = [board instantiateViewControllerWithIdentifier:@"MyID"] ;
判断一个字典里是否有某个关键
if([[dic allKeys]containsObject:@"key"])
随机数
long price = arc4random()%10*1000 ;
刷新视图
[label setNeedsDisplay] ;
延迟几秒钟执行
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0f];
去掉细胞的分割线(如果是用厦门国际银行做的,右边也有这个属性,设置为无即可)
tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
取消单元格选中效果
tableView.selectionStyle = UITableViewCellSelectionStyleNone;
- 数据发生改变后一定要重新刷新数据
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated]; /** * clearsSelectionOnViewWillAppear * 这个是它的一个属性,默认是yes 返回列表页面的时候,默认取消这行的选中状态,可是我们已经把这条数据删除的话,会出问题 * 如果你点击了一行cell,进入下一个页面,在这个页面中,我们把本该属于这行cell的数据给删了 * 如果 self.clearsSelectionOnViewWillAppear = yes,返回前一页时,会刷新这一行cell,执行cellForRow方法,结果数据却没了,就崩溃了 * 如果 self.clearsSelectionOnViewWillAppear = no,不会刷新这一行cell,就没事儿了 */ self.clearsSelectionOnViewWillAppear =NO;
[self.tableView reloadData];---->并不一定要放在这里,看取得数据在什么位置,刷新数据在什么位置
}
awakeFromNib(故事板)和viewDidLoad中的区别
awakeFromNib
当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的 awakeFromNib函数来响应这个消息,执行一些必要的操作。也就是说通过nib文件创建view对象是执行awakeFromNib 。
viewDidLoad中
当view对象被加载到内存是就会执行viewDidLoad,所以不管通过nib文件还是代码的方式创建对象都会执行viewDidLoad。awakeFromNib和viewDidLoad的区别
将汉字转换为不带音调的拼音
- (NSString )transformMandarinToLatin:(NSString )string
{
NSMutableString preString = [string mutableCopy]; /转换成成带音 调的拼音/ CFStringTransform((CFMutableStringRef)preString, NULL, kCFStringTransformMandarinLatin, NO); /去掉音调*/ CFStringTransform((CFMutableStringRef)preString, NULL, kCFStringTransformStripDiacritics, NO); return preString;
}
图片适应问题(超出部分裁剪)
有两个观点:视图1,视图2
视图2添加视图1到中,如果视图2大于厂景,或者视图2的坐标不全在厂景的范围内,视图2是盖着厂景的,意思就是超出的部份也会画出来
的UIView有一个属性,clipsTobounds默认情况下是NO。
如果,我们想要视图2把超出的那部份隐藏起来的话
,就得改变它的父视图也就厂景的clipsTobounds属性值。
view1.clipsTobounds = YES;
第三方FMDB数据库操作问题
Unknown error finalizing or resetting statement (5: database is locked)
在使用FMDB时有时候一不小心没写好代码就会这样子啦,为什么呢,其实呢,应该是在前面代码中有调用数据库而且并没有调用[DB关闭]就直接跳出结果来了,所以在前面的数据库操作中先运行[DB关闭]再返回数据即可;
通过注册键盘显示的消息
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShown:)
name:UIKeyboardWillShowNotification object:nil];
- (void)keyboardWillShown:(NSNotification *)aNotification{// 键盘信息字典NSDictionary *info = [aNotification userInfo];
}
改变导航栏中间标题颜色
UIColor * color = [UIColor whiteColor]; NSDictionary * dict = [NSDictionary dictionaryWithObject: colorforKey:NSForegroundColorAttributeName]; self.navigationController.navigationBar.titleTextAttributes = dict;
UIWebView中要实现横向滑动,跟一个UIWebView的增高没有关系,你需要设定一个UIWebView的属性滚动视图的contentsize.width大于UIWebView中的frame.size.width。
如何监测系统键盘的弹出(有第三方框架很方便)
通过注册键盘显示的消息
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShown:)
name:UIKeyboardWillShowNotification object:nil];
- (void)keyboardWillShown:(NSNotification)aNotification{ // 键盘信息字典 NSDictionary info = [aNotification userInfo];
}
改变状态栏颜色
在Info.plist中添加
UIViewControllerBasedStatusBarAppearance,设置值为NO
然后再didFinishLaunchingWithOptions的AppDelegate中,添加这些代码:
[应用setStatusBarHidden:NO]; [应用setStatusBarStyle:UIStatusBarStyleLightContent];
路径截取字符串的一些处理
// 从路径中获得完整的文件名(带后缀)
exestr = [filePath lastPathComponent];
// 获得文件名(不带后缀)
exestr = [exestr stringByDeletingPathExtension];
// 获得文件的扩展类型(不带'.')
exestr = [filePath pathExtension];
第三方库不支持64位造成编译错误
。Xcode中升级到5.1,苹果默认让所有的应用程序都通过64位编译器编译通过下面的方式可以关闭:选中Targets->构建设置 - >架构双击架构,选择其他,删除$(ARCH_STANDARD)(点' - '),然后增加的ARMv7和armv7s(点'+')。清理一下再编译就行了。
移动导航栏的方法:
import <QuartzCore/QuartzCore.h>
define kNavBarDefaultPosition CGPointMake(160, 22)
if (contentOffsetY > _scrollViewContentOffsetYThreshold) {
layer.position = CGPointMake(layer.position.x,
- MIN((contentOffsetY - _scrollViewContentOffsetYThreshold), 48.0));
}
else
{
layer.position = kNavBarDefaultPosition;
}
的CGRect的一些相关方法:
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 120, 120, 120)];
// 获取矩形左边缘的x坐标
NSLog(@"MinX = %f",CGRectGetMinX(view.frame));
// 获取矩形顶部的y坐标
NSLog(@"MinY = %f",CGRectGetMinY(view.frame));
// 获取矩形中心点的坐标
NSLog(@"MidX = %f",CGRectGetMidX(view.frame));
NSLog(@"MidY = %f",CGRectGetMidY(view.frame));
// 获取矩形右边缘的x坐标
NSLog(@"MaxX = %f",CGRectGetMaxX(view.frame));
// 获取矩形底部的y坐标
NSLog(@"MaxY = %f",CGRectGetMaxY(view.frame));
// 返回手势在一个UIView上的触摸点坐标
- (CGPoint)locationInView:(UIView *)view:
// 判断矩形是否包含了一个点
NSLog(@"isRectContainPoint = %d",CGRectContainsPoint(view.frame, CGPointMake(160, 180)));
CGRectInset CGRect CGRectInset (
CGRect rect,
CGFloat dx,
CGFloat dy
);
该结构体的应用是以原rect为中心,再参考dx,dy,进行缩放或者放大。
CGRect r1 = CGRectMake(100, 100, 50, 50);
CGRect r3 = CGRectInset(r1, 10, 8);//结果应为:110,108,30,34 具体小多少都是要参照dx和dy来判定的。
CGRectOffset CGRect CGRectOffset(
CGRect rect,
CGFloat dx,
CGFloat dy
); 相对于源矩形原点rect(左上角的点)沿x轴和y轴偏移, 再rect基础上沿x轴和y轴偏移
float offset = 125.0;
CGRect r1 = CGRectMake(100, 100, 5, 5);
CGRect r2 = CGRectOffset(r1, offset, offset);
结果:
{{225, 225}, {5, 5}}
// 将像素point由point所在视图转换到目标视图view中,返回在目标视图view中的像素值
- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view;
// 将像素point从view中转换到当前视图中,返回在当前视图中的像素值
- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view;
// 将rect由rect所在视图转换到目标视图view中,返回在目标视图view中的rect
- (CGRect)convertRect:(CGRect)rect toView:(UIView *)view;
// 将rect从view中转换到当前视图中,返回在当前视图中的rect
- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view;
例把UITableViewCell中的subview(btn)的frame转换到 controllerA中
// controllerA 中有一个UITableView, UITableView里有多行UITableVieCell,cell上放有一个button
// 在controllerA中实现:
CGRect rc = [cell convertRect:cell.btn.frame toView:self.view];
或
CGRect rc = [self.view convertRect:cell.btn.frame fromView:cell];
// 此rc为btn在controllerA中的rect
或当已知btn时:
CGRect rc = [btn.superview convertRect:btn.frame toView:self.view];
或
CGRect rc = [self.view convertRect:btn.frame fromView:btn.superview];
弱引用的几种写法
weak typeof(&_self)weakSelf = self;
__weak __typeof(self) weakSelf = self;
__weak XxxViewController _weakSelf = self;
__weak id weakSelf = self;
CGImageRef与UIImage的的互转
CGImage和CGImageRef这两个应当是用来重绘图形的类,它们在应用时是按照图像的像素矩阵来绘制图片的,它们可以用来处理位图。
CGImageRef与UIImage的互转
// CGImageRef转换成UIImage CGImageRef
iOffscreen = CGBitmapContextCreateImage(context);
UIImage* image = [UIImage imageWithCGImage: iOffscreen];
// UIImage转换成CGImageRef
UIImage *loadImage=[UIImage imageNamed:@"888.png"];
CGImageRef cgimage=loadImage.CGImage;
JPG和PNG图片存储沙盒
NSData *data;
if (UIImagePNGRepresentation(image) == nil) {
data = UIImageJPEGRepresentation(image, 1);
} else {
data = UIImagePNGRepresentation(image);
}
UIImagePNGRepresentation转换PNG格式的图片为二进制,如果图片的格式为JPEG则返回零;
[fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.png"] contents:data attributes:nil]; 将图片保存为PNG格式
[fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.jpg"] contents:data attributes:nil]; 将图片保存为JPEG格式
我们也可以写成下面的格式存储图片
NSString *pngImage = [filePath stringByAppendingPathComponent:@"Documents/image.png"];
NSString *jpgImage = [filePath stringByAppendingPathComponent:@"Documents/image.jpg"];
[data writeToFile:pngImage atomically:YES];
[data writeToFile:jpgImage atomically:YES];
修改按键上字体大小
button.titleLabel.font = [UIFont systemFontOfSize:28.0];
两个经纬度之间的相对距离
CLLocation *orig=[[CLLocation alloc] initWithLatitude:[mainDelegate.latitude_self doubleValue] longitude:[mainDelegate.longitude_self doubleValue]];
CLLocation* dist=[[CLLocation alloc] initWithLatitude:[tmpNewsModel.latitude doubleValue] longitude:[tmpNewsModel.longitude doubleValue]];
CLLocationDistance kilometers=[orig distanceFromLocation:dist]/1000;
NSLog(@"距离:",kilometers);
真机调试错误
获得开发签名后在真机器上部署测试
,在点击构建并运行后,提示该可执行文件是无效的权利签名。(在你的应用程序的代码签名权利文件不匹配在置备配置文件中指定特定的权利。)错误- >(0xE8008016),
解决方法如下:
第一步:在工程中添加文件的新文件,选择代码签名中的权利,添加后名称为Entitlements.plist。
第二步:点击Entitlements.plist进行编辑,删除所有根下的密钥,然后添加一个布尔类型,名称为GET-任务允许的关键,状态为CHECKED
第三步:在目标中的信息中的构建选项卡中的代码签名权利的值设为Entitlements.plist,重新构建即可解决
获取视频的第一帧图片(用来在视频列表默认显示一个图片)
- (UIImage *)getFirstFrameOfVideoWithVideoURL:(NSURL *)videoURL
{
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
NSParameterAssert(asset);
AVAssetImageGenerator *assetIG = [[AVAssetImageGenerator alloc] initWithAsset:asset];
assetIG.appliesPreferredTrackTransform = YES;
assetIG.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels;
CGImageRef thumbnailImageRef = NULL;
CFTimeInterval thumbnailImageTime = 60;
NSError *igError = nil;
thumbnailImageRef = [assetIG copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 60) actualTime:NULL error:&igError];
if (!thumbnailImageRef)
NSLog(@"thumbnailImageGenerationError %@", igError );
UIImage *thumbnailImage = thumbnailImageRef ? [[UIImage alloc] initWithCGImage:thumbnailImageRef] : nil;
return thumbnailImage;
}
故事情节中放置滚动型无法滚动的情况
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
self.mScrollView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);
self.mScrollView.contentSize = CGSizeMake(kScreenWidth, 568);
}
- (void) viewDidAppear:(BOOL)animated
{
self.scrollView.frame = CGRectMake(0, 0, 320, 480);
[self.scrollView setContentSize:CGSizeMake(320, 1000)];
}
16进制颜色转的UIColor
- (UIColor *)colorFromHexString:(NSString *)hexString
{
if ([[hexString substringToIndex:1] isEqualToString:@"#"]) {
hexString = [hexString substringFromIndex:1];
}
unsigned rgbValue = 0;
NSScanner *scanner = [NSScanner scannerWithString:hexString];
[scanner scanHexInt:&rgbValue];
return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:1.0];
}
按对应的尺寸缩放图片
- (UIImage *)compressImage:(UIImage *)imgSrc withSize:(CGSize)size
{
UIGraphicsBeginImageContext(size);
CGRect rect = {{0,0}, size};
[imgSrc drawInRect:rect];
UIImage *compressedImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return compressedImg;
}
GIF图片转化成一个存储图像对象的数组
frame(帧):一个gif可以简单认为是多张image组成的动画,一帧就是其中一张图片image.
frameCount(帧数): 就是一个gif有多少帧
loopCount(播放次数):有些gif播放到一定次数就停止了,如果为0就代表gif一直循环播放。
delayTime(延迟时间):每一帧播放的时间,也就是说这帧显示到delayTime就转到下一帧。
所以gif播放主要就是把每一帧image解析出来,然后每一帧显示它对应的delaytime,然后再显示下一张。如此循环下去。
下面是纯粹实现由系统提供的解码:
-(void)decodeWithFilePath:(NSString *)filePath
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() {
NSData *data = [NSData dataWithContentsOfFile:self.path];
[self decodeWithData:data];
});
}
- (void)decodeWithData:(NSData *)data
{
CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef) data, NULL); if (src)
{
//获取gif的帧数 NSUInteger frameCount = CGImageSourceGetCount(src); //获取GfiImage的基本数据 NSDictionary *gifProperties = (NSDictionary *) CGImageSourceCopyProperties(src, NULL); if(gifProperties)
{
//由GfiImage的基本数据获取gif数据
NSDictionary gifDictionary =[gifProperties objectForKey:(NSString)kCGImagePropertyGIFDictionary];
//获取gif的播放次数
NSUInteger loopCount = [[gifDictionary objectForKey:(NSString*)kCGImagePropertyGIFLoopCount] integerValue];
for (NSUInteger i = 0; i < frameCount; i++)
{
//得到每一帧的CGImage CGImageRef img = CGImageSourceCreateImageAtIndex(src, (size_t) i, NULL); if (img)
{
//把CGImage转化为UIImage UIImage *frameImage = [UIImage imageWithCGImage:img]; //获取每一帧的图片信息 NSDictionary *frameProperties = (NSDictionary ) CGImageSourceCopyPropertiesAtIndex(src, (size_t) i, NULL); if (frameProperties)
{
//由每一帧的图片信息获取gif信息 NSDictionary frameDictionary = [frameProperties objectForKey:(NSString)kCGImagePropertyGIFDictionary]; //取出每一帧的delaytime CGFloat delayTime = [[frameDictionary objectForKey:(NSString)kCGImagePropertyGIFDelayTime] floatValue]; //TODO 这里可以实现边解码边回调播放或者把每一帧image和delayTime存储起来 CFRelease(frameProperties);
}
CGImageRelease(img);
}
}
CFRelease(gifProperties);
}
CFRelease(src);
}
}
使用NSCountedSet统计重复元素的个数
可能你会发现这个类的父类是的NSMutableSet纳尼不是说的NSMutableSet是不可以储存重复对象的吗其实NSCountedSet也是不能储存重复的对象的,查看苹果文档中对这个类的描述有这么一句?:
插入NSCountedSet对象每个不同对象具有与之相关联的计数器。
插入NSCountedSet对象的每个不同的对象都有一个与之相关的计数器
也就是说如果遇到重复对象的加入,这个对象的计数器就会+1。所以可以到这个类有个名叫
- (NSUInteger)countForObject:(id)object 的方法来统计重复对象的个数。
NSArray *array = @[@1, @2, @2, @1];
NSCountedSet *set = [[NSCountedSet alloc]initWithArray:array];
[set enumerateObjectsUsingBlock:^(id obj, BOOLBOOL *stop) {
NSLog(@"%@ => %d", obj, [set countForObject:obj]);
}];
导航条返回键带的标题太讨厌了,怎么让它消失
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
截屏转化为图像
UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image= UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
- (UIImage *)creatImageWithView:(UIView *)view rect:(CGRect)rect
{
CGSize size = view.bounds.size;
UIGraphicsBeginImageContextWithOptions(size, NO, 0);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGImageRef viewImageRef = viewImage.CGImage;
CGImageRef imageRef = CGImageCreateWithImageInRect(viewImageRef, rect);
UIImage *image = [[UIImage alloc] initWithCGImage:imageRef];
CGImageRelease(imageRef);
return image;
}
storybord中设置静态单元格时候,一定要把代码中的数据源的两个方法注掉,不然是不会显示的。还有就是,厦门国际银行上貌似不能用静态单元格,storybord可以
自定义视图时候获取该视图的导航控制器和视图控制器
- (UIViewController)viewController { for (UIView next = [self superview]; next; next = next.superview) { UIResponder* nextResponder = [next nextResponder]; if ([nextResponder isKindOfClass:[UINavigationController class]]) { return (UIViewController)nextResponder;
}
}
return nil;
}
//获取导航控制器- (UINavigationController)navigationController { for (UIView* next = [self superview]; next; next = next.superview) { UIResponder* nextResponder = [next nextResponder]; if ([nextResponder isKindOfClass:[UINavigationController class]]) { return (UINavigationController*)nextResponder;
}
}
return nil;
}