[經驗]iOS開發-記錄下在開發過程當中遇到的問題的解決方案及經驗總結-1

聲明:本文如下內容均摘自筆者從初學階段至今的平常筆記,不免有才入門時的理解誤差,歡迎指出php

本文長期更新(第二篇地址:傳送門)

1.badgeVaule氣泡提示,self.navigationController.tabBarItem.badgeValuehtml

2.git終端命令方法> pwd查看所有 >cd>ls >以後桌面找到文件夾內容,以cd xxxx ,ls格式>git status查看>git pull origin master從網上儲存庫中下下來。 返回上一級地址命令cd ..ios

3.全球最大開源代碼託管平臺——SourceForgec++

4.sections更改數量可以使tableview份量git

5.static cells靜態tableview程序員

6.nothing to commit, working directory clean 表示上傳Git成功github

7.git提交步驟web

  • git add . //此處add後加空格.編程

  • git commit -m "xxx"json

  • git pull origin master //更新代碼

  • git push origin master //提交

8.Identifier是寫在navigation上邊的

9.AF的方法中所有屬於異步下載。

10.不管使用collectionView仍是tableView的自定義cell,都須要先在viewDidLoad中註冊cell

11.能夠使用mac自帶的數碼測色計來獲取顏色的RGB值

12.例子:
indexPath.row==0 && indexPath.section==1
不一樣的section中的indexpath的row是會歸0重置的,從0開始重頭計

13.代理協議寫在m文件便可,不用過多的暴露在頭文件中

14.radioButton的圖片更改方法,不用代碼實現,在button的State 。cc。oo。nn。ff。ll。gg。中選擇Default爲未點擊時狀態,可賦予圖片,選擇selected爲選中時狀態,可賦予圖片,直接使用imageView的方法是不專業的

15.在button的中選擇Default爲未點擊時狀態,,直接使用imageView的方法是不專業的。

16.textView加邊框

#import <QuartzCore/QuartzCore.h>    
textview對象.layer.borderColor = UIColor.grayColor.CGColor;
textview對象.layer.borderWidth = 5;
self.textView.layer.masksToBounds = YES;
self.textView.layer.cornerRadius = 5;

17.ruby -e "$(curl -fsSL https://raw.githubusercontent...)" //下載安裝git插件

18.scrollView能夠專門用來自動處理鍵盤佈局,但須要嵌入代碼

19.有造好的輪子就要用,不要傻乎乎的想要本身去造,理解就能夠了,閒暇時間本身研究,工做當中效率進度第一

20.alloc以後幾乎全是init方法

21. if(indexPath.row==2 && indexPath.section==0){//row表示在一個section下順序第幾個,section表示第幾個section

22.區別:

-(void)viewDidLoad//加載後調用
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil//進入後就調用

23.git比svn要強大

24.@property (assign,nonatomic) BOOL hONG; //bool型只能用於狀態判斷,只有yes和no,非黑即白 assign表示弱類型的賦值 nonatomic會有前後順序 簡單變量是assign,指針變量是strong
//@property的意思是屬性,相似於c++的一個成員變量,在oc中成爲一個類的屬性
@implementation具體方法的實現

25.來記個方法,這是針對不一樣類型的初始化方法

//push界面以前的初始化方法,該方法是在push  xib類型界面以前進行初始化的方法
LSIntegralShopViewController * integrelShopViewController =[[LSIntegralShopViewController alloc]initWithNibName:@"LSIntegralShopViewController" bundle:nil];  //這裏那個nibName是寫的那個controller的對應的那個類

//針對toryboard的初始化方法
[WPUtil getViewControllerWithIdentifier: storyboardName:]  //此處Identifier是storyboard上的Identifier ID,而UINavigationController * homeNavigationController = [WPUtil getViewControllerWithIdentifier:@"homeNavigation" storyboardName:@"Home"];這裏的Identifier則是Navigation上的ID,注意區分

26.上下bar的地方切圖使用時,後綴加上@2x,注意是在.png前使用,同時圖盤拖到2x那格中

27.2x圖片清晰度更高

28.已經在界面上都配置好了,代碼裏面就不須要這些設置了
只需處理點擊事件,好比選中第一個,第一個button.selected = YES,其餘兩個button.selected = NO

29.UIButton的edge能夠調整image和title

30.[self.view endEditing:YES]; //直接撤銷鍵盤的方法

31.manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];//默認爲json格式,若爲json可省略這行代碼

32.+方法寫在頭文件中,誰均可以調用,只要引用其頭文件名稱,如viewController是能夠在任何地方初始化任意次的

33.使用最底部或最上部的UIButton或某個控件來支撐住scrollview,來讓scrollview知曉其最大距離

34.NSUInteger表示無符號整型,即非負數

35.嚴格按照流程來,先在外邊,好比說美工發給你的圖片,把名字改好,xxx@2x.png,而後再拖進去,還有,文件名不要出現空格,這些有空格的統統改掉,把有問題的所有刪了,從新加

36.至於重寫set和get方法,簡要說明一下,當咱們使用@property這用法以後,系統便會自動給咱們定義的變量以一個默認的set和get方法。插一句,_any和self.any的區別,_any就是隻指_any自己,是系統會生成的,而若是咱們重寫了any的set方法後,self.any會調用咱們重寫的set方法中的內容,而_any不是,好比這句

-(void)setCount:(NSUInteger)count
{
    _count = count;
}

這裏表示的是將系統默認給咱們生成的count變成咱們自定義的count,達到咱們想要的目的。
_any就是單單指當咱們使用@property後系統給我自動生成的一個any,而self.any不一樣,它會自動調用(set和get方法自己就包含在其中,也能夠理解爲就是它自身的一個屬性一部分)咱們重寫後的set方法,當咱們self.any的時候,其中重寫的set方法中的任何內容都會被咱們使用,因此即便咱們只self.any,也可實現許多隻要set方法中寫出的效果,大體是這個意思

37.推薦使用代理傳值,通知的觀察者模式效率低下

38.cell控制視圖顯示,controller負責網絡解析

39.取數據的時候,要看返回的數據是什麼樣子的,須要兩個就兩個,須要一個就一個

data =     {
    CurrentPageIndex = 1;
    PageSize = 10;
    TotalItemCount = 1;
    TotalPageCount = 1;
    data =         (
                    {
            ClickNumber = 0;
            ID = 1796;
            Norm = "\U6876";
            Picture = "/upload/goods/default.jpg";
            SellerRetailPrice = 10;
            TheSorting = 12500000;
            TypeID = 22;
            goodsName = "\U51b0\U51b0\U4e50";
            goodsTypeName = "\U7eaf\U51c0\U6c34";
            sellerId = 125;
            sellerName = "\U51e4\U51f0\U57ce\U6c34\U5e97";
            sellerState = 1;
        }
    );
};
    msg = "<null>";
    result = ok;
}

第一個data取的是裏面的一大堆即一個字典,第二個data纔是個數組,@"data"這個大致是指前一個data是拿到一個字典的數據,第二個data是那裏面的數組咯

40.不要直接用button或控件push到下一個界面,尤爲是在tableView的cell上

41.shopTVC.delegate = self;//上一個界面的代理設爲這個界面自身,在上一個見面中調用代理的時候,由於上一個界面的代理已經被設置爲這個界面,因此在上一個見面中調用其自身代理時,其實是這個界面在執行

42.沒有了summary,可是原來的summary的功能能夠在targets的general裏面找到

43.關於嘗試新方法,好比:將字典中的值賦值給一個float,有時候.不行能夠換( ) 或 ]試試看有沒有其方法

float left= [aaa[@"abc"] floatValue];

44.else if (self.btnOfAddress.selected){ //點了以後立馬又彈回去了,當執行的時候按鈕狀態已經彈回去了,若是須要一直是點擊狀態那麼你須要設置selected=YES,這是狀態是須要設置的,否則就不會有效果,須要是選中狀態,那麼你就要在合適的位置設置起,btn.selected = YES

45.總之,要看他數據須要什麼,保存的是哪裏

46.本着,誰分配誰管理的原則

47.thread:breakpoint 1.2,在該行最左側的藍色矩形區域右鍵,選擇delete breakpoint便可。

48.邏輯步驟關係,全部異步都要先完成數據的請求,成功後,返回數據信息後纔開始跳轉界面,換句話說,須要將須要提交的數據所有獲取到以後,再作統一提交處理

49.全部網絡請求都用異步,上傳提交也叫下載,只不過下載的內容可能就是個提示性的東西,提示你提交成功沒有

50.字符串比較用isEqualToString,不用等號, ]是調方法 ( )是優先級

51.提交輸入框信息,須要在解析數據時獲取,而不能在初始化時就去獲取

52.斷點不是隻能在運行前設置,在運行當中也能夠設置

53.一切都以數據爲中心,先拿到數據,再顯示頁面。好比tableView是先獲得返回行數,再執行的cell顯示,白話講就是,點擊了左邊的cell選中後,開始解析,因爲在解析時保存了數據,這樣返回行就有了數據,這時就會返回顯示返回行數目的數據,這樣一來即可以在cell中顯示

54.異步下載中間的代碼是異步的,要執行,可是不是立刻執行,網絡有數據返回的時候

55.然而機智如我,合理運用函數參數名賦予的做用

-(void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];//這個函數是當cell被點擊的時候調用的方法,最好不要用做初始化的地方
    if(selected == YES){
        self.buttonOfDetailed.hidden=NO;
    }else{
        self.buttonOfDetailed.hidden=YES;
    }

    // Configure the view for the selected state
}

56.tableView的cell重複相應點擊的問題多是在Table View這一欄選項中關於Selection的選擇問題,通常單次響應點擊會選擇Single Selection這一選項

57.這個方法只有在手指點擊cell,而後離開後才調用,而不是點擊的時候就調用

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

58.tableView果真是用到最多最多的,無處不在,以各類各樣你想象不到的方式出現,給你一種彷佛任何效果均可以用它來實現出來的心裏的震撼

59.command+3(2,1)調節模擬器放大尺寸

60.swift注意:若是你的代碼中有不須要改變的值,請使用let關鍵字將它聲明爲常量。只將須要改變的值聲明爲變量。

61.swift中,常量的值一旦設定就不能改變,而變量的值能夠隨意更改。常量和變量必須在使用前聲明,用let來聲明常量,用var來聲明變量。
常量和變量必須在使用前聲明,用let來聲明常量,用var來聲明變量。下面的例子展現瞭如何用常量和變量來記錄用戶嘗試登陸的次數:

let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0

這兩行代碼能夠被理解爲:

「聲明一個名字是maximumNumberOfLoginAttempts的新常量,並給它一個值10。而後,聲明一個名字是currentLoginAttempt的變量並將它的值初始化爲0.」

在這個例子中,容許的最大嘗試登陸次數被聲明爲一個常量,由於這個值不會改變。當前嘗試登陸次數被聲明爲一個變量,由於每次嘗試登陸失敗的時候都須要增長這個值。

你能夠在一行中聲明多個常量或者多個變量,用逗號隔開:

var x = 0.0, y = 0.0, z = 0.0

62.initWithNibName是加載View視圖事件

63.關於界面適配的問題,一個是對於底部tabbar所留下的空白的處理方法:

//隱藏底部tabbar留下的空白
self.hidesBottomBarWhenPushed = YES;

這裏http://www.cocoachina.com/bbs... 有一個思路的參照
可是具體實現須要具體分析一下,總的來講是把該方法加到即將要進入(即存在多餘tabbar空白的界面)的前一個界面的-(void)viewWillAppear:(BOOL)animated中來實現,也就是在頁面跳轉前

64.思路思路思路啊

#pragma mark - 發表帖子
-(void)publishAction
{
    //判斷是否已經登錄
    BOOL isLogin = [Utility getBoolForKey:GYH_PATIENT_IS_LOGIN];
    if (isLogin) {
        //進入發帖界面
        UIViewController *vc = viewControllerInStoryBoard(@"GHYNewPostController", @"1_home_7_quan");
        [self.navigationController pushViewController:vc animated:YES];
    }else{
        //調出登錄界面,登錄界面的返回是直接返回上一級界面,並非主頁
        [Utility jumpToLoginWithViewController:self];
    }

}

65.確實是深深感到對代碼的層次深度的理解到了瓶頸期的時候。

66.本着別人坑我,我不坑人的態度,變量的命名和註釋都是極盡規範和詳細的,也算對的起一個處女座的人設了。

67.for in其實是快速枚舉,跟for循環意義上仍是有區別的。目前能夠理解爲for...in 語句用於對數組或者對象的屬性進行循環操做

68.NSArray的枚舉操做中有一條須要注意:對於可變數組進行枚舉操做時,你不能經過添加或刪除對象這類操做來改變數組容器。若是你這麼作了,枚舉器會很困惑,而你將獲得未定義的結果。

69.git通過一次更改就要提交一次是爲了給本身一個後悔的機會,若是作了20次更改的時候一塊兒提交,那麼想要從新返回以前的某一項功能就會十分的費時費力,得不償失

70.UITableViewCell的屬性selectionStyle設置爲UITableViewCellSelectionStyleNone 若是是在storyboard裏面,就設置爲none類型 //關於cell的點擊響應不顯示顏色,即達到點擊無效果

71.當手指離開某行時,就讓某行的選中狀態消失

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    //當手指離開某行時,就讓某行的選中狀態消失
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    self.tableView.backgroundColor = [UIColor clearColor];

    if(indexPath.section == 0 && indexPath.row == 2){
    
    }
}

72.圖片圓形

_btnHead.layer.masksToBounds = YES; _btnHead.layer.cornerRadius = 按鈕寬的一半;  //圖片圓形

73.記一筆,關於tableView的section的header,是一個以前注意到的地方,今天忽然從新意識到的問題,這個header若是什麼都不填寫會顯示爲no header,就是取消header的顯示狀態,那麼,咱們能夠用一個空格代替的方式來達到既不想有文字展現可是又有header顯示的效果。

74.思路要清晰,要靈活,困的時候不要寫代碼,越寫越亂,困了直接去睡覺

75.要隱藏section下的cell的話,在返回section個數的地方進行相應判斷便可

76.如何改變section的headr的顏色

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{  
    UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)] autorelease];  
    if (section == integerRepresentingYourSectionOfInterest){                                  
        [headerView setBackgroundColor:[UIColor redColor]];  
    }else {    
        [headerView setBackgroundColor:[UIColor clearColor]];  
    }
    return headerView;
}

77.若是在視圖上固定了cell的行高,就不須要在代碼中重複設定

78.若是實在找不到或不肯定在哪裏使用過某個值,去放大鏡哪裏搜索看看吧。

79.雖然感受遇到的都是小的功能問題,但都是重要的邏輯性問題。

80.在作網絡請求提交的時候,若是涉及到用戶我的的信息,必定要有可以識別是哪個用戶的信息在裏面,不然會出現問題,找不到具體是哪一個用戶的信息

81.alertView的內容最好分開寫,放在一塊兒寫可能會出現調用延遲的狀況

82.UIAlertView的響應方法要想被執行,那麼UIAlertView的delegate必須是設爲self。

83.不是萬不得已,不要寫死數據和模塊

84.字符串NSString中去掉空格

NSString * string =[str3 stringByReplacingOccurrencesOfString:@";" withString:@" "];//OS字符串NSString中去掉空格(或替換爲某個字符串)

85.設置異步解析斷點時,要在方法內設置斷點,由於代碼執行不是同步進行的,不會一步一步按照順序執行下去,因此若是不是在方法內部設置斷點,可能會出現直接跳過這段方法而查看不到的斷點行爲。

86.字典NSDictionary通常的遍歷方法都是:

NSArray* arr = [yourdictonary allKeys];for(NSString* str in arr){
    NSLog("%@", [yourdictonary objectForKey:str]);
}

可是若是就這樣遍歷的話,所打印出來的結果是不按照你添加的順序打印出來的。很簡單,只要先將arr進行排序,再將字典遍歷打印出來:

NSArray* arr = [yourdictonary allKeys];arr = [arr sortedArrayUsingComparator:^NSComparisonResult(idobj1, id obj2)
{
    NSComparisonResult result = [obj1 compare:obj2];
    return result==NSOrderedDescending;
}];

就這樣,將字典的key進行一個排序後,就能根據本身的需求將字典遍歷打印出來。

87.在mac上瀏覽圖片不須要雙擊,選中後直接按空格就能夠了

88.改變字符串中個別字符的顏色:
NSString * onlineString = @"";

if (isOnline == 1) {
    onlineString = @"[在線]";
}else{
    onlineString = @"[離線]";
}
NSString * name = [NSString stringWithFormat:@"%@%@",onlineString, cell.nameLabel.text];
NSMutableAttributedString * attString = [[NSMutableAttributedString alloc] initWithString:name];
[attString addAttributes:@{NSForegroundColorAttributeName:[UIColor lightGrayColor], NSFontAttributeName:MyFont(13)} range:[name rangeOfString:onlineString]];
cell.nameLabel.attributedText = attString;

//設置text字的屬性,好比說同一個label中的不一樣字符串能夠擁有不一樣的屬性,首先初始化,NSForegroundColorAttributeName,設置字體顏色,NSFontAttributeName,字體大小,range,範圍,name rangeOfString:onlineString]],name中的onlineString。最後顯示的時候就不用text屬性,而用attributedText屬性

89.關於IOS系統升級後的屏幕適配的一個緣由:
這個緣由確實是LaunchImage沒配。不過這麼說確實容易以爲奇怪,這又不是啓動界面,直覺這倆好像沒什麼關係。因此我來說個故事……

好久之前,iPhone就是這麼矮矮的。

後來有一天,出來了iPhone5,寬度不變,高度長了一截。記得你們當時都在吐槽……

不管如何,當時 AppStore 已經有不少的app了;屏幕變了之後,原來的那些app該怎麼顯示呢?確定不能直接拉長,把方塊拉成長方形;也不能直接按拉長的屏幕尺寸渲染,雖然理論上不該該有問題,但當時有app的代碼是寫死座標+計算相結合的,直接改變確定會形成顯示錯亂。

因此蘋果想的辦法就是,給原來的app一點準備的時間,要求儘快適配新屏幕;在適配好以前,顯示的高度不變,像你看到的那樣居中顯示,上下各一道黑邊;適配好以後,再按拉長的屏幕顯示。

那麼app怎麼告訴蘋果系統,對於這劃時代的新屏幕它是準備好了仍是沒準備好呢?答案就是:LaunchImage。

系統會先看一個app有沒有4寸的LaunchImage。只要給了,那就假定已經適配好了,會按4寸顯示;反之,只要沒給,就會按3.5寸顯示,也就是你看到的黑邊。

從那之後,再推出iPhone六、6Plus的時候,也是按一樣的方法區分的。沒給3x LaunchImage的會直接拉伸顯示,給了的纔會按大屏渲染,幫助已有的app度過那青黃不接的年代。

90.界面延遲跳轉

[self performSelector:@selector(jumpToModifyInfo) withObject:nil afterDelay:2.0];  //界面延遲跳轉

91.

-(void)generateSelectedIndexPath
{

    if (![MyUtil isNilOrEmpty:self.attentionTopic]) {
        NSArray * array = [self.attentionTopic componentsSeparatedByString:@";"];
        for (NSInteger i = 0; i < array.count; i++) {
            NSString * oneTopic = array;
            for (NSInteger j = 0; j < self.categories.count; j++) {
                NSString * typeName = self.categories[j][@"mentalType"][@"type_name"];
                if ([oneTopic isEqualToString:typeName]) {
                    [self.categoryChooseStates replaceObjectAtIndex:j withObject:@(YES)];
                }
            }
        }
    }
}

//這個方法是個實際遇到的問題,首先講獲取到的字符串利用字符串的分割而轉換爲數組,這樣作的一個目的是能夠去到這個數組的count,以後進行一次小於數組長度的循環,NSString oneTopic = array;是指每循環一次都將數組內的第i個字符串賦給oneTopic,而後在進行一次針對self.categories的循環,self.categories中保存着所有的「感情話題」的數據,是一個字典,這個循環的目的就是用數組中的oneTopic去字典self.categories中遍歷尋找相同的字符串,NSString typeName = self.categoriesj[@"type_name"];這句話也是將字典self.categories中@"mentalType"的內容保存在這個字符串裏,並在這裏if ([oneTopic isEqualToString:typeName])進行對照和判斷。若是在字典中找到相同的字符串,那麼[self.categoryChooseStates replaceObjectAtIndex:j withObject:@(YES)]; 這句話就是說,根據字符串相同時所對應的index也就是這個j的值(j也能夠理解爲是第幾個字符串),來改變bool的狀態(默認爲No),當Bool爲yes是,會再其餘方法中改變cell的顯示狀態

92.

STopicViewController * vc = [[UIStoryboard storyboardWithName:@"SSTopicCollectionVC" bundle:nil] instantiateViewControllerWithIdentifier:@"sss"];
//把當前界面的self.attentionTopic的值,直接傳給下一個界面的attentionTopic
vc.attentionTopic = self.attentionTopic;
[self.navigationController pushViewController:vc animated:NO];

//關於界面傳值這個東西,也不是說邏輯上的理解,總之就是頭腦要清醒,要想清楚是怎麼傳,怎麼獲得。上面這個方法就是A類中的全局變量self.attentionTopic的值傳給B類中的全局變量attentionTopic來使用,利用

STopicViewController * vc = [[UIStoryboard storyboardWithName:@"SSTopicCollectionVC" bundle:nil] instantiateViewControllerWithIdentifier:@"sss"];

這個方法來拿到B類的實例,也就是獲取到B類,這樣就能夠獲取到B類中h文件中聲明的變量,利用A類的變量來直接賦值給B類的變量,直接改變在B類中attentionTopic的值,以此來達到見面之間傳值的目的。ps:A類視圖跳轉到B類視圖

93.
//保存選中時的數據

-(NSString *)getMentalType
{
    NSMutableArray * tmpArray = [@[] mutableCopy];
    for (NSInteger i = 0; i < self.categoryChooseStates.count; i++) {
        BOOL isChoose = [self.categoryChooseStates boolValue];
        if (isChoose) {
            [tmpArray addObject:self.categories[@"mentalType"][@"type_name"]];
        }
    }
    if (tmpArray.count == 0) {
        return @"";
    }
    NSString * string = [tmpArray componentsJoinedByString:@";"];
    return string;
}

//至關於整個方法就是調用最後這個返回的string

94.網絡解析更換借口地址後,參數記得同時調整

95.傳值要在界面跳轉以前完成,先有數據,後有顯示

96.取到cell的index

-(void)tapComplaintBtn:(SSmyReferCell *)cell
{
    NSIndexPath * indexPath = [self.tableView indexPathForCell:cell];
    SSComplainViewController * vc = [[UIStoryboard storyboardWithName:@"MyCenter" bundle:nil]instantiateViewControllerWithIdentifier:@"complain"];
    vc.bIdStr = self.myQuestionList[indexPath.section][@"question"][@"id"];
    [self.navigationController pushViewController:vc animated:YES];

}

//取到cell的index

97.label設置邊框

//label設置邊框

CALayer * layer = [self.classLabel layer];
[layer setCornerRadius:10];
[layer setMasksToBounds:YES];
layer.borderColor = [[UIColor lightGrayColor] CGColor];
[layer setBorderWidth:1];
[self.view addSubview:self.classLabel];

98.調用方法時,要遵循代理協議
textView.delegate = self;設置好委託。就能響應
-(void)textViewDidBeginEditing:(UITextView *)textView方法
-(void)textViewDidEndEditing:(UITextView *)textView方法了

99.text居中顯示

cell textLabel textAlignment = UITextAlignmentCenter  //cell.label的text居中顯示

100.關於Label顯示不完過長字符串的問題,在視圖右邊調整行數,以及右上的寬度,outLaout不要約束寬度

101.在強調一遍,界面傳值時,A傳值給B,如今B界面的頭文件中聲明好用來保存的參數,而後,在A界面實例化B的類名,而後objectB.用於保存的參數=A的self.傳值的參數

102.調用A類方法時,注意在B類頭文件中聲明想要引用的對應的方法名

103.想要拿到具體數據時,接口解析後返回的參數要看清楚字段的數量和名稱
如:

(lldb) po responseObject[@"data"]
{
    code = 0;
    complaint =     {
        "b_id" = 889;
        "b_type" = 1;
        content = Tyyygggghhjgffddcvvbb;
        "create_time" = "2015-10-19 00:39:16";
        id = 19;
        "reason_id" = 2;
        state = 0;
    };
    msg = "\U64cd\U4f5c\U6210\U529f";
}

就應該以responseObject@"data"[@"state"]的形式來調用

104.解析到參數內容是整數的,須要進行比較時,以下處理:

NSInteger state = [responseObject[@"data"][@"complaint"][@"state"] integerValue];
if(state == 1){
    self.handleState.text = @"客服已處理";
}else{
    self.handleState.text = @"處理中";
}

105.swift用let來聲明常量,用var來聲明變量。常量與變量名不能包含數學符號,箭頭,保留的(或者非法的)Unicode 碼位,連線與製表符。也不能以數字開頭,可是能夠在常量與變量名的其餘地方包含數字。

106.swift你能夠更改現有的變量值爲其餘同類型的值,如:friendlyWelcome的值從"Hello!"改成了"Bonjour!"。與變量不一樣,常量的值一旦被肯定就不能更改了。嘗試這樣作會致使編譯時報錯.

107.swift你能夠用println函數來輸出當前常量或變量的值,println是一個用來輸出的全局函數,輸出的內容會在最後換行。若是你用 Xcode,println將會輸出內容到「console」面板上。(另外一種函數叫print,惟一區別是在輸出內容最後不會換行。)

108.swift與 Cocoa 裏的NSLog函數相似的是,println函數能夠輸出更復雜的信息。這些信息能夠包含當前常量和變量的值。

Swift 用字符串插值(string interpolation)的方式把常量名或者變量名當作佔位符加入到長字符串中,Swift 會用當前常量或變量的值替換這些佔位符。將常量或變量名放入圓括號中,並在開括號前使用反斜槓將其轉義:

println("The current value of friendlyWelcome is (friendlyWelcome)")
// 輸出 "The current value of friendlyWelcome is Bonjour!
//意思就是輸出printIn內參數的值或內容
object-c中的寫法就是 Dlog(@"The current value of friendlyWelcome is %@",friendlyWelcome);
就是這點區別

109.若是在上一個if中進行了bool型判斷,那麼爲了不列表上下滑拉刷新時所形成的顯示混亂,那麼就要在下面的else中寫入相反的bool量,即代碼的重用問題

110.與其餘大部分編程語言不一樣,Swift 並不強制要求你在每條語句的結尾處使用分號(;),固然,你也能夠按照你本身的習慣添加分號。有一種狀況下必需要用分號,即你打算在同一行內寫多條獨立的語句:

let cat = "?"; println(cat)
// 輸出 "?"

110.swift你能夠訪問不一樣整數類型的min和max屬性來獲取對應類型的最大值和最小值:

let minValue = UInt8.min  // minValue 爲 0,是 UInt8 類型的最小值
let maxValue = UInt8.max  // maxValue 爲 255,是 UInt8 類型的最大值

111.Double表示64位浮點數。當你須要存儲很大或者很高精度的浮點數時請使用此類型。

Float表示32位浮點數。精度要求不高的話能夠使用此類型。
注意:
Double精確度很高,至少有15位數字,而Float最少只有6位數字。選擇哪一個類型取決於你的代碼須要處理的值的範圍。

112.Swift 是一個類型安全(type safe)的語言。類型安全的語言可讓你清楚地知道代碼要處理的值的類型。若是你的代碼須要一個String,你絕對不可能不當心傳進去一個Int。

113.當推斷浮點數的類型時,Swift 老是會選擇Double而不是Float。
若是表達式中同時出現了整數和浮點數,會被推斷爲Double類型

114.不一樣整數類型的變量和常量能夠存儲不一樣範圍的數字。Int8類型的常量或者變量能夠存儲的數字範圍是-128~127,而UInt8類型的常量或者變量能存儲的數字範圍是0~255。若是數字超出了常量或者變量可存儲的範圍,編譯的時候會報錯:

let cannotBeNegative: UInt8 = -1
// UInt8 類型不能存儲負數,因此會報錯
let tooBig: Int8 = Int8.max + 1
// Int8 類型不能存儲超過最大值的數,因此會報錯

115.Swift 有兩個布爾常量,true和false:

let orangesAreOrange = true
let turnipsAreDelicious = false

116.若是你在須要使用Bool類型的地方使用了非布爾值,Swift 的類型安全機制會報錯。下面的例子會報告一個編譯時錯誤:

let i = 1
if i {
    // 這個例子不會經過編譯,會報錯
}

然而,下面的例子是合法的:

let i = 1
if i == 1 {
    // 這個例子會編譯成功
}

i == 1的比較結果是Bool類型,因此第二個例子能夠經過類型檢查。相似i == 1這樣的比較,請參考基本操做符。

和 Swift 中的其餘類型安全的例子同樣,這個方法能夠避免錯誤並保證這塊代碼的意圖老是清晰的。

117.shift+command+k 開關模擬器鍵盤

118.關於判斷tableView上拉下滑移動的一個思路:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{

    if (scrollView.contentOffset.y > _oldOffset) {//若是當前位移大於緩存位移,說明scrollView向上滑動

    }

    _oldOffset = scrollView.contentOffset.y;//將當前位移變成緩存位移
}

//就是聲明一個變量_oldOffset,初始化爲0,由於建立tableView時偏移量爲0。而後把每次偏移後的值賦值給_oldOffset,下一次的時候跟上一次比較就能判斷是上移仍是下移了
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    oldY = scrollView.contentOffset.y;
}

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
   if( scrollView.contentOffset.y > oldY) {
      //向下
    }else{
     //向上
    }

}

//這樣也能夠

119.能夠在storyBoard的右邊Class Prefix處設立類的前綴,統一類名格式

120.如何去除tableView頂端的空白
在包含這個tableview的controll裏面添加:

self.automaticallyAdjustsScrollViewInsets = NO;

解決。

121.想要透明的話就直接設置navigationbar透明,而不是顏色透明,在navigationbar上面再加個view,就能夠對view的顏色設置clearcolor,這是個取巧的方法,挺不錯的。

若是navigationbar出現黑色是由於一開始個人這個controllerVIew在navigationbar那個位置上沒有東西,也就是覆蓋到navigationbar上面的view顏色是空,而window的顏色也是空的,因此形成了出現黑色的狀況 ,解決方法:把tableView拖拽至頂部,讓navigationbar的底下有內容便可。

就是和他們說的不能把window的backgroundColor設爲透明色同樣,由於window是最底層了,再透明就沒東西了。

window的backgroundColor能夠設爲透明色,可是結果就是黑色。

122.去掉navigationbar下面的黑色邊線

//去掉navigationbar下面的黑色邊線
[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];

123.不能把jpg格式的圖片,直接改爲png,這樣模擬機上能看見,真機上看不見

124.設置底部tabBar,只須要在AppDelegate.m中引入寫好的tabBarController的h文件,並

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
KeanTabBarViewController * tabBarController = [[KeanTabBarViewController alloc]init];
self.window.rootViewController = tabBarController;
[self.window makeKeyAndVisible];

125.Thread 1: signal SIGABRT類型的錯誤,實際上都是具體的某種內部的錯誤,而後最終傳遞到上層的thread的,而報此錯誤的。
而解決了內部的具體的錯誤,此種thread的signal SIGABR,也就算是解決了。
其實thread 1 breakpoint 1.1不是你的程序出錯,而是你人爲(應該是不當心設置了)的爲某一行程序添加了breakpoint,因此xcode就在那兒停了。

126.若是斷點指向內存,那麼就是初始化時分配內存時出了問題

127.真機調試:設置 -> 通用 -> 描述文件 -> "你的AppleID" 選擇信任

128.launchImage有時候會出現第一次運行顯示不正常的狀況,通常把App刪除從新run一遍就行了。

129.延遲進程

//延遲線程進程3秒(目的爲了延長LaunchImage的顯示時間)
[NSThread sleepForTimeInterval:3.0];

130.ios 支持多個層次的多線程 編程,層次越高的抽象程度越高,使用起來也越方便,也是蘋果最推薦使用的方法。

131.蘋果不容許修改launchImage的顯示時長,因此要想延長啓動頁的顯示時間,就須要對線程的進程進行適當的阻塞,來達到延長啓動頁的停留時間,也就是延遲線程進程

132.com.公司名.項目名

133.撤銷鍵盤
//點擊return撤銷鍵盤

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
    [self.account resignFirstResponder];
    [self.password resignFirstResponder];
    return YES;
}

//撤銷鍵盤

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    [self.account resignFirstResponder];
    [self.password resignFirstResponder];
}

//其實最簡單的仍是

[self.view endEdit:YES];

134.同一個controller切換界面時必定要刷新一遍

135.隱藏首頁NavigationBar
//隱藏首頁NavigationBar
這個問題曾經也困擾過我。如今我給出正解。

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
 
    [self.navigationController setNavigationBarHidden:YES animated:animated];
}
 
-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
 
    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

注意,animated設爲YES,還是會有一個瞬間的過渡效果。只有設置爲animated才能真正實現。

136.若是任意行數,則設置label.numberOfLines=0;

137.設置根據字符串大小自適應的label,在設置outLayout的時候選擇Relation的Greater Than or Equal是大於等於該值的效果

138.

[quizCell.photoButton addTarget:self action:@selector(selectImage) forControlEvents:UIControlEventTouchUpInside];
//在controller類中實現cell中控件功能的方法 ,即在controller中找到cell中Button的tag值,而後單擊cell中Button時調用controller中的方法

139.view的自適應和label同樣要勾選擴展高度

140.在使用自定義view代理執行控制類中的方法時,在調用view視圖顯示時,無需初始化生成一個UIVIew,直接頭文件引用view的類便可

141.

[segment titleForSegementAtIndex:___];
//獲取segment文字內容的方法

142.解決xocde7之後出現的使用scollVIew進行約束時自動下移60個位量的問題:使用storyBord進行約束,右下角右數第二個圖標,先刪除scrollVIew全部約束後,去掉勾選的constrain to magins,進行四周約束,而且更新約束便可

143.reloadInputViews 這個方法從新載入輸入視圖,通常就是刷新鍵盤,定義鍵盤的時候 用這個方法,惋惜的是,view沒法像tableView那樣reloadData更新視圖數據,只有手動更新或手繪了

144.其實吧 程序員須要有本身獨立的思考,不應當成任務完成同樣對照效果圖

145.

imageView.userInteractionEnabled = YES;//能夠進行對imageView進行手勢響應,是手勢響應前的必備的一步

146.view視圖或cell視圖加載緩慢,須要在viewDidload中先將視圖加載出來,而不是點擊segment後才進行加載

147.自定義搜索:
一個UIView 上面放uitextfield+uiimageview==自定義search

148.先百度、谷歌、找博客,找cocoachina,找github,stackoverflow,再沒有,就去研究蘋果的官方文檔 第三方的官方文檔

149.若是想要將上述數據類型的數據永久保存到NSUserDefaults中去,只須要簡單的操做(一個Value 一個Key ),例如,想要保存一個NSString的對象,代碼實現爲

//將NSString 對象存儲到 NSUserDefaults 中
NSString *passWord = @"1234567";
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:passWord forKey:@"userPassWord"];
將數據取出也很簡單,只須要取出key 對應的值就行了,代碼以下:
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSString *passWord =   user objectForKey:@"userPassWord"];

150.

control reaches end of non-void function  
//缺乏返回值
return self

151.

id birthday = [MyUtil getNoneNillObject:responseObject[@"childBirthDay"]];//過濾一遍,防止對象中出現空值致使崩潰,一個防崩處理,遇到空值返回一個空的字符串@"",而不是讓其遭遇null或nil沒法執行
[MyUtil saveObject:birthday forKey:@"childBirthDay"];//保存要根據要求,而不是說把整個字典保存起來

152.setTintColor是控制的navigationController上全部按鈕控件的顏色

153.代理遇到「existing instance variable '1' for property '2' whith assign attribute must be _unsafe_unretained」問題時
例:id <MDSpreadViewDataSource> _dataSource改成id <MDSpreadViewDataSource>__unsafe_unretained _dataSource;

154.arc自動內存管理,關掉你須要手動釋放

155.

[self.dailyAndDietView.upType setTitle:@"疾病種類" forState:UIControlStateNormal];
//設置點擊和非點擊button的title時

156.[self.view endEditing:YES]; 鍵盤立馬關閉

157.datePicker設置格式

datePickerView.datePicker.datePickerMode = UIDatePickerModeDate;//顯示類型(只顯示年月日)
datePickerView.datePicker.minuteInterval = 30;//分鐘間隔
datePickerView.datePicker.minimumDate = [NSDate date];//最小日期

158.
不要這樣寫:

UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 300, 200)];

這樣寫分開寫就能夠改變大小了:

UIDatePicker *datePicker = [[UIDatePicker alloc] init];
datePicker.frame = CGRectMake(0, 0, 300, 200);

159.時間範圍,從當前時間——後面3天

//時間範圍,從當前時間——後面3天
//    NSData * dateMin = [NSDate date];
self.datePicker.minimumDate = [NSDate date];
NSDate * dateMax = [NSDate dateWithTimeIntervalSinceNow:3*24*60*60];
self.datePicker.maximumDate = dateMax;
//自動滾回當前日期

160.KVO模式
KVO,即:Key-Value Observing,它提供一種機制,當指定的對象的屬性被修改後,則對象就會接受到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改後,KVO就會自動通知相應的觀察者了。

161.dateFormatter顯示格式

[dateFormatter setDateFormat:@"yyyy年MM月dd日 EEEE"];EEEE爲星期幾,EEE爲周幾
[dateFormatter setDateFormat:@"yyyy-MM-ddHH:mm:ss"];
[dateFormatter setDateFormat:@"yyyy年MMMMd日"];//MMMM 爲xx月,一個d能夠省去01日前的0

162.注:Objective-C不支持long double類型。@encode(long double)返回d,與double是同樣的。

163.objc_property_t
objc_property_t是表示Objective-C聲明的屬性的類型,其實際是指向objc_property結構體的指針,其定義以下:
typedef struct objc_property *objc_property_t;

164.使用objc_property_t時報錯

#import <objc/message.h>
objective_c動行時庫已經有這樣的功能。使用這些方法須要加頭文件
objc_property_t

165.先保留一個方法
//修改datePicker的系統控件

unsigned int outCount;
int i;
objc_property_t *pProperty = class_copyPropertyList([UIDatePicker class], &outCount);
for (i = outCount -1; i >= 0; i--)
{
    // 循環獲取屬性的名字   property_getName函數返回一個屬性的名稱
    NSString *getPropertyName = [NSString stringWithCString:property_getName(pProperty) encoding:NSUTF8StringEncoding];
    NSString *getPropertyNameString = [NSString stringWithCString:property_getAttributes(pProperty) encoding:NSUTF8StringEncoding];
    
    //關閉當日高亮屬性
    SEL selector = NSSelectorFromString(@"setHighlightsToday:");
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDatePicker instanceMethodSignatureForSelector:selector]];
    BOOL no = NO;
    [invocation setSelector:selector];
    [invocation setArgument:&no atIndex:2];
    [invocation invokeWithTarget:self.datePicker];
    
    
    if([getPropertyName isEqualToString:@"textColor"])
    {
        [self.datePicker setValue:kColorPink forKey:@"textColor"];
    }
    NSArray * array = [[NSArray alloc] initWithObjects:getPropertyName, nil];
    NSLog(@"%@",array);
    NSLog(@"%@====%@",getPropertyNameString,getPropertyName);
}

166.text對齊格式

[nowPickerShowTimeLabel setTextAlignment:NSTextAlignmentLeft];//左邊對齊
//text對齊格式

167.記一個關於datePicker選擇日期隨滾輪實時變更的方法:

self.datePicker.datePickerMode = UIDatePickerModeDate;//格式 
//默認顯示
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd EEEE"];
NSString * dateString = [dateFormatter stringFromDate:[NSDate date]];
self.dateLabel.text = dateString;

[self.datePicker addTarget:self action:@selector(dateChanged:) forControlEvents:UIControlEventValueChanged];//委託

-(void)dateChanged:(id)sender{//動做類
    UIDatePicker * control = (UIDatePicker *)sender;
    NSDate * _date = control.date;

    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
   [dateFormatter setDateFormat:@"yyyy-MM-dd EEEE"];
    NSString * dateString = [dateFormatter stringFromDate:_date];
    self.dateLabel.text = dateString;
}

168.經過日期求星期

//經過日期求星期
-(NSString*)fromDateToWeek:(NSString*)selectDate
{
    NSInteger yearInt = [selectDate substringWithRange:NSMakeRange(0, 4)].integerValue;//取第0~4位
    NSInteger monthInt = [selectDate substringWithRange:NSMakeRange(4, 2)].integerValue;//取第4位的後兩位
    NSInteger dayInt = [selectDate substringWithRange:NSMakeRange(6, 2)].integerValue;//取第6位的後兩位
    int c = 20;//世紀
    long int y = yearInt -1;//年
    long int d = dayInt;
    long int m = monthInt;
    int w =(y+(y/4)+(c/4)-2*c+(26*(m+1)/10)+d-1)%7;
    NSString *weekDay = @"";
    switch (w) {
        case 0:
            weekDay = @"星期日";
            break;
        case 1:
            weekDay = @"星期一";
            break;
        case 2:
            weekDay = @"星期二";
            break;
        case 3:
            weekDay = @"星期三";
            break;
        case 4:
            weekDay = @"星期四";
            break;
        case 5:
            weekDay = @"星期五";
            break;
        case 6:
            weekDay = @"星期六";
            break;
        default:
            break;
    }
    return weekDay;
}

169.獲取當前年月日,星期

//獲取當前年月日,星期
-(int)getCurrentTimeWith:(State)state
{
    NSDate* date = [NSDate date];
    NSCalendar* calendar = [NSCalendar currentCalendar];
    NSDateComponents* comps = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSWeekdayCalendarUnit) fromDate:date];
    switch (state) {
        case year:{
            return [comps year];
        }
            break;
        case month:{
            return [comps month];
            break;
        }
        case day:{
            return [comps day];
            break;
        }
        case week:{
            return [comps weekday]-1>0?[comps weekday]-1:7;
            break;
        }
        default:
            break;
    }
}

h.
#import <UIKit/UIKit.h>
#import "InfoView.h"
typedef enum{
    year=0,
    month,
    day,
    week
}State;

//彷佛是個能夠得到日曆屬性的方法
NSCalendar日曆

170.關掉webview的垂直滑動性,把.bounce關掉,能夠試試
還有重寫了-(void)scrollViewDidScroll:(UIScrollView *)scrollView方法在webview的scrollView的scrollView.contentOffset.y發生改變時,再設回0 就不滑了

171.寫的是tableViewCell裏面嵌套webview的,先在自定義單元格類的_webview的懶加載裏(我用懶加載添加webview的)設置一下tag值,_webView.scrollView.tag = 11;
在-(UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
設置cell.webView.scrollView.delegate = self;
重寫

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.tag == 11)
    {
        if (_tableView.contentOffset.y < 634.5)
        {
                
            _tableView.contentOffset = CGPointMake(_tableView.contentOffset.x, _tableView.contentOffset.y + scrollView.contentOffset.y);
            scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, 0);
        }
        else if (scrollView.contentOffset.y < 0)
        {
            _tableView.contentOffset = CGPointMake(_tableView.contentOffset.x, _tableView.contentOffset.y + scrollView.contentOffset.y);
            scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, 0);
        }
    }
    
}

就實現了Cell裏面嵌套webview,同步滑動
基本上除了加載慢一點以外,看不出來最後一行Cell用的是網頁

有個問題,當頁面所有都是webview,也就是我用來展現webview的自定義Cell佔滿整個屏幕時,pop回上個界面會崩潰,把pop動畫關了就行了,由於時間須要響應

172.畫線是必定要在drawRect裏面的
在view上劃一條直線,用到CGContextSetRGBStrokeColor

CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);//畫筆顏色設置

173.之後遇到編譯的Bug就選擇xcode的product的cleran,選擇一次以後按住option鍵,再選擇cleran build,基本就能夠了

174.記一個機智的方法,能夠再安裝包的resources裏找到軟件的所偶icns圖標

175.改變字體第幾個的方法

//應該是改變字體第幾個的方法

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"點擊註冊表明您已經贊成咱們的《用戶協議》"];
    NSRange strRange = {14,6};
    [str addAttribute:NSForegroundColorAttributeName value:[UIColor colorInSkinWithKey:@"useColor1"] range:strRange];  //設置顏色
    [str addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:strRange];


 [_radioButton setAttributedTitle:str forState:UIControlStateNormal];

176.一進入界面的時候會調用tableview的datasource方法,你看是否是數據還沒請求到你就使用這個值了

177.一個低級失誤

"list" :   {
        "id" : "11c334bc-0c9e-4c20-9b2e-af5e434d4ca7",
        "childId" : "0535001201500246",
        "childName" : "姜依霖",
        "hospitalId" : "0535001",
        "hospitalName" : "招遠市人民醫院",
        "questionTitle" : "大便頻繁,不拉肚子",
        "questionContent" : "寶寶50天,這兩天隔兩小時就大便,一次就一小坨,肚子不疼,睡覺放屁就拉。醒着也頻繁拉。母乳餵養,大便金黃色,寶寶吃睡都正常。之前是一天一次大便,一次拉不少。",
        "questionType" : "醫(疾病防治)",
        "submitDate" : 1438764312000,
        "activeFlag" : false,
        "childAge" : 1,
        "childAgeName" : "1個月",
        "readFlag" : false,
        "sex" : "女",
        "hasPic" : false
      }

//這個list是個數組,數組裏面是字典,由於有key啊,有key就是字典,取這裏面值的時候直接根據字典的key取值就能夠了

178.限制textFeild輸入內容

//限制textFeild輸入內容
-//建立
1.
phonetext = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, self.bounds.size.width-width, 25)];
...... //設置相關屬性

2.關聯上selector. 注意: 事件要forControlEvents:UIControlEventEditingChanged
[phonetext addTarget:self action:@selector(changePhoneNumValue) forControlEvents:UIControlEventEditingChanged];//手機號碼

3.實現selector
-(void)changePhoneNumValue
{
    int MaxLen = 15;
    NSString* szText = [phonetext text];//把輸入的字符給szText
    if ([phonetext length]> MaxLen)//若是超過規定長度
    {
        phonetext.text = [szText substringToIndex:MaxLen];//將規定長度的字符保留,並從新賦給
szText
     }
}

179.若是有個cell把delega指向了self,銷燬時,assign的時候 必須=nil,weak的時候沒必要。
weak的時候自動銷燬 可是設置delegate的時候是assign 在銷燬的時候 必定要delegate=nil
那就是在self的dealloc 再找回這個cell 再delegate=nil
當這個cell不用的時候 =nil 出現的時候 =self 這樣作 沒意義 並且全部的delegate如果assign的話 在控制器銷燬的時候 都應該=nil 否則的話,可能在某一個時間點。當這個控制器銷燬的時候,app會蹦掉,那時候你找都找不到在那蹦的,蹦的緣由是什麼因此,必定要在控制器消失的時候,把assign的delegate所有都=ni

180.

-(void)dealloc{
    self.delegate = nil;
    [super dealloc];
}

181.好比說在界面間傳值的時候,對類的初始化,是在用的時候初始化,在全局用變量初始化時實際上最後的結果和使用時的類不是同一個東西,因此,在用的時候再初始化

182.通常傳值過去爲空,都是初始化的緣由

183.long型轉化爲日期,long型就是1970年到要轉換的日期的秒數

double theDate = [self.theQuestion[@"submitDate"] doubleValue]/1000;
        NSDate * date = [NSDate dateWithTimeIntervalSince1970:theDate];
        NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy年MM月dd日"];
        NSString * dateString = [dateFormatter stringFromDate:date];
        myQuizCell.dateStirng = dateString;

184.那既然僅僅是「更新展現」出已有的數據源,那麼爲什麼常常出現這麼一個狀況,當進行網絡請求時,好比將返回數據存放在數組中,在請求內部這個數組是確保拿到了返回的值,確保是有值的,而後在其餘地方調用數組時,若是在請求中沒有[self.tableView reloadData] ,那麼就會形成數組的值爲nil,這個是由於異步的緣由仍是這句話的緣由?
能夠肯定是異步形成的緣由,沒有加載到數據就開始進行引用,因此須要在引用前就及時的「刷新」數據源,以避免形成下面出現空值

185.網絡請求成功和失敗的返回形式

NSDictionary * parameters = @{@"from":@"ios", @"secretKey":secretKey, @"username":name, @"childId":childId, @"inputDate":date, @"height":height, @"weight":weight};
[AFNetManager postWithUrl:URL_ADDGROWTHMONITOR parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) 
{
   DLog(@"R: %@",responseObject);//這裏只是指參數和地址請求成功,並不表明執行成功
} failure:^(NSURLSessionDataTask *task, NSError *error) 
{
   DLog(@"E: %@",error);//這裏表示url地址請求失敗
}];

**186.舉個例子,實際上加載的collectionView背景色變成黑色,tableView同理
self.view.backgroundColor 和 self.collectionView.backgroundColor 是不同的。**

187.view的一些方法使用狀況

  • viewDidLoad-加載視圖

  • viewWillAppear-UIViewController對象的視圖即將加入窗口時調用;

  • viewDidApper-UIViewController對象的視圖已經加入到窗口時調用;

  • viewWillDisappear-UIViewController對象的視圖即將消失、被覆蓋或是隱藏時調用;

  • viewDidDisappear-UIViewController對象的視圖已經消失、被覆蓋或是隱藏時調用;

  • viewVillUnload-當內存太低時,須要釋放一些不須要使用的視圖時,即將釋放時調用;

  • viewDidUnload-當內存太低,釋放一些不須要的視圖時調用

188.設置自定義視圖的位置,不要把位置寫死

189.//scrlloView使用outLayout約束佈局的方法後,設置view的Frame,要使用這個- (void)viewDidLayoutSubviews方法

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    [self questionView];//視圖加載要在這裏,而不是viewDidLoad
}

-(void)questionView{//我要提問
    if (self.customView) {//若是有了 就只執行一次
        return ;
    }
    NSArray * nib = [[NSBundle mainBundle]loadNibNamed:@"QuizView" owner:self options:nil];
    self.customView = [nib objectAtIndex:0];
    
    //得到屏幕的Frame
    //        CGRect tmpFrame = [[UIScreen mainScreen] bounds];
    
    //設置自定義視圖的位置,不要把位置寫死
    self.customView.frame = CGRectMake(0, self.tableView.frame.origin.y, 320, self.tableView.frame.size.height);//這裏不能寫死高度,不然scrollview沒法滑動
    
    [self.customView.photoButton addTarget:self action:@selector(selectImage) forControlEvents:UIControlEventTouchUpInside];
}

190.ayoutSubviews是UIView中的屬性方法,即只要繼承於UIView,就能夠使用這個方法,這個方法也很強大,如下是他的觸發時機:

一、init初始化不會觸發layoutSubviews
二、addSubview會觸發layoutSubviews
三、設置view的Frame會觸發layoutSubviews,固然前提是frame的值設置先後發生了變化
四、滾動一個UIScrollView會觸發layoutSubviews
五、旋轉Screen會觸發父UIView上的layoutSubviews事件
六、改變一個UIView大小的時候也會觸發父UIView上的layoutSubviews事件

在這些觸發狀況下,咱們就能夠妙用他,好比說改變數據等等,這是個很不錯的方法,並且咱們也能夠手動調用,即

[self setNeedsLayout];

注意:調用layoutSubviews,也須要調用它的父類方法,即

[super layoutSubviews]

傳說若是不調用的話會出現奇怪的問題。

191.當scrollView下滑時,底邊控件顯示不完時,去設置一下constraints的bottom的constans的約束距離就能夠了

192.controller的類在傳值的時候是不能夠直接Init初始化的,而是要用標識符找到。初始化就會形成你找不到它裏面原本聲明的參數

193.//這句也能夠實現去除tableView頂部空白,即放棄自動調整佈局(tableView的scrollView屬性的自動佈局)

self.automaticallyAdjustsScrollViewInsets = NO;//去除tableView頂部空白

194.若是遇到判斷字符串不執行便跳過等一系列問題,那麼極可能是在轉換和執行條件不符上面出了問題

195.在有navigation的界面中,約束出現問題就最好Push一個有navigation的界面,scrollView底部沒有撐滿時不會滑動,viewController切換界面的時候要找準方法調用的地方

196.在有scrollView的狀況下,加在視圖的調用仍是應該寫在viewDidLayoutSubviews裏面

197.git在pull出現非衝突性錯誤而沒法正常繼續時,:wq

198.用手勢比用單一按鈕好,方法要科學

199.對於像textField這種不一樣於Button自己具備點擊事件的控件來講,拖一個關聯響應事件至關於調用一個其中的代理方法,只有像button那種touch down纔是點擊,by the way,textFiled的editing did end就是結束編輯時調用的方法,button取消計時器閃爍的效果,把button定義爲自定義類型而不是系統類型便可

200.不要去試圖判斷顏色相等,這是不可靠的

201.傳值理解的不夠透徹,會很惱火

202.小結一下:
1.關於光標自動跳轉到下一行這種事,直接呼出下一行的鍵盤就能夠實現了
2.若是說在調用的方法中有調回主界面之類的方法後,那麼就不要再在下面先執行跳轉回根視圖之類的操做,尤爲是異步的時候
3.保存在字典裏的KEY的名字和參數的KEY要分清楚

203.能夠暫時理解爲,刷新view

[self setNeedsDisplay];

204.如下是用來btn逐漸顯示出來用的

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.01];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(endAnimation)];
//在這裏設置透明度爲0,就會慢慢變成0
[UIView commitAnimations];

205.若是須要推送消息,則要到蘋果官網上製做證書,再到環信後臺製做推送證書.

206.傳值拿到nil幾乎都是初始化的問題,內存地址未保存

207.當xib找不到Identifier的時候,極有多是由於你的xib裏面包含了cell外面的其餘控件

208.在autLayout設置的時候,當第一個設置好約束後,其他的以其爲標準進行設置

209.在UILable中lineBreakMode中有如下幾個功能

1.NSLineBreakByWordWrapping = 0 //以空格爲邊界,保留單詞,根據計算結果從新設置UILabel的尺寸 。

2.NSLineBreakByCharWrapping //保留整個字符3.NSLineBreakByClipping //簡單剪裁,到邊界爲止
4.NSLineBreakByTruncatingHead //前面部分文字以……方式省略,顯示尾部文字內容

5.NSLineBreakByTruncatingTail //結尾部分的內容以……方式省略,顯示頭的文字內容。

6.NSLineBreakByTruncatingMiddle //中間的內容以……方式省略,顯示頭尾的文字內容。

210.在tableView的cell當中,取決於section決定的數組,用indexPath.section決定,取決於row的數組,用indexPath.row決定

211.git衝突時,須要刪除的是同時修改的部分,而同時添加的不須要刪除

212.你要使用第三方,就要爲這個第三方工具的bug負責,不要說到時候我改不了這個bug,是第三方的緣由云云

213.關閉cell的點擊

-(nullable NSIndexPath *)tableView:(UiTableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
開關開 return indexpath開關關 return nil

214.上拉刷新時須要的邏輯

if([@"success" isEqualToString:value]){            
           [LCProgressHUD hide];            
           [self.tableView.pullToRefreshView stopAnimating];            
           [self.tableView.infiniteScrollingView stopAnimating];            
          if (self.page == 1) {               
                  self.questionInfo = responseObject[@"rtn"][@"body"][@"list"];                            
     }else{                
                  NSArray * array = responseObject[@"rtn"][@"body"][@"list"];                
                  NSMutableArray * tmpArray = [self.questionInfo mutableCopy];//把以前的保存在可變數組中,可變數組就是長度能夠變化就是死的能夠添加和刪除的               
                  [tmpArray addObjectsFromArray:array];//加載到以前數據的身後                
                  self.questionInfo = [tmpArray copy];//再返回給保存的數組,使tableView的number返回行數發生相應改變            
      }           
                  [self.tableView reloadData];        
}

215.BOOL型變量若是不作特別處理,那麼其值爲no

216.有些開發者,在判斷數組是否爲空時,會寫成
if (array != nil)
或是: if (array.count != 0)
其實嚴格來講,這兩種寫法,都是考慮不足而且不穩定的,而且忽略了一種更常見的狀況。
首先來講一下,兩者之間的區別。
array == nil
這種狀況指的是這個array對象是一個nil對象,而不是一個NSArray類型對象。nil對象是一個能夠接收任何消息的對象,它能夠賦值給任何一個對象,你對它發消息也沒什麼問題,儘管你得不到你想要的結果。
array.count == 0
這種狀況跟上一種不一樣的在於,此時的array是一個NSArray類型對象,只不過這個array裏面沒有元素。但它自己是能夠做爲NSArray對象來使用的。
而事實上,若是你是處理網絡請求的數據,取出的array是nil對象是幾乎不可能的(至少我沒遇到過),多數狀況下會出現的是另外一種狀況:
取到的array是一個NSNull對象。
NSNull是一個特殊的類,它和nil同樣,也表明空值,但兩者有區別,NSNull不接收NSArray的那些方法,它只有一個類方法:
+(NSNull *)null;
所以發送NSArray特有的方法或屬性訪問都會致使程序crash。
咱們作空值判斷的很大一部分緣由就是爲了在後臺接口數據返回一些異常數據的時候,程序能保證穩定性。
舉個例子:某些狀況下,後臺可能因爲各類緣由,對某個字段返回了null值,這時咱們取到的就是[NSNull null]這樣一個對象,再好比說,後臺可能對某一個數據取值,但取到了0個,這時返回的是一個空組,咱們取到的就是@[],空組。
所以判斷數組是否爲空,須要對各類狀況都進行判斷。寫法有不少種,好比你能夠寫成:
if (array != nil && ![array isKindOfClass:[NSNull class]] && array.count != 0)

217.iOS從URL加載圖片

+(UIImage *) imageFromURLString: (NSString *) urlstring  {      
// This call is synchronous and blocking      
      return [UIImage imageWithData:[NSData  dataWithContentsOfURL:[NSURL URLWithString:urlstring]]];  
}

218.上傳image圖片時要轉換成nsdata格式,轉換成jpeg內存小,並且最好壓縮成0.幾的

219.設置datePickerView的最小日期就能夠限制上滾功能

220.真的沒有技術解決不了的問題,只是本身以爲麻煩懶得去弄罷了

221.在給一個以前在循環中賦值的控件從新賦值時,要在循環當中實時保存這個控件(或者說實時取到這個控件),而後再取出這個控件進行從新賦值

222.在使用git的時候,要看分支名稱是不是master,不是就用其餘的

223.app默認橫屏
在 info.plist 裏增長一個屬性 Initial interface orientation
值有四個選項分別對應四個方向,選 Landscape 開頭的就是橫着的

224.clang: error: linker command failed with exit code 1 (use -v to see invocation)

ios開發這個錯誤必定少不了,現總結以下,通常這三方面的問題,若是不是哪你真可麻煩了
1.引用出錯,把*.h弄成了.m,檢查一下你的全部引用;
2.再就是你引用第三方的庫,你添加文件是系統沒有所第三方庫的.m文件參入的編譯中去,你向項目添加文件得注意了;
3.就是不當心添加的重複的類,向Entity之類,具體你能夠看這裏http://stackoverflow.com/ques...
順便說一下http://stackoverflow.com/這個網站是iso開發不可少的一個網站;
4.有些frameworks沒有添加進來也會出現上面的問題;

225.關於代縮進
你先按command + [把代碼往左縮進到最前面再按command + /註釋代碼最後按command + ]把代碼往右縮進
改成 Tab 縮進(非四個空格),再註釋,大家就會發現神奇的對齊了。

226.不要懶不要猶豫不要花時間去作無謂的思考,想到就去作就去寫,不管是什麼試一試總會知道的,敏捷的思惟比什麼都重要,比渾渾噩噩的細思縝密要清晰的多。

227.若是是有tableView的界面訪問接口,須要儲存數據,如NSArray, NSDictionary等,千萬不要忘記最重要一步,在接口數據獲取成功後加上[self.tableView reloadData];這句話,刷新tableView的數據,不然會形成NSArray或NSDictionary爲nil,沒法得到返回數據

228.運行以後顯示崩潰信息:
Terminating app due to uncaught exception 'NSRangeException', reason: '* -[NSMutableArray objectAtIndex:]: index 2147483647 beyond bounds [0 .. 12]'
數組越界,好好檢查代碼

229.關於dateFormatter
1)當你的format格式是
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; // 這裏是用大寫的 H
NSString* dateStr = [dateFormatter stringFromDate:date];
你得到就是24小時制的。
2)當你的format格式用的是
[dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; // 這裏是用小寫的 h
你得到的就是12小事制的。

230.大多時候outLayout約束label的時候不須要約束寬度,改變fram就能夠了

231.git插件插件沒有顯示x的時候能夠直接pull和push

232.切圖是能夠切割使其不變形的

233.windows的字體在xcode裏字體除以1.8

234.只要cell裏的label重寫了,是能夠直接在controller裏給它賦值的

235.記着,改變lable裏個別字符的顏色,最重要的一步是

cell.gold.attributedText = attString;

這是在改變label的text,不是直接做用於string

236.數組的count是數組內元素是從1開始的的整體數量,不是數組從0開始的的下標

237.用%@輸出,NSInterger轉換成整形變量就能夠了

cell.day.text = [NSString stringWithFormat:@"%@",@(self.day+1)];

238.若是cell中有特殊類型cell,要優先作判斷,不然可能因爲條件判斷緣由(入indexPath.row數量爲有限,判斷比較值過大時)顯示不出來,由於沒法執行到該特殊類型的判斷因此被略過

239.大多數意外斷點停在[indexPath.row]處時,幾乎都是由數組越界形成的,由於數組會將indePath.row的全部知足條件執行一遍,會出現indexPath.row大於數組元素數量的狀況,即返回行數大於數組數,多餘的cell返回行沒有數據可執行,而形成崩潰。例:indexPath.row爲12,array的元素爲10,此時array[indexPath.row]就會形成崩潰。由於一切要以數據爲基準

240.要解決cell的複用問題,說白了,就是把判斷了的地方再反判斷一次,更改了的地方再反更改一次就能夠了,上面更改了,下面就也要對這個更改負責

241.想要切割圖片,點擊右下角的show slicing

242.在-(void)drawRect:(CGRect)rect方法裏賦值的時候,基本上至關於寫死了,以後再在其餘方法裏賦值也不會改變,這至關於一開始就給view繪出了的,因此不會改變,這點須要謹慎注意

243.判斷星星數量的方法

NSInteger score = [self.array[indexPath.row][@"SCORE"] integerValue];
 //            CGFloat xoffset = 0.0f;            
for (int i = 0; i < 5; i++) {                
    UIImageView *imgview = (UIImageView *)[cell.contentView viewWithTag:i + 11];                
if (i<score ) {                    
    imgview.hidden = NO;                
} else {                    
    imgview.hidden = YES;                
}//                
    imgview.hidden = NO;            
}

244.果真二級運算和一級運算之間仍是要加括號的

245.

NSString * theFirst = [answer_phone substringToIndex:3];//截取下標3以前的字符,從0開始

246.Object或Key只能是對象(id或繼承自id的),因此字典是不能直接添加整數的

247.

int i = 1;
[dic addObject:[NSNumber numberWithInt:i] forKey:@"somekey"];//或者[dic addObject:@1 forKey:@"somekey"];//取出時
i = [[dic objectForKey:@"somekey"] intValue];
//能夠不轉換成字符串

248.直接輸出整數

cell.gold.text = [NSString stringWithFormat:@"%@枚金幣", @(goldsNumber)];

249.Decimal Pad實數鍵盤,包括小數點和數字

250.判斷字符串中是否含有某一字符

if([roadTitleLab.text rangeOfString:@"qingjoin"].location !=NSNotFound)
//_roaldSearchText            
{                       
    NSLog(@"yes");
} else { 
    NSLog(@"no");
}

251.若是存在如:不一樣的segment展示同一種內容,但其顯示數據方式存在差別,且這種差別能夠判斷時,一般在網絡請求返回的參數中能夠有鑑別這種判斷的key值,這時最好在獲取網絡請求參數的類中以key值作出判斷。

例:

else if (self.segmented.selectedSegmentIndex == 0){        
    DetailedOfInteractionViewController * detailed = [MyUtil getViewControllerWithIdentifier:@"detailed" storyboardName:@"Interaction"];        
    detailed.theQuestion = self.questionInfo[indexPath.row];
//        detailed.isMyQuestions = NO;                
//判斷childId和帳號登陸時的childId是否相同,若是相同就表示是本身回答的問題,不相同就不是        
NSString * childId = self.questionInfo[indexPath.row][@"childId"];       
NSString * myChildId = [MyUtil getObjectForKey:DATA_LOGIN_CHILDID];        
if ([childId isEqualToString:myChildId]) {            
    detailed.isMyQuestions = YES;        
}else{            
    detailed.isMyQuestions = NO;        
}

252.reuseIdentifier,實際上能夠理解爲,只是做爲tableView的一個重用標識,做記號用,並非說必定要找到某一處標識過相同字符的控件來調用不可,只是同類的標識而已

253.重用機制調用的就是dequeueReusableCellWithIdentifier這個方法

254.Talk is cheap. Show me the code.

255.「在多寫代碼的同時,咱們也要注意不要」重複造輪子」,儘可能保證每次寫的代碼都能具備複用性。在代碼結構由於業務需求須要變動時,及時重構,在不要留下技術債的同時,咱們也要多思考如何設計應用架構,可以保證知足靈活多變的產品需求。
在屢次重構和思考的過程當中,咱們就會慢慢積累出一類問題的「最佳實踐」方式,成爲本身寶貴的經驗。」

256.修改textField的placeholder字體的顏色和大小

textField.placeholder = @"username is in here!";  [textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];  
[textField setValue:[UIFont boldSystemFontOfSize:16] forKeyPath:@"_placeholderLabel.font"];

257.用來隱藏navigationBar
self.navigationController.navigationBarHidden = YES;

258.單一的點擊操做其實設不設置delegate爲self都是同樣的

259.tableView的cell裏隱藏圖片直接設置hidden的bool值就能夠了,不用在cell類裏從新寫方法

260.設置button的selected以後,要把button類型改成custom自定義的

261.質量與速度不可得兼嗎,我以爲並非,衝要條件是時間。事前作好準備,即可兼顧。

262.在有scrollView的前提下,設置屏幕居中,要以scrollView爲參照物,而不是view

263.git衝突的時候=====下面是別人的,head到=====這裏面是本身的

264.關於靜態tableView,所謂的靜態就是指不經過代碼的方式來建立,主要是經過storyboard可視化配置。

265.在init裏初始化,比didLoad裏靠譜點

266.去除NavigationBar下面的線

self.navigationController.navigationBar.barStyle = UIBaselineAdjustmentNone;

267.代碼規範:else先後都有空格

268.count是數量,天然是從1開始,而row之類的是下標,天然是從0開始的,不要加錯了。好比:array.count +2,array裏面有3個元素,那麼,3+2就是5, 而array.count+2 == indexPath.row的時候,左邊表示5,而右邊表示5的時候其下標偏偏是4(由於從0開始計算),因此就會形成一個計算上的偏差,這點須要注意

269.若是在進行網絡請求時tableView界面忽然崩掉而且意外斷點沒有指向任何錯誤處,極可能是在cell中取值賦值時出了問題,好比講一個字典直接當成數組的值賦值給某個字符串

270.計算label自適應cell高度的時候,網絡請求所獲得的值記得要經過數組傳遞過去計算字符串的高度,不要傳成字典,這樣計算的是字典的高度

271.tableView的cell的單選效果,幾句代碼就ok,網上的方法都太垃圾了

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     GDFollowUpTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"FollowUp"];                
     cell.selectionStyle = UITableViewCellSelectionStyleNone;//點擊時無色        
     cell.message = self.array[indexPath.row][@"CONTENT"];                    
     if (self.chooseFlag == indexPath.row){//判斷是否被選中            
         cell.okButton.hidden = NO;        
     } else {            
         cell.okButton.hidden = YES;        
     } 
 }
 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{    
     self.chooseFlag = indexPath.row;        
     [self.tableView reloadData];
 }

272.任何的狀態判斷均可以用全局狀態保存來判斷

273.若是網絡請求持續出錯,而參數和地址又沒有問題,能夠檢查參數名稱是否所有爲大寫,後臺參數名所有爲大寫,大小寫未區分會報錯

274.有個發現的小技巧,點擊outLayout的updataFram可讓imageView自適應圖片大小,就不用再調整圖片清晰度了

275.

self.tableView.tableFooterView = [[UIView alloc] init];//初始化tableFooterView,達到去掉沒有數據的cell的目的

276.Swift 語言帶來了衆多函數式編程的特性

277.狀態是函數的魔鬼,無狀態使得函數能更好地測試

278.「有一些人老是追趕着技術,有什麼新技術無論三七二十一立馬就用,結果被各類坑。又有一些人,老是擔憂新技術帶來的技術風險,不肯意學習。結果如今還有人在用 MRC 手動管理引用計數。而我想說,咱們須要保持的是一個擁抱變化的心,以及理性分析的態度。在新技術的面前,不盲從,也不守舊,一切的決策都應該創建在認真分析的基礎上,這樣才能應對技術的變化。」

279.簡單工廠模式深刻分析:
簡單工廠模式解決的問題是如何去實例化一個合適的對象。
簡單工廠模式的核心思想就是:有一個專門的類來負責建立實例的過程。
具體來講,把產品看着是一系列的類的集合,這些類是由某個抽象類或者接口派生出來的一個對象樹。而工廠類用來產生一個合適的對象來知足客戶的要求。
若是簡單工廠模式所涉及到的具體產品之間沒有共同的邏輯,那麼咱們就能夠使用接口來扮演抽象產品的角色;若是具體產品之間有功能的邏輯或,咱們就必須把這些共同的東西提取出來,放在一個抽象類中,而後讓具體產品繼承抽象類。爲實現更好複用的目的,共同的東西老是應該抽象出來的

280.簡單工廠模式(Simple Factory Pattern)屬於類的創新型模式,又叫靜態工廠方法模式(Static FactoryMethod Pattern),是經過專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類。

281.回調是執行後回調「我」來完成,通知是通知後「我」主動去完成

282.在tableView的didSelecte裏傳值的時候,不能在cellForRowAtIndexPath裏賦值了再拿來用,由於cellForRowAtIndexPath會給每個都賦值,而didSelecte只是當前選中的cell,會形成內存問題報錯

283.若是xcode archive 一直是灰色的,當配置是模擬器的時候, archive就是灰色的。當把配置選擇爲device才能選 archive。

284.object-c中絕對值是labs()形式的,c中是abs()

285.這個方法能夠隨着輸入實時改變

-(void)textViewDidChange:(UITextView *)textView

286.目前應用開發的核心就是數據處理和展現

287.當重寫控件時,控件類型聲明的參數名,如:(textField *)textFiled,所打印出的數據爲整個控件的所有屬性的數據,如fram,內部屬性等

288.善用回調

289.其實不少東西並無別人說的那樣複雜,方法多種多樣,若是以爲功能簡單,那麼實現出來的方法就絕對不會難,其實每次本身去想想功能的執行邏輯和順序,不少東西就都迎刃而解了

290.在全局當中聲明一個cell時,在viewDidLoad裏將其屬性設置好,不要忘記將自定義的cell註冊,而後使用其標識符,在cellForRowAtIndexPath方法中若是隻有一行cell,那麼直接return這個cell就能夠了,不須要再進行任何設置了

291.業務邏輯要熟悉清楚

292."剛剛說到,在類中徹底使用 _property 的方式來訪問私有成員變量,是不會有內存管理上的問題的。可是使用 self.property 的方式來訪問私有變量是否是也是同樣不會有內存管理上的問題呢?確實也是,可是有一點須要注意:咱們最好不要在 init 和 dealloc 中使用 self.property 的方式來訪問成員變量,這一點是寫在蘋果的官方文檔裏的,我在之前的文章裏也介紹過。(見:《不要在init和dealloc函數中使用accessor》)
因此,若是你用 self.property 來訪問私有成員變量。那麼你須要注意,在 init 和 dealloc 中不使用這種方式。這其實對程序員來講是一個負擔,你須要不停提醒本身有沒有犯錯。若是你使用徹底的 _property 的方式來訪問私有成員變量,就不用想這一類問題了。"

293."我以前 Review 過一個同事的 iOS 端代碼,那個同事喜歡把 table view 的數據另外封裝成一個類,而我以爲這些數據其實就是一個數組,不必進行這一層封裝,最終咱們爭論了比較久。個人觀點是,一切隱藏都是對代碼複雜性的增長,除非它帶來了好處,例如達到了代碼複用,提升了代碼的可維護性等,不然,沒有好處的封裝只會給代碼閱讀理解帶來成本。就我如今的經歷中,大部分的 table view 的數據均可以放在一個數組中,不必把這個數組封裝起來,另外提供一套操做這個數組數據的方法。"

294."我以前歷來沒想到過這二者之間的速度和應用體積會有很大差異。不過一個同行(來自國外著名的社交網絡公司)告訴我,他們公司發現兩者仍是有不小的差距,若是大家的應用須要作一些深度優化,能夠考慮一下把 self.property 換成 _property。但我以爲,大部分應用都應該是不須要作這種深度優化的。"

295."是的,若是用 _property 這種寫法,就不能使用 KVO 和 KVC 了。可是我得反問一下,在一個類的內部,KVO 本身的私有成員變量算是一個好設計嗎?咱們講類要」高內聚,低耦合」,KVO 是爲了實現觀察者模式,讓對象之間相互解耦的。若是把 KVO 用在類的內部,KVO 本身的私有成員,我認爲其實這不是一個很好的設計。"

296."在 Swift 中,引入了 Computed Properties 的概念,其實這在 Objective-C 中也有,只是沒有專門給它名字。若是一個 property 咱們提供了對應的 setter 和 getter,而且沒有直接使用其對應的 _property 變量,那麼這個 property 就是所謂的 Computed Properties。
是的,在類的內部若是直接使用 _property 形式,也沒法使用 Computed Properties 了,但我認爲這影響不大。其實 Computed Properties 也就是一層對數據存取的封裝,咱們另外實現兩個函數,分別對應數據的 setter 和 getter 功能,就能夠達到一樣的效果。"

297."直接用私有變量有個須要特別注意的地方,在 block 裏直接寫 _property 至關於 self->_property,雖然沒寫 self,可是暗含了對 self 的retain,容易形成循環引用。要記得用 weakSelf/strongSelf 大法。這一點確實是被不少人忽視的"

298."上面提到的這些問題都是小問題,影響不大。可是代碼風格的統一倒是大問題。因此無論大家項目中使用的是 self.property 風格仍是 _property 風格,問題都不大,可是若是大家同時使用這兩種風格,那麼就很是很差了。"

299.在tabelViewController中的頂部加一個view

UIView * sengmentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 68)];
self.tableView.tableHeaderView = sengmentView;//將tableView的headerView替換成咱們要添加的view

300.改變滑動刪除的文字內容

-(nullable NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
 {    
    NSString * string = @"設置";    
    return string;
 }

301.在tableView的不一樣section之間加上header

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ 
   if (section == 0) 
{        
    return @"";   
 } else {        
    return @" ";    
}

302.collectionView cell上下左右邊距

return UIEdgeInsetsMake(1, 13, 1, 1);

303.在 Swift 的世界裏,一切皆對象

304.編程和科研是很相近的兩個職業

305.在從新開發版本時,若是不使用cocospod,那麼,在引用以前使用過的第三方類時,只須要將類複製到新的項目的文件夾內便可,不要複製整個文件夾,會形成沒必要要的麻煩

306.複製和拷貝在mac環境下的效果是不同的

307.在設置tabBar以後,要在appDelegate裏給其制定一個rootViewController

308.//獲取當前版本號

//獲取當前版本號
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];

309.當tableView底部出現大量空白又不想要時,能夠把tableView的view的背景色設爲clean,而後將controllerView的背景色設置一下就能夠了

310.關閉tableView滾動,實際上tableView是一個scrollView

self.tableView.scrollEnabled = NO;

311.順便說一句,當隱藏tabBar的時候,若是controllerView上有tableView,那麼此時你須要用下面這段代碼來讓tableView頂部不留下空白部分,適配時,scrollView頂部有空缺,也可以使用此方法解決,意思是關閉scrollView的自動適配:

self.automaticallyAdjustsScrollViewInsets = NO;

312.關於collectionView使用時須要注意的地方

  • 注意,每個item之間是存在間距的,因此要預留出間距,不然會超出預設寬度

  • 還有一點,collectionView的默認顏色就說黑色,出現黑色不是黑屏,只要調整一下背景顏色便可

313.若是要使用接口數據賦值,那麼直接在網絡請求裏賦值便可,在外面賦值因爲是異步狀況會致使沒法及時得到

314. 網絡解析獲取後臺的圖片

NSString * picture = [NSString stringWithFormat:@"%@%@%@", SERVER_IP,self.array[indexPath.row][@"Picture"],API_KEY];
cell.goodsImage.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:picture]]];

315.判斷switch是否處於開閉狀態

cell.switch.on = YES;
cell.switch.on = NO;

316.跳轉返回時有tableView的界面出現下移

//處理方法
-(void)viewWillAppear:(BOOL)animated
{
    self.automaticallyAdjustsScrollViewInsets = NO;
}

317.向後臺上傳圖片轉格式

NSData * imageData = UIImageJPEGRepresentation(self.goodsImage.image, 0.3);
//若是是須要轉換爲base64的格式,還須要加一句
goodsImage = [imageData base64EncodedStringWithOptions:0];

318.通常狀況下,用作網絡請求的paramaters字典中只存儲字符串形式的參數

319.判斷字典中元素爲空

NSDictionary * dic;

if([dic count] == 0)

{

    //....

}

320.如何查看後臺返回的數據儲存類型
直接打印出 responseObject的屬性查看
例如出現:<__NSCFArray 0x7fcedb4571a0> 說明返回類型爲數組
不過通常狀況下來講,後臺返回的基本都是以數組的形式居多,但也有例外,因此具體狀況具體分析,一切以數據爲中心
若是隻返回了諸如:

Printing description of self->_dic:
{
    BankCardNumber = 6214651002673886;
    BankName = "\U91cd\U5e86\U519c\U6751\U5546\U4e1a\U94f6\U884c.\U6c5f\U6e1dIC\U501f\U8bb0\U5361";
    CreateTime = "/Date(1458116833893)/";
    ID = 14;
    Phone = 13527310193;
    TypeId = 1;
    UserId = 171;
    UserName = "\U54e5\U54e5";
}

這種狀況,若是是用字典儲存,那麼只要去取數組的第0個就能夠了,用數組儲存就不須要特殊處理

321.判斷後臺返回的對象是否爲空的判斷方法

if (responseObject isEqual:[NSNull null])

322.iOS開發gcd問題
併發隊列能夠保證按照加入隊列的順序取出任務,可是能不能保證這些任務就是按照順序執行的。好比說任務1先加入隊列,任務2後加入隊列,有沒有可能這兩個任務被取出以後任務2先執行呢?
答案是:任務1必定先開始執行 (不必定先結束).

323.進入界面就要調用接口的方法最好寫在這裏面

-(void)viewWillAppear:(BOOL)animated

324.意外斷點打在哪裏,幾乎就能夠判定問題就出如今哪裏,只要注意查看斷點停留出的地方處理方式,就能夠解決問題

325.評分

NSInteger score = [self.replyArray[indexPath.section][@"Value"] integerValue];
    //            CGFloat xoffset = 0.0f;
    for (int i = 0; i < 5; i++) {
        UIImageView *imgview = (UIImageView *)[cell.contentView viewWithTag:i + 11];
        if (i < score ) {
            imgview.image = [UIImage imageNamed:@"xing_okimg"];
        } else {
            imgview.image = [UIImage imageNamed:@"xing_noimg"];
        }//                
//            imgview.image = [UIImage imageNamed:@"xing_okimg"];

326.關於cell自適應label高度出現佈局錯亂問題
1.檢查outLayout是否約束正確,若是該行cell高度不見,請檢查底部約束
2.聲明一個全局的cell

@interface SSShopEvaluationViewController ()<UITableViewDataSource, UITableViewDelegate, notReplyDelegate>
{
    SSEvaluationTableViewCell * myCell;
    SSAlreadyReplyTableViewCell * alreadyCell;
}

記得在viewDidLoad裏註冊

myCell = [self.tableView dequeueReusableCellWithIdentifier:@"Evaluation"];

327.視圖效果應該在視圖裏寫,控制器就讓它負責數據

328.同種類型的處理方法寫的太多會致使機械化的習慣,思惟會變得僵化,整個思路模式容易固化,不要被平常工做的繁瑣拖垮了思考的靈性

329.永遠不要試圖在cell的-(void)drawRect:(CGRect)rect方法中進行狀態保存,一旦寫入這個方法中就算寫死了,再也改變不了。
就好比一個用戶交互的開關狀態,不要寫在這裏面,去在controller的cell方法中去判別

330.在作cell自適應label高度時候,必定要固定label的寬度,不須要擔憂寬度固定小機型會超出等問題,由於在cell中是不會超出的,且左右作了約束已經

331.swift被賦值的對象若是不發生改變或不被修改,那麼就將其聲明爲let常量

332.NSString stringWithFormat 不足多少位時自動補齊0

self.mCurrentTimeLabel.text = [NSString stringWithFormat:@"d:d",minute,seconde];
不足兩位時用0補齊
 
 
float f = 12.34;
string = [NSString stringWithFormat:@".2f",f];
NSLog(@"%@", string);
_____12.34
_表明空格   這樣只有使用字符串替換的方法用0替代空格

333.swift點擊按鈕界面跳轉

@IBAction func goListButton(sender: UIButton) {
        let myStroyBoard = self.storyboard
        let listView:UIViewController = (myStroyBoard?.instantiateViewControllerWithIdentifier("list"))!
//        self.presentViewController(listView, animated: true, completion: nil)
                //上面這句表示,從下向上跳出一個controller
        self.navigationController?.pushViewController(listView, animated: true)
    }

334.swift UILabel居中

label1.textAlignment=NSTextAlignment.Left  
label2.textAlignment=NSTextAlignment.Center  
label3.textAlignment=NSTextAlignment.Right

335.swift中tableView的cell點擊無色

cell.selectionStyle = UITableViewCellSelectionStyle.None

336.關於swift中let 和 var的用法簡單距離

//讀取數組中的顏色
var colorArray:[UIColor] = [UIColor .greenColor(), UIColor .blackColor(), UIColor.orangeColor(), UIColor.grayColor(), UIColor.yellowColor(), UIColor.blueColor(), UIColor.brownColor(), UIColor.blackColor(), UIColor.purpleColor(), UIColor.redColor()]
 
let value = Int(arc4random() % 10)
let color = self.colorArray[value]
button.setTitle(self.array[value], forState: UIControlState.Normal)
button.setTitleColor(color, forState: UIControlState.Normal)

337.tableView跟隨cell數量展開

self.tableViewHeightConstraint.constant = cellNumber * cellHeight;
即tableView的高度約束等於cell的數量*cell的高度

338.後臺圖片讀取到url可是顯示不出來時,就是同步和異步的問題,由於存在網絡延遲致使圖片沒法同步讀取,因此要使用異步方法來處理

339.當url地址有問題爲nil時的解決方案

解決 代碼以下:
 NSString * url = [NSString stringWithFormat:@"網址"]; 
 NSString * newUrl = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

340.關閉tableView滑動

self.tableView.scrollEnabled = NO;

341.obeject-c繼承

#import <Foundation/Foundation.h>
#import "Shape.h"
@interface Rectangle : Shape{
    int size;
}

342.label自動換行

//老方法已通過時,被替換成以下方法(行數記得設爲0)
[self.applyInfoLabel setLineBreakMode:NSLineBreakByWordWrapping];
 
基本上老的UI方法都會被替換成NS方法,當方法被替換找不到頭緒時不妨試試

343.在存在scrollview的狀況下,想要實現控件始終跟隨屏幕底部的效果,只須要將該控件和scrollview始終處於同級狀態下設置約束便可

344.今天在實現判斷星星數量的時候遇到一個問題,從而引出接觸到一個新的概念,我姑且稱之爲控件數組。就是在某些時候存在大量同類型控件關聯大量輸出口須要使用相似collection但又不能使用的時候的一種替換方案。
使用方法:

1.關聯一個輸出口,在Outlet處選擇Outlet Collection,而後填寫名稱,即聲明成功一個該控件類型的數組
2.以後把大量相同的類型控件都關聯到該輸出口合併,從而組成數組中的元素,使用時按照普通數組的使用方法便可
代碼demo:
@property (strong, nonatomic) IBOutletCollection(UIImageView) NSArray *xing;
 
NSInteger score = [self.detailePlan[@"DIFFICULTY"] integerValue];
    for (int i = 0; i < 5; i++) {
        UIImageView * imageView = (UIImageView *)self.xing[i];
        if (i < score) {
            imageView.hidden = NO;
        } else {
            imageView.hidden = YES;
        }
//        imageView.hidden = NO;
    }

345.一般咱們使用viewWithTag以下情形:

若是咱們用了一個父View,上面放了多個子view, 每一個子view都經過從0開始的Tag值來進行標誌,以便於後期在像View上直接使用viewWithTag:tag值來取各個子View

而在用[父view viewWithTag:0]取到的view, 發現不是子view, 而是這個父view,
後來纔想起蘋果文檔上提到過一次,tag值較小的,如0-100爲蘋果保留使用, 而0就是保留着給本身這個view使用的。

對於其它的view, 如scrollview, 則更上面的0, 1,2 均可能會是保留值。

346.關於平行對齊時的約束
不須要說要垂直v的約束,只要約束參照物相同的top便可

347.cell的優化寫法

能夠聲明一個數組,直接從controller的接口中保存返回的數據
@property (nonatomic, strong) NSDictionary * plan;
 
而後在cell中集中處理顯示(並非處理數據,只是負責數據顯示)
-(void)setPlan:(NSDictionary *)plan
{
    _plan = plan;
    NSInteger type = [plan[@"TYPE"] integerValue];
    NSString * bgImageName = [NSString stringWithFormat:@"health_plan_0%@", @(type)];
    self.bgImageView.image = MyImage(bgImageName);
    self.titleLabel.text = getNoneNilString(plan[@"TITLE"]);
    self.subtitleLabel.text = getNoneNilString(plan[@"SUBTITLE"]);
    self.joinedLabel.text = [NSString stringWithFormat:@"%@人已加入", plan[@"TOTAL"]];
    id status = plan[@"STATUS"];
    if (status && !isEmpty(status) && [status integerValue] == 0) {
        self.statusImageView.hidden = NO;
    }else{
        self.statusImageView.hidden = YES;
    }
}

348.字體加粗
選擇font右邊的"T"圖標,選擇加粗bold

349.多個Button適配不一樣機型間距約束
主要是控制左右的間距問題,爲了解決不一樣機型不一樣寬度對控件形成的影響

350.如何跳轉到一個tabBar上

TabBarViewController * tabBar = [[TabBarViewController alloc] init];
        [self presentViewController:tabBar animated:YES completion:^{
            
        }];

351.tableView的cell爲nil時如何處理
多半是以前關聯在cell上的空間被刪除以後沒有刪除其對應的關聯,去把關聯一併刪除便可

352.當某個cell在該tableView中只存在一個的時候,不須要使用複用

353.若是出現cell滾動很卡的狀況
是由於在加載網絡圖片或其餘東西的時候使用了同步方法,更換爲異步

354.Initwithnibname執行順序先於viewdidload

355.再次重申:NSString是隻讀的,不可修改。
想修改請用可變字符串NSMutableString

356.清空數組的方法 技巧
Xcode中,會有兩種Array, NSArray以及NSMutableArray

在清空的過程當中,千萬不要使用 Array == nil; 這樣不只清空了數組,同時也把memory釋放了,這個object就不存在了

正確的作法是
利用
removeAllObjects; 這樣就能夠獲得想要的效果了

使用nil將會刪除整個數組:

[NSArray removeAllObjects];

---- 最近一直忙於項目,總結就順手記載了筆記裏,wen'zhang'sh

相關文章
相關標籤/搜索