- 抛出异常&异常处理
- NSInvocation执行多参数方法
- 强制消除Xcode警告
- UI控件对齐方式属性
- UINavigationItem,UIBarButtonItem,UITabBarItem,UINavigationBar,UITabBar,UITabBarButton属性总结
- UIButton相关设置
- 切换控制器
- 查看Class所有的成员变量
- runtime
- iOS修改项目名称,Swift命名空间
- 字符串转emoji
- CADisplayLink定时器
-
抛出异常&异常处理
swift3.0异常处理
guard let jsonPath = Bundle.main.path(forResource: "Contents.json", ofType: nil) else {
return
}
let jsonUrl = URL(fileURLWithPath: jsonPath)//方式一:try方式 需要在do{}内 do { let jsonData = try Data.init(contentsOf: jsonUrl, options: .mappedRead) let anyObject = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) guard let dictArray = anyObject as? [String : AnyObject] else { return } for dict in dictArray { print(dict) } } catch { //抛出异常 return } //方式二:try? 如果该方法出现了异常,则该方法返回nil.如果没有异常,则返回对应的对象 guard let jsonData = try? Data.init(contentsOf: jsonUrl, options: .mappedRead) else { return } guard let anyObject = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) else { return } guard let dictArray = anyObject as? [String : AnyObject] else { return } for dict in dictArray { print(dict) } //方式三:try! 直接告诉系统,该方法没有异常,如果该方法出现了异常,那么程序会报错(崩溃) let jsonData3 = try! Data.init(contentsOf: jsonUrl, options: .mappedRead) let anyObject3 = try! JSONSerialization.jsonObject(with: jsonData3, options: .mutableContainers) guard let dictArray3 = anyObject3 as? [String : AnyObject] else { return } for dict in dictArray3 { print(dict) } 1. @throw [NSException exceptionWithName:@"错误" reason:@"方法找不到" userInfo:nil]; 2. [NSException raise:@"错误" format:@"%@方法找不到", NSStringFromSelector(selector)]; 3. void handleException(NSException *exception) { } -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 设置捕捉异常的回调 NSSetUncaughtExceptionHandler(handleException); return YES; } 4. @try { } @catch (NSException *exception) { } @finally { }
-
NSInvocation执行多参数方法
- (id)performSelector:(SEL)selector withObjects:(NSArray *)objects { // 方法签名(方法的描述) NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector]; if (signature == nil) { [NSException raise:@"错误" format:@"%@方法找不到", NSStringFromSelector(selector)]; } // NSInvocation : 利用一个NSInvocation对象包装一次方法调用(方法调用者、方法名、方法参数、方法返回值) NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; invocation.target = self; invocation.selector = selector; // 设置参数 NSInteger paramsCount = signature.numberOfArguments - 2; // 除self、_cmd以外的参数个数 paramsCount = MIN(paramsCount, objects.count); for (NSInteger i = 0; i < paramsCount; i++) { id object = objects[i]; if ([object isKindOfClass:[NSNull class]]) continue; [invocation setArgument:&object atIndex:i + 2]; } // 调用方法 [invocation invoke]; // 获取返回值 id returnValue = nil; if (signature.methodReturnLength) { // 有返回值类型,才去获得返回值 [invocation getReturnValue:&returnValue]; } return returnValue; }
- 强制消除Xcode警告
#pragma clang diagnostic push //开始
#pragma clang diagnostic ignored "-Warc-performSelector-leaks" //错误类型
#pragma clang diagnostic pop //结束
-
UI控件对齐方式属性
四个容易混淆的属性: 一. textAligment : 文字的水平方向的对齐方式 1> 取值 NSTextAlignmentLeft = 0, // 左对齐 NSTextAlignmentCenter = 1, // 居中对齐 NSTextAlignmentRight = 2, // 右对齐 2> 哪些控件有这个属性 : 一般能够显示文字的控件都有这个属性 * UITextField * UILabel * UITextView 二. contentVerticalAlignment : 内容的垂直方向的对齐方式 1> 取值 UIControlContentVerticalAlignmentCenter = 0, // 居中对齐 UIControlContentVerticalAlignmentTop = 1, // 顶部对齐 UIControlContentVerticalAlignmentBottom = 2, // 底部对齐 UIControlContentVerticalAlignmentFill = 3 //填充 2> 哪些控件有这个属性 : 继承自UIControl的控件或者UIControl本身 * UIControl * UIButton * UITextField * ... 三. contentHorizontalAlignment : 内容的水平方向的对齐方式 1> 取值 UIControlContentHorizontalAlignmentCenter = 0, // 居中对齐 UIControlContentHorizontalAlignmentLeft = 1, // 左对齐 UIControlContentHorizontalAlignmentRight = 2, // 右对齐 UIControlContentHorizontalAlignmentFill = 3 //填充 2> 哪些控件有这个属性 : 继承自UIControl的控件或者UIControl本身 * UIControl * UIButton * UITextField * ... 四. contentMode : 内容模式(控制内容的对齐方式), 一般对UIImageView很有用 1> 取值 /** 规律: 1.Scale : 图片会拉伸 2.Aspect : 图片会保持原来的宽高比 */ // 前3个情况, 图片都会拉伸 // (默认)拉伸图片至填充整个UIImageView(图片的显示尺寸会跟UIImageView的尺寸一样) UIViewContentModeScaleToFill, // 按照图片原来的宽高比进行伸缩, 伸缩至适应整个UIImageView(图片的内容不能超出UIImageView的尺寸范围) UIViewContentModeScaleAspectFit, // 按照图片原来的宽高比进行伸缩, 伸缩至 图片的宽度和UIImageView的宽度一样 或者 图片的高度和UIImageView的高度一样 UIViewContentModeScaleAspectFill, // 后面的所有情况, 都会按照图片的原来尺寸显示, 不会进行拉伸 UIViewContentModeRedraw, // 当控件的尺寸改变了, 就会重绘一次(重新调用setNeedsDisplay, 调用drawRect:) UIViewContentModeCenter, UIViewContentModeTop, UIViewContentModeBottom, UIViewContentModeLeft, UIViewContentModeRight, UIViewContentModeTopLeft, UIViewContentModeTopRight, UIViewContentModeBottomLeft, UIViewContentModeBottomRight, 2> 哪些控件有这个属性 : 所有UI控件都有 五. 如果有多个属性的作用冲突了, 只有1个属性有效(就近原则)
-
UINavigationItem属性总结
一、UINavigationItem 1> 获得方式 self.navigationItem // self是指控制器 2> 作用 可以用来设置当前控制器顶部导航栏的内容 // 设置导航栏中间的内容 self.navigationItem.title self.navigationItem.titleView 二、UIBarButtonItem 1> 用在什么地方 // 设置导航栏左上角的内容 self.navigationItem.leftBarButtonItem // 设置导航栏右上角的内容 self.navigationItem.rightBarButtonItem 2> 作用 相当于一个按钮 三、UITabBarItem 1> 获得方式 self.tabBarItem // self是指控制器 2> 作用 可以用来设置当前控制器对应的选项卡标签的内容 // 标签的标题 self.tabBarItem.title // 标签的图标 self.tabBarItem.image // 标签的选中图标 self.tabBarItem.selectdImage 四、UINavigationBar 1. 导航控制器顶部的栏(UI控件) 2. UINavigationBar上面显示什么内容, 取决于当前控制器的navigationItem属性 3. UINavigationBar是view, navigationItem是model 4. 由navigationItem给UINavigationBar提供显示的数据 UINavigationBar *barGlob = [UINavigationBar appearance];//全局设置bar UINavigationBar *bar = [UINavigationBar appearanceWhenContainedInInstancesOfClasses:[self class]];//设置self导航条的bar [bar setBackgroundImage:[UIImage imageNamed:@""] forBarMetrics:UIBarMetricsDefault]; //forBarMetrics有点类似于按钮的for state状态,即什么状态下显示 //UIBarMetricsDefault-竖屏横屏都有,横屏导航条变宽,则自动repeat图片 //UIBarMetricsCompact-竖屏没有,横屏有,相当于之前老iOS版本里地UIBarMetricsLandscapePhone 五、UITabBar 1. UITabBarController底部的选项卡条 六、UITabBarButton 1. UITabBar底部的每一个标签 2. 每一个UITabBarButton里面显示什么内容,取决于当前控制器的tabBarItem属性 3. UITabBarButton是view, tabBarItem是model 4. 由tabBarItem给UITabBarButton提供显示的数据
- UIButton相关设置
// 设置按钮的尺寸为背景图片的尺寸
button.size = button.currentBackgroundImage.size;
//取消点击效果
btn.adjustsImageWhenHighlighted = false
/ 默认按钮的尺寸跟背景图片一样大
// sizeToFit:默认会根据按钮的背景图片或者image和文字计算出按钮的最合适的尺寸
[btn sizeToFit];
-
切换控制器
UIViewController *vc = [UIViewController new]; //push [self.navigationController pushViewController:vc animated:YES]; //modal [self presentViewController:vc animated:YES completion:nil]; //添加到win UIViewController *rootVc = [UIApplication sharedApplication].keyWindow.rootViewController; rootVc = vc;
-
查看Class所有的成员变量
+ (void)initialize{ unsigned int count = 0; //拷贝所有的成员变量 Ivar *ivars = class_copyIvarList([UIViewController class], &count); for (int i = 0; i < count; i++) { //取出成员变量 Ivar ivar = *(ivars + i); NSLog(@"%s", ivar_getName(ivar)); } //释放 free(ivars); }
- runtime
method1与method2替换
Method method1 = class_getInstanceMethod(self, @selector(method1));
Method method2 = class_getInstanceMethod(self, @selector(method2));
method_exchangeImplementations(method1, method2);
- iOS修改项目名称
build Settings -> product name
Swift命名空间:let ns = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
-
字符串转emoji
override func emoji() {// emoji表情对应的十六进制 let code = "0x2600" // 1.从字符串中取出十六进制的数 // 创建一个扫描器, 扫描器可以从字符串中提取我们想要的数据 let scanner = NSScanner(string: code) // 2.将十六进制转换为字符串 var result:UInt32 = 0 scanner.scanHexInt(&result) // 3.将十六进制转换为emoji字符串 let emojiStr = Character(UnicodeScalar(result)) // 3.显示 print(emojiStr) }
- CADisplayLink定时器
//NSTimer很少用于绘图,因为调度优先级比较低,并不会准时调用
//CADisplayLink:每次屏幕刷新的时候就会调用,屏幕一般一秒刷新60次
//[self setNeedsDisplay] 注意:这个方法并不会马上调用drawRect,其实这个方法只是给当前控件添加刷新的标记,等下一次屏幕刷新的时候才会调用drawRect
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(timeChange)];
// 添加主运行循环
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];