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

ShevaKuilin發表於2016-03-04

宣告:本文以下內容均摘自筆者從初學階段至今的日常筆記,難免有才入門時的理解偏差,歡迎指出

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

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

2.git終端命令方法> pwd檢視全部 >cd>ls >之後桌面找到資料夾內容,以cd xxxx ,ls格式>git status檢視>git pull origin master從網上儲存庫中下下來。 返回上一級地址命令cd ..

3.全球最大開原始碼託管平臺——SourceForge

4.sections更改數量可使tableview分量

5.static cells靜態tableview

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

7.git提交步驟

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

  • git commit -m “xxx”

  • 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 = "U51b0U51b0U4e50";
            goodsTypeName = "U7eafU51c0U6c34";
            sellerId = 125;
            sellerName = "U51e4U51f0U57ceU6c34U5e97";
            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寸顯示,也就是你看到的黑邊。

從那以後,再推出iPhone6、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 = "U64cdU4f5cU6210U529f";
}

就應該以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,就可以使用這個方法,這個方法也很強大,以下是他的觸發時機:

1、init初始化不會觸發layoutSubviews
2、addSubview會觸發layoutSubviews
3、設定view的Frame會觸發layoutSubviews,當然前提是frame的值設定前後發生了變化
4、滾動一個UIScrollView會觸發layoutSubviews
5、旋轉Screen會觸發父UIView上的layoutSubviews事件
6、改變一個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 = "U91cdU5e86U519cU6751U5546U4e1aU94f6U884c.U6c5fU6e1dICU501fU8bb0U5361";
    CreateTime = "/Date(1458116833893)/";
    ID = 14;
    Phone = 13527310193;
    TypeId = 1;
    UserId = 171;
    UserName = "U54e5U54e5";
}

這種情況,如果是用字典儲存,那麼只要去取陣列的第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

相關文章