- 拋出異常&異常處理
- NSInvocation執(zhí)行多參數(shù)方法
- 強(qiáng)制消除Xcode警告
- UI控件對(duì)齊方式屬性
- UINavigationItem,UIBarButtonItem,UITabBarItem,UINavigationBar,UITabBar,UITabBarButton屬性總結(jié)
- UIButton相關(guān)設(shè)置
- 切換控制器
- 查看Class所有的成員變量
- runtime
- iOS修改項(xiàng)目名稱,Swift命名空間
- 字符串轉(zhuǎn)emoji
- CADisplayLink定時(shí)器
-
拋出異常&異常處理
swift3.0異常處理
guard let jsonPath = Bundle.main.path(forResource: "Contents.json", ofType: nil) else {
return
}
let jsonUrl = URL(fileURLWithPath: jsonPath)//方式一:try方式 需要在do{}內(nèi) 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? 如果該方法出現(xiàn)了異常,則該方法返回nil.如果沒有異常,則返回對(duì)應(yīng)的對(duì)象 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! 直接告訴系統(tǒng),該方法沒有異常,如果該方法出現(xiàn)了異常,那么程序會(huì)報(bào)錯(cuò)(崩潰) 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:@"錯(cuò)誤" reason:@"方法找不到" userInfo:nil]; 2. [NSException raise:@"錯(cuò)誤" format:@"%@方法找不到", NSStringFromSelector(selector)]; 3. void handleException(NSException *exception) { } -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 設(shè)置捕捉異常的回調(diào) NSSetUncaughtExceptionHandler(handleException); return YES; } 4. @try { } @catch (NSException *exception) { } @finally { }
-
NSInvocation執(zhí)行多參數(shù)方法
- (id)performSelector:(SEL)selector withObjects:(NSArray *)objects { // 方法簽名(方法的描述) NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector]; if (signature == nil) { [NSException raise:@"錯(cuò)誤" format:@"%@方法找不到", NSStringFromSelector(selector)]; } // NSInvocation : 利用一個(gè)NSInvocation對(duì)象包裝一次方法調(diào)用(方法調(diào)用者栅表、方法名谐鼎、方法參數(shù)、方法返回值) NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; invocation.target = self; invocation.selector = selector; // 設(shè)置參數(shù) NSInteger paramsCount = signature.numberOfArguments - 2; // 除self野揪、_cmd以外的參數(shù)個(gè)數(shù) 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]; } // 調(diào)用方法 [invocation invoke]; // 獲取返回值 id returnValue = nil; if (signature.methodReturnLength) { // 有返回值類型,才去獲得返回值 [invocation getReturnValue:&returnValue]; } return returnValue; }
- 強(qiáng)制消除Xcode警告
#pragma clang diagnostic push //開始
#pragma clang diagnostic ignored "-Warc-performSelector-leaks" //錯(cuò)誤類型
#pragma clang diagnostic pop //結(jié)束
-
UI控件對(duì)齊方式屬性
四個(gè)容易混淆的屬性: 一. textAligment : 文字的水平方向的對(duì)齊方式 1> 取值 NSTextAlignmentLeft = 0, // 左對(duì)齊 NSTextAlignmentCenter = 1, // 居中對(duì)齊 NSTextAlignmentRight = 2, // 右對(duì)齊 2> 哪些控件有這個(gè)屬性 : 一般能夠顯示文字的控件都有這個(gè)屬性 * UITextField * UILabel * UITextView 二. contentVerticalAlignment : 內(nèi)容的垂直方向的對(duì)齊方式 1> 取值 UIControlContentVerticalAlignmentCenter = 0, // 居中對(duì)齊 UIControlContentVerticalAlignmentTop = 1, // 頂部對(duì)齊 UIControlContentVerticalAlignmentBottom = 2, // 底部對(duì)齊 UIControlContentVerticalAlignmentFill = 3 //填充 2> 哪些控件有這個(gè)屬性 : 繼承自UIControl的控件或者UIControl本身 * UIControl * UIButton * UITextField * ... 三. contentHorizontalAlignment : 內(nèi)容的水平方向的對(duì)齊方式 1> 取值 UIControlContentHorizontalAlignmentCenter = 0, // 居中對(duì)齊 UIControlContentHorizontalAlignmentLeft = 1, // 左對(duì)齊 UIControlContentHorizontalAlignmentRight = 2, // 右對(duì)齊 UIControlContentHorizontalAlignmentFill = 3 //填充 2> 哪些控件有這個(gè)屬性 : 繼承自UIControl的控件或者UIControl本身 * UIControl * UIButton * UITextField * ... 四. contentMode : 內(nèi)容模式(控制內(nèi)容的對(duì)齊方式), 一般對(duì)UIImageView很有用 1> 取值 /** 規(guī)律: 1.Scale : 圖片會(huì)拉伸 2.Aspect : 圖片會(huì)保持原來的寬高比 */ // 前3個(gè)情況, 圖片都會(huì)拉伸 // (默認(rèn))拉伸圖片至填充整個(gè)UIImageView(圖片的顯示尺寸會(huì)跟UIImageView的尺寸一樣) UIViewContentModeScaleToFill, // 按照?qǐng)D片原來的寬高比進(jìn)行伸縮, 伸縮至適應(yīng)整個(gè)UIImageView(圖片的內(nèi)容不能超出UIImageView的尺寸范圍) UIViewContentModeScaleAspectFit, // 按照?qǐng)D片原來的寬高比進(jìn)行伸縮, 伸縮至 圖片的寬度和UIImageView的寬度一樣 或者 圖片的高度和UIImageView的高度一樣 UIViewContentModeScaleAspectFill, // 后面的所有情況, 都會(huì)按照?qǐng)D片的原來尺寸顯示, 不會(huì)進(jìn)行拉伸 UIViewContentModeRedraw, // 當(dāng)控件的尺寸改變了, 就會(huì)重繪一次(重新調(diào)用setNeedsDisplay, 調(diào)用drawRect:) UIViewContentModeCenter, UIViewContentModeTop, UIViewContentModeBottom, UIViewContentModeLeft, UIViewContentModeRight, UIViewContentModeTopLeft, UIViewContentModeTopRight, UIViewContentModeBottomLeft, UIViewContentModeBottomRight, 2> 哪些控件有這個(gè)屬性 : 所有UI控件都有 五. 如果有多個(gè)屬性的作用沖突了, 只有1個(gè)屬性有效(就近原則)
-
UINavigationItem屬性總結(jié)
一倍踪、UINavigationItem 1> 獲得方式 self.navigationItem // self是指控制器 2> 作用 可以用來設(shè)置當(dāng)前控制器頂部導(dǎo)航欄的內(nèi)容 // 設(shè)置導(dǎo)航欄中間的內(nèi)容 self.navigationItem.title self.navigationItem.titleView 二梯捕、UIBarButtonItem 1> 用在什么地方 // 設(shè)置導(dǎo)航欄左上角的內(nèi)容 self.navigationItem.leftBarButtonItem // 設(shè)置導(dǎo)航欄右上角的內(nèi)容 self.navigationItem.rightBarButtonItem 2> 作用 相當(dāng)于一個(gè)按鈕 三、UITabBarItem 1> 獲得方式 self.tabBarItem // self是指控制器 2> 作用 可以用來設(shè)置當(dāng)前控制器對(duì)應(yīng)的選項(xiàng)卡標(biāo)簽的內(nèi)容 // 標(biāo)簽的標(biāo)題 self.tabBarItem.title // 標(biāo)簽的圖標(biāo) self.tabBarItem.image // 標(biāo)簽的選中圖標(biāo) self.tabBarItem.selectdImage 四铆铆、UINavigationBar 1. 導(dǎo)航控制器頂部的欄(UI控件) 2. UINavigationBar上面顯示什么內(nèi)容蝶缀, 取決于當(dāng)前控制器的navigationItem屬性 3. UINavigationBar是view, navigationItem是model 4. 由navigationItem給UINavigationBar提供顯示的數(shù)據(jù) UINavigationBar *barGlob = [UINavigationBar appearance];//全局設(shè)置bar UINavigationBar *bar = [UINavigationBar appearanceWhenContainedInInstancesOfClasses:[self class]];//設(shè)置self導(dǎo)航條的bar [bar setBackgroundImage:[UIImage imageNamed:@""] forBarMetrics:UIBarMetricsDefault]; //forBarMetrics有點(diǎn)類似于按鈕的for state狀態(tài)薄货,即什么狀態(tài)下顯示 //UIBarMetricsDefault-豎屏橫屏都有翁都,橫屏導(dǎo)航條變寬,則自動(dòng)repeat圖片 //UIBarMetricsCompact-豎屏沒有谅猾,橫屏有柄慰,相當(dāng)于之前老iOS版本里地UIBarMetricsLandscapePhone 五、UITabBar 1. UITabBarController底部的選項(xiàng)卡條 六税娜、UITabBarButton 1. UITabBar底部的每一個(gè)標(biāo)簽 2. 每一個(gè)UITabBarButton里面顯示什么內(nèi)容坐搔,取決于當(dāng)前控制器的tabBarItem屬性 3. UITabBarButton是view, tabBarItem是model 4. 由tabBarItem給UITabBarButton提供顯示的數(shù)據(jù)
- UIButton相關(guān)設(shè)置
// 設(shè)置按鈕的尺寸為背景圖片的尺寸
button.size = button.currentBackgroundImage.size;
//取消點(diǎn)擊效果
btn.adjustsImageWhenHighlighted = false
/ 默認(rèn)按鈕的尺寸跟背景圖片一樣大
// sizeToFit:默認(rèn)會(huì)根據(jù)按鈕的背景圖片或者image和文字計(jì)算出按鈕的最合適的尺寸
[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修改項(xiàng)目名稱
build Settings -> product name
Swift命名空間:let ns = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
-
字符串轉(zhuǎn)emoji
override func emoji() {// emoji表情對(duì)應(yīng)的十六進(jìn)制 let code = "0x2600" // 1.從字符串中取出十六進(jìn)制的數(shù) // 創(chuàng)建一個(gè)掃描器, 掃描器可以從字符串中提取我們想要的數(shù)據(jù) let scanner = NSScanner(string: code) // 2.將十六進(jìn)制轉(zhuǎn)換為字符串 var result:UInt32 = 0 scanner.scanHexInt(&result) // 3.將十六進(jìn)制轉(zhuǎn)換為emoji字符串 let emojiStr = Character(UnicodeScalar(result)) // 3.顯示 print(emojiStr) }
- CADisplayLink定時(shí)器
//NSTimer很少用于繪圖敬矩,因?yàn)檎{(diào)度優(yōu)先級(jí)比較低概行,并不會(huì)準(zhǔn)時(shí)調(diào)用
//CADisplayLink:每次屏幕刷新的時(shí)候就會(huì)調(diào)用,屏幕一般一秒刷新60次
//[self setNeedsDisplay] 注意:這個(gè)方法并不會(huì)馬上調(diào)用drawRect,其實(shí)這個(gè)方法只是給當(dāng)前控件添加刷新的標(biāo)記弧岳,等下一次屏幕刷新的時(shí)候才會(huì)調(diào)用drawRect
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(timeChange)];
// 添加主運(yùn)行循環(huán)
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];