ios瑣碎筆記

  • 拋出異常&異常處理
  • 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];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凳忙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缩筛,更是在濱河造成了極大的恐慌消略,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞎抛,死亡現(xiàn)場(chǎng)離奇詭異艺演,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)桐臊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門胎撤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人断凶,你說我怎么就攤上這事伤提。” “怎么了认烁?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵肿男,是天一觀的道長(zhǎng)介汹。 經(jīng)常有香客問我,道長(zhǎng)舶沛,這世上最難降的妖魔是什么嘹承? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮如庭,結(jié)果婚禮上叹卷,老公的妹妹穿的比我還像新娘。我一直安慰自己坪它,他們只是感情好骤竹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著往毡,像睡著了一般蒙揣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卖擅,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天鸣奔,我揣著相機(jī)與錄音,去河邊找鬼惩阶。 笑死挎狸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的断楷。 我是一名探鬼主播锨匆,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼冬筒!你這毒婦竟也來了恐锣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤舞痰,失蹤者是張志新(化名)和其女友劉穎土榴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體响牛,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玷禽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呀打。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矢赁。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖贬丛,靈堂內(nèi)的尸體忽然破棺而出撩银,到底是詐尸還是另有隱情,我是刑警寧澤豺憔,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布额获,位于F島的核電站够庙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咪啡。R本人自食惡果不足惜首启,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撤摸。 院中可真熱鬧,春花似錦褒纲、人聲如沸准夷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衫嵌。三九已至,卻和暖如春彻秆,著一層夾襖步出監(jiān)牢的瞬間楔绞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工唇兑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酒朵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓扎附,卻偏偏與公主長(zhǎng)得像蔫耽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子留夜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容