音樂播放器

 

 

5.1  微博 (ok) 好友列表(no ) 好友對話(ok),團購(ok)  再敲一遍javascript

5.3: 湯姆貓,傳智猜圖的邏輯,縮放(ok),輪播(待研究),英雄列表,汽車展現從新敲php

5.4: 把之前作的思路理一理;html

5.5: 預習一下;java

 

ios校招:ios

主要是c,c++  (不多有問ios的,項目問的很簡單,只有網易問的是iOS的)c++

智力題:1-100之間的怎麼樣的找一個數最快;git

c,c++問的是算法,數據結構;程序員

找工做的帖子;分享找工做;web

 

面試不多問UI  問多線程_retian _ 內存管理面試

GCD  和NSOperation

 

 

 

編碼規範??良好的

 

 

 

 

 

qq好友列表的headerView和團購的headerView有什麼區別

qq好友列表的相似於加在組的最開頭,和加入cell的形式相似

團購加在:頭部就至關於加個工具條

 

 

 

#import <UIKit/UIKit.h>

#import <Foundation/Foundation.h>

#import <UIKit/UIResponder.h>

#import <UIKit/UIInterface.h>

#import <UIKit/UIKitDefines.h>

#import <UIKit/UIAppearance.h>

#import <UIKit/UIDynamicBehavior.h>

#import <UIKit/NSLayoutConstraint.h>

UI基礎筆記

無**   通常知識點

***  重點

***** 重難點  編碼規範存在的問題:  ==  *  空格,別人閱讀方便

 

UI筆記

按鈕可以顯示lable和圖片是應爲按鈕內部有UIlable,UIImageView//不是UIView

因此能夠顯示圖片和文字

按鈕有normal 和highlight 還有其餘diasble;

字典表明數據,根據名稱找到數據,適合存儲大規模的數據.

字典的缺點:經過字符串類型的key取值容易寫錯,寫錯了key編譯器不會報錯;

模型:存放數據,繼承自NSObject比較純潔的對象;

建立一個類(即模型)MJApp.h+MJApp.m;只用來放數據,比較純潔;

上述類成爲模型類;

12個字典轉化爲12個模型,//每一個字典中有兩對數據;

在模型對象中聲明兩個屬性Name,和icon存儲數據;

存儲的每一個數據是一個字典;name

自定義構造方法都是返回:Id類型,是自定義類型;//intancetype

 

 

UI基礎筆記

 

0416:UI 基礎

IOS 4.0  iphone,開發高峯期

ios6.0真正的是多任務運行,界面是

 

1.IBAction:

1> 能保證方法能夠連線

2> 至關於void

 

 

2.IBOutlet:

1> 能保證屬性能夠連線

 

3.常見錯誤

setValue:forUndefinedKey:]: this class is not key value coding

錯誤緣由是:連線出問題了

 

4.Xcode5開始的一些建議

把用於連線的一些方法和屬性聲明在.m文件的類擴展中,保證了封裝性,私有的;

 

5. frame\center\bounds

1> frame:能修改位置和尺寸

2> center:能修改位置

3> bounds:能修改尺寸(x\y通常都是0)相對於本身:

0404

identifier:com.baidu,cn.itcast,公司域名

name名字中不能出現中文;

prefix

入口是main函數,

 

UIView--畫板

UIViewController====畫家;先建立UIController再畫板,畫家管理畫板

IBAction  至關於void告訴編譯器這個是能夠連線的

控件使用@property   weak

 

顯示字符串的的控件必定有text的屬性,text的方法

第一響應者:當前和誰交互誰就是第一響應者

[self.view endEditing:YES];

self.view不當第一響應者   //view 裏面包含有UILable UIview UIButton 至少這三種

//這三種都不當第一響應者

 

/*self問題總結*/

XiaoMing  類

建立xiaoming 對象;

小明類中有name,age,delegate 個屬性;

sick方法是XiaoMing類中定義方法

-(void)sick

{

NSLog(@"生病了");

[_delegate lookSickWithName:_name andAge:_age];

//_name=self.name    _age=self.age,此處是xiaoming這個對象調用

//name的get方法不是,self不表明_delegate這個對象,[]這不算一個方法

//self調用當前的方法;

[_delegate lookSickWithXiaoMing:self];//此方法若是不實現就會崩潰

}

self關鍵字表明誰?

對象調用self就表明對象

類名調用方法,self就表明那個類

self處在那個類文件中,self就表明那個文件中,直接使用self能訪問所在類文件中的方法和

屬性,在類中就表明類對象,在類方法中就表明類;

controlviewer類中的對象系統本身建立的,隱藏的!

其實,每當顯示一個新界面時,首先會建立一個新的UIViewController對象,而後建立一個對應的

全屏UIView,UIViewController負責管理這個UIView   UIViewController就是UIView的大管家,

負責建立、顯示、銷燬UIView,負責監聽UIView內部的事件,負責處理UIView與用戶的交互

 

 

 

UIViewController內部有個UIView屬性,就是它負責管理的UIView對象 ,監聽按鈕:

@property(nonatomic,retain) UIView *view;//因此能夠self.view

//計算器中的所謂的self就是這個view嗎,不是這個,self是NJControlView*的對象;

//self.view指的是contrller的子空間下屬的view包含的加進去的全部子控件;

//self.text1.此處的self點的覆蓋的範圍的嗎?

 

 

 

 

//view中的全部子空間都不當響應者了

連線的多種方式?

1.從代碼拖到界面上

2.從界面拖到代碼

3.從control到界面

 

 

1>UIViw全部控件的父控件;

2>frame:控件相對於父類的座標位置,

3>center:也是以父控件做爲參考點

4>bounds:以本身爲參考點

 

 

 

self.tupian.frame.origin.x-=10;//錯誤修改x的值的方法;

CGRect tem=self.tupian.frame;   1>保存原值;

tem.origin.y-=30;               2>修改某一個值

self.tupian.frame=tem;          3>修改的值總體重賦

 

能夠得出一個結論:UI界面上的每個元素都是一個對象,好比:

一張圖片是一個UIImageView對象

一段文字是一個UILabel對象//+ =

文本輸入,鍵盤輸入:UITexTFeild

一隻按鈕是一個UIButton對象//文字,圖片,響應事件

 

爲了方便開發者開發出強大的功能,蘋果提供了各類各樣的框架

UIKit - 建立和管理應用程序的用戶界面

QuartzCore -提供動畫特效以及經過硬件進行渲染的能力

CoreGraphics -提供2D繪製的基於C的API

CoreLocation -使用GPS和WIFI獲取位置信息

MapKit -爲應用程序提供內嵌地圖的接口

AVFoundation – 音頻處理//等等

 

在.m中聲明的方法是私有方法,外界沒法直接訪問,保證了封裝性

int num2 = [self.number2.text intValue];//強制類型裝換,self表明.

Perosn *p =(Perosn *)stu;//此處也是強制類型轉換,stu原本是Student類型的,強轉後轉化爲Person類型的

疑問:子類是能夠強制轉化爲父類!

 

 

屏幕上能看得見摸得着的東西就是UIView,好比屏幕上的按鈕、文字、圖片

 

通常翻譯叫作:視圖\控件\組件

UIButton、UILabel、UITextField都繼承自UIView

每個UIView都是一個容器,能容納其餘UIView(好比右圖中的整個鍵盤是一個UIView,裏面容納不少

小格子的數字UIView)

 

 

嚴格來說,下圖箭頭所指的應該是一個UIViewController對象(手機下方的viewcontriller條),

裏面白色的界面僅僅是UIViewController內部的UIView屬性(整個白屏,什麼都不建時的白屏);

 

 

 

****

綜合分析,能夠得出程序的簡單運行流程是怎麼樣的?

1>讀取Main.storyboard文件

2>建立箭頭所指的MJViewController對象

3>根據storyboard文件中描述建立MJViewController的UIView對象

4>將UIView對象顯示到用戶眼前

如今已經知道:應該由MJViewController來監聽「計算」按鈕的點擊

 

 

 

換句話說,MJViewController應該提供一個方法出來,當用戶點擊「計算」按鈕時,就調用這個方法來

通知MJViewController按鈕被人點了MJViewController就在這個方法中實現想作的任何事情,好比

計算2個文本輸入框內值的和

 

IBAction

從返回值角度上看,做用至關於void

只有返回值聲明爲IBAction的方法,才能跟storyboard中的控件進行連線

 

IBOutlet

只有聲明爲IBOutlet的屬性,才能跟storyboard中的控件進行連線

resignFirstResponder//辭職當第一響應者;

當叫出鍵盤的那個控件(第一響應者)調用這個方法時,就能退出鍵盤

 

[self.view  endEditing:BOOL];

只要調用這個方法的控件內部存在第一響應者,就能退出鍵盤

 

 

可見,確實須要常常修改控件狀態

那如何去修改控件的狀態呢?方法很簡單

每個UI控件都是一個對象//萬物皆對象,萬物截指針

修改UI控件的狀態,其實就是修改控件對象的屬性

好比修改UILabel顯示的文字,就修改UILabel對象的text屬性便可

好比修改UIImageView顯示的圖片,就修改UIImageView對象的image屬性便可

 

不難想到,每個UI控件確定都有不少屬性,好比:

UIProgressView進度條控件有progress屬性(進度值)

UILabel和UITextField都有text屬性(顯示文字)

UITextField 輸入文本

 

雖然,每個UI控件都有 本身的獨特屬性,可是有些屬性是每一個UI控件都具有的,

好比每個UI控件都有本身的位置和尺寸、都有本身的父控件、子控件。因而,全部的UI控件

最終都繼承自UIView,UI控件的公共屬性都定義在UIView中,好比:

frame :位置和尺寸

center :中心點位置

 

 

****

@property(nonatomic,readonly) UIView *superview;

得到本身的父控件對象//父控件只有一個

@property(nonatomic,readonly,copy) NSArray *subviews;

得到本身的全部子控件對象//子空間有不少

@property(nonatomic) NSInteger tag;//

控件的ID\標識,父控件能夠經過tag來找到對應的子控件

@property(nonatomic) CGAffineTransform transform;

控件的形變屬性(能夠設置旋轉角度、比例縮放、平移等屬性)

@property(nonatomic) CGRect frame;

控件所在矩形框在父控件中的位置和尺寸(以父控件的左上角爲座標原點)

@property(nonatomic) CGRect bounds;

控件所在矩形框的位置和尺寸(以本身左上角爲座標原點,因此bounds的x\y通常爲0)

//bound也有x,y,w,h   只是相對於本身的來講因此x,y通常都爲0;

@property(nonatomic) CGPoint center;

控件中點的位置(以父控件的左上角爲座標原點)

//本身的位置是以中點到父控件的邊緣位置

 

****

若是發現經過代碼沒法修改控件的位置或者尺寸時,應該去掉storyboard裏面的autolayout功能,

這是自iOS6開始出現的特性顧名思義,autolayout是用來自動佈局的,用來束縛控件的位置和尺寸。

去掉這個功能,控件的位置和尺寸就再也不有一些固定的束縛。

 

 

 

1>normal(普通狀態)

默認狀況(Default)

對應的枚舉常量:UIControlStateNormal

2>highlighted(高亮狀態)

按鈕被按下去的時候(手指還未鬆開)

對應的枚舉常量:UIControlStateHighlighted

3>disabled(失效狀態,不可用狀態)

若是enabled屬性爲NO,就是處於disable狀態,表明按鈕不能夠被點擊

對應的枚舉常量:UIControlStateDisabled

 

設置按鈕在不一樣狀態下的背景圖片

(爲了保證高亮狀態下的圖片正常顯示,必須設置按鈕的type爲custom)

 

經過如下屬性能夠修改控件的位置

frame.origin

center

 

經過如下屬性能夠修改控件的尺寸

frame.size

bounds.size

 

實際上,UIButton自帶了不少種不一樣的樣式

 

在用代碼建立按鈕的同時指定按鈕樣式

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

UIButtonTypeCustom:無類型,按鈕的內容須要自定義

UIButtonTypeDetailDisclosure:

UIButtonTypeInfoLight:

UIButtonTypeInfoDark:

UIButtonTypeContactAdd:(添加一個加號)

 

計算器總結:

1>拖控件

2>controlviewer.m中聲明空間的屬性,(私有保證封裝)

3>controlviewer.h 中聲明方法,.m中實現方法,而且 拖線,全部的都要拖線

4>方法中或者字符串的值,字符串裝換到int 再輸出到顯示上

 

 

 

 

+ (NSBundle *)mainBundle;//此處返回的是NSBoudle型的對象;不是返回一個類,返回的對象調用pathfor

我的理解字典:字典也是一種數組類型,只是其中更具key的值就能夠找到value的值,key -value一一對應;

字典中存放的方法:

dic {

1 = one;

12 = onew;

13 = onewe;

}

UIButton*   //下面的方法如何去分析,UIButton中如何去找font//用多了就會了?

由於UIButton有font的屬性,既然是屬性,就須要用對象調用,因此須要對象,對象涉及到get和set方法,

字體返回爲UIFont   到UIfont中看看哪些返回UIFont的方法;

 

 

****//手動添加button中的字體

downloadBtn.titleLabel.font=[UIFont systemFontOfSize:12];

//代碼添加的控件的層次,結構關係,Xcode能夠看到嗎?

看不到,由於代碼編譯,連接後才能展示 ;

 

 

 

//+++++++**********++++++++**********---重點代碼

---------------------------------------------------------------------------------------------------

添加代碼?

for (int index=0; index<self.apps.count; index++) {//self.apps放回的是一個NSArray;計算NSArray.count

// 3.1.建立1小框框----------------------------

//建立一個大的UIView;UIView和UIImageView的區別,

UIView是UIImageView 的父類;

 

UIView是

UIView*appView=[[UIView alloc]init];               //+++++++**********++++++++**********

// 設置背景色

appView.backgroundColor=[UIColor cyanColor];

// 3.2.計算框框的位置

// 計算行號和列號

int row=index/totalColumns;

int col=index%totalColumns;

// 計算x和y

CGFloat appX=marginX+col*(appW+marginX);

CGFloat appY=marginY+row*(appH+marginY);

//設置Frame的大小和位置

appView.frame=CGRectMake(appX, appY, appW, appH);

//3.3添加框框到控制器

[self.view addSubview:appView];     //此處的view是表明(UIView*);              //+++++++**********++++++++**********

//    有個view的get方法

//3.4UIView中添加內部小控件

 

//3.4.0index位置對應的應用信息

// ****  數組的位置轉化爲字典;

NSDictionary*appInfo=self.apps[index];//apps聲明的是一個數組的屬性;對應位置的數組的轉化爲對應位置的字典;

 

//添加圖片----------------------------

//建立+大小+增長+++++++++++

UIImageView*iconView=[[UIImageView alloc]init];  //+++++++**********++++++++**********

CGFloat iconW=45;

CGFloat iconH=45;

CGFloat iconX=(appW-iconW)*0.5;

CGFloat iconY=0;

iconView.frame=CGRectMake(iconX, iconY, iconW, iconH);

//添加圖片******  取得字典中icon對應的圖片;

iconView.image=[UIImage imageNamed:appInfo[@"icon"]];//+++++++**********++++++++**********

//建立好的子控件添加

[appView addSubview:iconView];

 

 

//添加名字----------------------------

//建立+大小+增長+++++++++++

UILabel*nameLable=[[UILabel alloc]init];

CGFloat nameX=0;

CGFloat nameY=iconY+iconH;

CGFloat nameW=appW;

CGFloat nameH=20;

nameLable.frame=CGRectMake(nameX, nameY, nameW, nameH);

//添加名字******

nameLable.text=appInfo[@"name"];                    //+++++++**********++++++++**********

nameLable.font=[UIFont italicSystemFontOfSize:13];

nameLable.textColor=[UIColor darkGrayColor];

nameLable.textAlignment=NSTextAlignmentCenter;      //+++++++**********++++++++**********

//建立好的子控件添加

[appView addSubview:nameLable];//向UIView對象中增長子控件;

 

 

//添加下載按鈕----------------------------

//建立+大小+增長+++++++++++

UIButton*downloadBtn=[[UIButton alloc]init];

CGFloat downloadX=12;

CGFloat downloadY=nameY+nameH;

CGFloat downloadH=20;

CGFloat downloadW=appW-2*downloadX;

downloadBtn.frame=CGRectMake(downloadX, downloadY, downloadW, downloadH);

//建立圖片對象

UIImage*normalImage=[UIImage imageNamed:@"buttongreen"];           //+++++++**********++++++++**********

UIImage*highImage=[UIImage imageNamed:@"buttongreen_highlighted"]; //+++++++**********++++++++**********

//將建立的圖片對象設置爲背景

[downloadBtn setBackgroundImage:normalImage forState:UIControlStateNormal];//+++++++**********++++++++**********

[downloadBtn setBackgroundImage:highImage  forState:UIControlStateHighlighted];//+++++++**********++++++++**********

//設置狀態的下載;

[downloadBtn setTitle:@"下載" forState:UIControlStateNormal];//+++++++**********++++++++**********

//設置字體

downloadBtn.titleLabel.font=[UIFont systemFontOfSize:13];//+++++++**********++++++++**********

//建立好的子控件添加

[appView addSubview:downloadBtn];

}

 

-----------------------------------------------------------------------------------------------------------------

------------------------------------------

 

 

MJApp.h文件中模型的頭文件中

@property (nonatomic, copy) NSString *name;

/**

*  圖標

*/

@property (nonatomic, copy) NSString *icon;

 

/**

*  經過字典來初始化模型對象

*

*  @param dict 字典對象

*

*  @return 已經初始化完畢的模型對象

*/

- (instancetype)initWithDict:(NSDictionary *)dict;

 

+ (instancetype)appWithDict:(NSDictionary *)dict;

------------------------------------------

MJApp.m 中

@implementation MJApp

- (instancetype)initWithDict:(NSDictionary *)dict

{

if (self = [super init]) {//使用%@打印

//字典中name鍵值對應的名字如:節奏大師賦值給模型的name,模型中聲明有name 的get方法;

self.name = dict[@"name"];//self.name = 節奏大師

//字典中icon鍵值對應的名字如:icon_05賦值給模型的icon,模型中聲明有icon的 get方法;

self.icon = dict[@"icon"];//self.icon = icon_05

}

return self;(self 表明MJApp*對象)

}

 

+ (instancetype)appWithDict:(NSDictionary *)dict

{

return [[self alloc] initWithDict:dict];//返回MJApp對象的地址

}

@end

------------------------------------------

 

//0326應用管理模型使用:    MJViewController.m文件中

 

#import "MJViewController.h"

#import "MJApp.h"

 

@interface MJViewController ()

/** 存放應用信息 */

@property (nonatomic, strong) NSArray *apps;

@end

 

@implementation MJViewController

 

- (void)viewDidLoad

{

[super viewDidLoad];

// 設置圖片

iconView.image = [UIImage imageNamed:appInfo.icon];

// 3.4.2.添加名字-------------------------------------

nameLabel.text = appInfo.name;//nameLabel.text加載的是字符串.

}

 

- (NSArray *)apps//---------------字典數組轉化爲模型的方法:+++++++**********++++++++**********

 

{

if (_apps == nil) {

// 初始化

 

// 1.得到plist的全路徑

NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil];

 

// 2.將路徑中的plist文件加載成字典數組

NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];//建立的究竟是字典仍是你數組仍是字典數組,是字典仍是數組看Root處是字典仍是數組;

 

 

// 3.將dictArray裏面的全部字典轉成模型對象,放到新的數組中

NSMutableArray *appArray = [NSMutableArray array];//建立一個可變數組;

for (NSDictionary *dict in dictArray) {//遍歷字典數組

// 3.1.建立模型對象

//            MJApp *app = [[MJApp alloc] initWithDict:dict];

MJApp *app = [MJApp appWithDict:dict];

 

// 3.2.添加模型對象到前面定義的可變數組中

[appArray addObject:app];//字典數組-模型-可變數組中?只是藉助模型(這個類中的)appWithDict將字典

//轉化爲模型,

}

 

// 4.賦值

_apps = appArray;

}

return _apps;

}

 

3.使用xib封裝一個自定義view的步驟 // (下面的方法在代碼中是如何實現的);

1> 新建一個繼承UIView的自定義view,假設類名叫作(MJAppView)

//MJAppView.xib的文件;

2> 新建一個MJAppView.xib文件來描述MJAppView內部的結構

//裏面加UILable,UIImageView,UIButton在一個xib局部界面中;

 

3> 修改UIView的類型爲MJAppView真實類型

//UILabel *nameLabel = (UILabel *)[appView viewWithTag:20];即代碼中的強制類型裝換;

4> 將內部的子控件跟MJAppView進行屬性連線

/

5> MJAppView提供一個模型屬性

MJApp.h  MJApp.m 一個是模型的兩個數據;

6> 重寫模型屬性的set方法,由於在set方法中能夠拿到外界傳遞的模型數據

7> 把模型數據拆開,分別設置數據到對應的子控件中

8> 補充:提供一個建立MJAppView的類方法,將讀取xib文件的代碼屏蔽起來

@end

//代碼加載xib的方法:

for (int index = 0; index<self.apps.count; index++) {//+++++++**********++++++++**********

NSBundle *bundle = [NSBundle mainBundle];

// 讀取xib文件(會建立xib中的描述的全部對象,而且按順序放到數組中返回)//+++++++**********++++++++**********

NSArray *objs = [bundle loadNibNamed:@"MJAppView(省略xib後綴)" owner:nil options:nil];//MJAppView=MJAppView.xib//+++++++**********++++++++**********

UIView *appView = [objs lastObject];//+++++++**********++++++++**********

 

// 3.2.添加view

[self.view addSubview:appView];

 

// 3.3.設置frame

int row = index / totalcolumns;

int col = index % totalcolumns;

// 計算x和y

CGFloat appX = marginX + col * (appW + marginX);

CGFloat appY = 30 + row * (appH + marginY);

appView.frame = CGRectMake(appX, appY, appW, appH);

 

// 3.4.設置數據

MJApp *app = self.apps[index];

// 3.4.1.圖片

//        UIImageView *iconView = appView.subviews[0];

UIImageView *iconView = (UIImageView *)[appView viewWithTag:10];

父類強制轉化爲子類

 

iconView.image = [UIImage imageNamed:app.icon];//模型中的app.icon返回的是字符串型的,只是不會打印@" ";

2014-04-17 19:56:34.787 01-應用管理[30319:70b] app.icon = icon_00

2014-04-17 19:56:34.787 01-應用管理[30319:70b] app.name = 每天酷跑

// 3.4.2.名稱

//        UILabel *nameLabel = appView.subviews[1];

UILabel *nameLabel = (UILabel *)[appView viewWithTag:20];//強制類型轉換viewWithTag返回的是UIView型的,因此須要強轉;

nameLabel.text = app.name;//字符串傳給一個文本,文本text的屬性方法返回的是一個NSString型的;

}

--------------------------------------------------------------------------------------------------------------

0326筆記整理

 

1.純代碼方式實現九宮格

* 一個格子一個格子添加

* 使用for循環添加

2.字典轉模型

* 什麼是模型

* 好處分析

* 將字典轉換爲模型

* 模型提供字典轉模型的構造方法

3.使用xib文件

* 用來描述九宮格

* 用來描述中間的提示信息

4.封裝

* 純代碼的封裝

* xib的封裝

 

//使用xib和模型完成九宮格的思路:

1>新建xib文件,添加局部空間,設置tag,方便之後使用;

2>

 

 

 

 

 

 

QQ好友列表設計思路:

1>獲取plist數據必須有模型建模型,好友列表的模型是:plist=2個字典+friends數組(有n個字典,字典有:name,icon,intro,online屬性);

1.1  friend模型:  *friends; online; NSString *name;

 

-(instancetype)initWithDict:(NSDictionary *)dict

{

if (self=[super init]) {

[self setValuesForKeysWithDictionary:dict];

}

return self;

}

 

1.2   friendGroup模型:name,icon,intro,online

-(instancetype)initWithDict:(NSDictionary *)dict//一次轉化一個模型

{

if (self=[super  init])

{

//注入全部的屬性   三個屬性轉化爲字典

[self setValuesForKeysWithDictionary:dict];//此處的self打印仍是數組和兩個模型

//建立,遍歷,轉化,添加,賦值   處理特殊的屬性

//下面的是補充轉化,二次處理

NSMutableArray*models=[NSMutableArray arrayWithCapacity:self.friends.count];

//取出self.frends數組中的每一個字典轉化,沒經歷下面的遍歷轉化以前,frends數組中存的是N個字典,遍歷後frends中

存放的是模型地址

for (NSDictionary*dict in self.friends) {

MJFriend*friend=[MJFriend  friendWithDict:dict];

[models addObject:friend];//medels是一個數組,轉化後存放4個模型的數組

}

self.friends=models;//models        是模型數組,MJFriend中friend是轉化後的模型數組:裏面存放有不少單個模型

}//打印看下

//返回的是一組模型;

return self;//至此self打印是一個地址,完全封裝爲一個模型;從新打印[self setValuesForKeysWithDictionary:dict],裏面是10個模型地址;

}

 

2>都是:tableViewcell,是使用自定義的cell,因此必需要tableViewcell;

2.1裏面拖UITableViewController,

2.2MJViewController : UITableViewController

2.3UITableViewController的類名爲MJViewController ;

2.4裏面有cell須要用到的數據:friend*

 

 

3>MJFriendCell類:   MJFriendCell 繼承 UITableViewCell   //對應於管理XIB的文件

3.1方法cellWithTableView:根據tableView返回一個cell(建立出列,返回)

3.2MJFriend *對象,重寫set方法爲friend設置屬性數據,每一個好友的頭像,簽名,狀態信息

 

 

 

4>MJHeaderView類:   MJHeaderView 繼承 UITableViewHeaderFooterView

4.1專門用來添加頭部視圖:在頭部視圖中(contentView中)添加btn(包含imageView和settitle)和nameLabel就能夠完成顯示功能

4.2設置位置,狀況,imageView的選裝和防止變形

4.3 [self.btn addTarget:self action:@selector(headerClick) forControlEvents:UIControlEventTouchUpInside];

響應事件,並做相應的處理

-(void)headerClick  0428的代碼最後一節課;

{

self.group.opened=!self.group.isOpen;

if ([self.delegate  respondsToSelector(返回BOOL):@selector(headerViewDidClick:)]) //判斷方法headerViewDidClick:是否實現

[self.delegate headerViewDidClick:self];//若是實現就讓headerView的代理  去調用headerViewDidClick這個方法,同時把本身傳進出;

}

 

}

4.4headerViewDidClick中reload方法,在UITableView中,UITableView 繼承 UIScrollView,若是在MJHeaderView類中是沒法

調用reload方法的,因此通知:UITableView代辦,通知=代理,

聲明一個協議,協議中聲明有方法,申明代理:

4.4.1//聲明一個協議

@protocol  MJHeaderViewDelegate <NSObject>

4.4.2//協議中聲明有方法

- (void) headerViewDidClick:(MJHeaderView*)headerView;

@end

@interface MJHeaderView : UITableViewHeaderFooterView

4.4.3//申明代理

@property(nonatomic,weak) id <MJHeaderViewDelegate> delegate;

4.4.4//代理創建關係

viewForHeaderInSection中header.delegate=self;

4.4.5//實現協議中的方法

5>控制器:設置數據源方法,和代理新方法

 

1>多少組用到數據源,設計字典轉模型;

2>每組多少行涉及,單個模型,屬性

3>設置cell的屬性

3.1:建立cell須要一個獨立的類,保存建立cell的方法,cellWithTableView,還有爲cell設置具體詳細信息

3.2獲取模型數據

3.3利用得到的模型和屬性,爲cell賦值;

 

self.btn.imageView.transform=CGAffineTransformMakeRotation(M_PI_2);旋轉

self.btn.imageView.transform=CGAffineTransformIdentity;恢復位置

btn.contentEdgeInsets=UIEdgeInsetsMake(0,20, 0, 0);        // 設置label和imageview之間的距離

// 設置lable和imageView之間的間距 btn.imageEdgeInsets

btn.titleEdgeInsets=UIEdgeInsetsMake(0, 20, 0, 0);

self.btn.imageView.contentMode=UIViewContentModeCenter;

//超出的部分不剪切

self.btn.imageView.clipsToBounds=NO;

#pragma mark-旋轉功能

//當視圖添加到別的視圖就會被調用,

-(void)didMoveToSuperview

{

if (self.group.isOpen)

{

self.btn.imageView.transform=CGAffineTransformMakeRotation(M_PI_2);

}else

{

self.btn.imageView.transform=CGAffineTransformIdentity;

}

//當視圖被修改的時候就會調用這個方法,通常在這個方法中佈局子控件

- (void)layoutSubviews

{

#warning 必定要調用父類的方法

[super layoutSubviews];

//設置點擊按鈕的button的frame

self.btn.frame = CGRectMake(0, 0, 320, 44);

//設置nameLable的frame

CGFloat lableY = 0;

NSLog(@" = %@\n",NSStringFromCGRect(self.bounds));

CGFloat lableH = self.bounds.size.height;

CGFloat lableW = 50;

CGFloat lableX =self.bounds.size.width-lableW-10;

self.nameLable.frame=CGRectMake(lableX, lableY, lableW, lableH);

NSLog(@"layoutSubviews\n");

}

打開關閉分組

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

//取出對應組的模型

MJFriendGroup*group=self.groups[section];

//group 模型,frinds存放好友的模型,

// NSLog(@"numberOfRowsInSection = %d\n",group.friends.count);

//friends數組中朋友的個數

 

return group.isOpen==NO  ?  0  :  group.friends.count;

}

 

 

 

 

 

 

 

 

 

1>老師講的之後都是重點

2>面試的代碼須要手寫,幾乎沒有上機的

3>80%問項目:

思路,難點,用到的知識,怎麼解決問題的,難點如何克服的.

 

1.Xcode自帶頭文件的路徑

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/

Developer/SDKs/iPhoneSimulator7.1.sdk/System/Library/Frameworks/UIKit.framework/Headers

 

2.修改了系統自帶頭文件後,Xcode會報錯,須要清除緩存

解決方案:刪掉下面文件夾的緩存便可(aplle是電腦的用戶名)

/Users/aplle/資源庫/Developer/Xcode/DerivedData

或者

/Users/aplle/Library/Developer/Xcode/DerivedData

 

 

 

使用字典容易寫錯

Key若是寫錯了,編譯器不會有任何警告和報錯,形成設錯數據或者取錯數據

 

使用模型的好處

所謂模型,其實就是數據模型,專門用來存放數據的對象,用它來表示數據會更加專業

模型設置數據和取出數據都是經過它的屬性,屬性名若是寫錯了,編譯器會立刻報錯,所以,保證了數據的正確性

使用模型訪問屬性時,編譯器會提供一系列的提示,提升編碼效率

app.name = @"Jack」;

NSString *name = app.name;

的壞處

通常狀況下,設置數據和取出數據都使用「字符串類型的key」,編寫這些key時,編譯器不會有任何友善提示,須要手敲

dict[@"name"] = @"Jack";

NSString *name = dict[@"name"];

手敲字符串key,key

 

 

字典轉模型的過程最好封裝在模型內部

 

模型應該提供一個能夠傳入字典參數的構造方法

 

 

- (instancetype)initWithDict:(NSDictionary *)dict;

+ (instancetype)xxxWithDict:(NSDictionary *)dict;

instancetype在類型表示上,跟id同樣,能夠表示任何對象類型

instancetype只能用在返回值類型上,不能像id同樣用在參數類型上

instancetype比id多一個好處:編譯器會檢測instancetype的真實類型

 

 

 

Xib文件能夠用來描述某一塊局部的UI界面

Xib文件的加載

方法1

//存放到數組中,數組中又用不少元素;

NSArray *objs = [[NSBundle mainBundle] loadNibNamed:@"MJAppView" owner:nil options:nil];

這個方法會建立xib中的全部對象,而且將對象按順序放到objs數組中

(若是xib如右圖所示,那麼objs數組中依次會有3個對象:1個UIView、1個UIButton、1個UISwitch)

 

方法2

bundle參數能夠爲nil,默認就是main bundle

UINib *nib = [UINib nibWithNibName:@"MJAppView" bundle:[NSBundle mainBundle]];

NSArray *objs = [nib instantiateWithOwner:nil options:nil];

 

在開發階段,面向開發者的是xib文件; 當把應用裝到手機上時,xib文件就會轉爲nib文件

 

要想隨意調整xib中view的尺寸,首先要設置size爲Freeform

xib文件就會轉爲nib文件

 

 

 

xib文件和storyboard 區別:

xib文件就會轉爲nib文件

1>共同點:

都用來描述軟件界面

都用Interface Builder工具來編輯

2>不一樣點

Xib是輕量級的,用來描述局部的UI界面

Storyboard是重量級的,用來描述整個軟件的多個界面,而且能展現多個界面之間的跳轉關係

 

若是一個view內部的子控件比較多,通常會考慮自定義一個view,把它內部子控件的建立屏蔽起來,不讓外界關心

 

外界能夠傳入對應的模型數據給view,view拿到模型數據後給內部的子控件設置對應的數據

 

經常使用方法?

1>

- (void)setTitle:(NSString *)title forState:(UIControlState)state;

設置按鈕的文字

2>

- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state;

設置按鈕的文字顏色

3>

- (void)setImage:(UIImage *)image forState:(UIControlState)state;

設置按鈕內部的小圖片

4>

- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state;

設置按鈕的背景圖片

5>

設置按鈕的文字字體(須要拿到按鈕內部的label來設置)

btn.titleLabel.font = [UIFont systemFontOfSize:13];

6>

- (NSString *)titleForState:(UIControlState)state;

得到按鈕的文字

7>

- (UIColor *)titleColorForState:(UIControlState)state;

得到按鈕的文字顏色

8>

- (UIImage *)imageForState:(UIControlState)state;

得到按鈕內部的小圖片

9>

- (UIImage *)backgroundImageForState:(UIControlState)state;

得到按鈕的背景圖片

 

0418QQ圖片錯誤;

Cannot find executable for CFBundle 0x8bbea80 </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.0.sdk/System/Library/AccessibilityBundles/CertUIFramework.axbundle> (not loaded)

 

 

對象都是類建立出來的;

 

 

 

 

 

15:08邊走邊轉,覆蓋

- (IBAction)move:(UIButton *)sender {

CGAffineTransform transform = self.headBtn.transform;

 

switch (sender.tag) {

case 1: // 上

transform = CGAffineTransformTranslate(transform, 0, -10);

break;

 

case 2: // 右

transform = CGAffineTransformTranslate(transform, 10, 0);

break;

 

case 3: // 下

transform = CGAffineTransformTranslate(transform, 0, 10);

break;

 

case 4: // 左

transform = CGAffineTransformTranslate(transform, -10, 0);

break;

}

 

self.headBtn.transform = transform;

}

 

- (IBAction)headClick {

self.headBtn.transform = CGAffineTransformIdentity;

}

 

- (IBAction)scale:(UIButton *)sender {

CGAffineTransform transform = self.headBtn.transform;

 

switch (sender.tag) {

case 5: // 放大

transform = CGAffineTransformScale(transform, 1.2, 1.2);

break;

 

case 6: // 縮小

transform = CGAffineTransformScale(transform, .8, .8);

break;

}

 

self.headBtn.transform = transform;

}

 

- (IBAction)rotate:(UIButton *)sender {

CGAffineTransform transform = self.headBtn.transform;

 

switch (sender.tag) {

case 7: // 左旋轉

transform = CGAffineTransformRotate(transform, -M_PI_4);

break;

 

case 8: // 右旋轉

transform = CGAffineTransformRotate(transform, M_PI_4);

break;

}

 

self.headBtn.transform = transform;

}

15:30旋轉邊走邊轉邊轉

命名規範.lable結尾

- (IBAction)move:(UIButton*)sender {//此處不能用id 用id沒法實現

[UIView beginAnimations:nil context:nil];//必須一塊兒使用

[UIView setAnimationDuration:3];//設置時間,沒此行就是默認的時間

CGPoint  temp=self.iconBtn.center;

 

 

switch (sender.tag) {

case 10:

temp.y-=60;

break;

case 20:

temp.y+=60;

break;

case 30:

temp.x-=60;

break;

case 40:

temp.x+=60;

break;

}

 

self.iconBtn.center=temp;

[UIView commitAnimations];//提交動畫;

}

 

bounds的使用:

- (IBAction)small {

//    1.取出原有屬性

//    CGRect tempFrame = self.iconBtn.frame;

CGRect tempBounds = self.iconBtn.bounds;//和frame 的差很少

//    2.修改臨時屬性

tempBounds.size.width -= 50;

tempBounds.size.height -= 50;

//    3.覆蓋原有屬性

self.iconBtn.bounds = tempBounds;

}

center的使用;

 

- (IBAction)move:(UIButton *)sender {

 

 

//    1.取出原有屬性

//    CGRect tempFrame = self.iconBtn.frame;

//    command + control + e

CGPoint tempCenter = self.iconBtn.center;

//    2.修改臨時屬性

//    偏移位

NSInteger offset = 150;

//    3.覆蓋原有屬性

//    self.iconBtn.frame = tempFrame;

self.iconBtn.center = tempCenter;

 

}

 

7.監聽按鈕點擊

--------------------------------------------------------------------------------

代碼建立界面

----------------------------------------

//  NJViewController.m

#import "NJViewController.h"

 

@interface NJViewController ()

 

@end

 

@implementation NJViewController

// 控制器的view加載完畢以後就會自動調用這個方法

- (void)viewDidLoad

{

[super viewDidLoad];

// 1.建立按鈕

UIButton *btn = [[UIButton alloc] init];

//    3.設置按鈕的frame

btn.frame = CGRectMake(100, 100, 100, 100);

btn.backgroundColor = [UIColor redColor];

//    4.設置背景圖片

//    4.1建立圖片(若是圖片是png格式能夠省略擴展名)

UIImage *image = [UIImage imageNamed:@"btn_01"];

//    4.2設置默認狀態背景圖片

[btn setBackgroundImage:image forState:UIControlStateNormal];

UIImage *imageHigh = [UIImage imageNamed:@"btn_02"];

[btn setBackgroundImage:imageHigh forState:UIControlStateHighlighted];

//    5.設置文字

[btn setTitle:@"摸我啊" forState:UIControlStateNormal];

[btn setTitle:@"摸你妹" forState:UIControlStateHighlighted];

//    6.設置文字顏色

[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];

[btn setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted];

 

//    7.監聽按鈕點擊

/*

addTarget: 哪一個對象來監聽事件就把這個添加給誰

action:事件發生後調用什麼方法

forControlEvents:事件類型

 

sel中的方法,若是是監聽的btn  就會將btn當作參數傳進去

*/

此處是懶加載,

SEL sel = @selector(btnOnClick);

[btn addTarget:self action:sel forControlEvents:UIControlEventTouchUpInside];

 

//    2.添加按鈕到view上

[self.view addSubview:btn];

 

 

//    建立添加按鈕

//    建立系統提供類型的按鈕不用設置位置和大小

UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeContactAdd];

//    添加到view

[self.view addSubview:btn2];

}

 

 

- (void)btnOnClick

{

NSLog(@"btnOnClick");

}

 

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

 

@end

 

--------------------------------------------------------------------------------

 

 

 

 

 

 

//公共使用的常量提出來  設一個變量賦值;

 

 

self.previousBtn.enabled=(self.index=0 ? NO :YES);//不行

 

self.previousBtn.enabled=(0==self.index ? NO :YES);//不行

 

 

 

 

 

 

NSString*fileName=[NSString stringWithFormat:@"drink_%02d.jpg",i];

UIImage*image=[UIImage imageWithContentsOfFile:@"fileName"];無緩存儲的

 

NSLog(@"%@ \n",fileName);

UIImage*image=[UIImage image:@"fileName"];有緩存   佔用空間大;

 

 

 

 

 

覆蓋,view裏面的東西有訊息,,storyboard,裏面有順序,會覆蓋.不可能把button加到UIimageView裏面,

 

 

/**   */

//

#pragma

0419計劃安排:

 

1.先看今天的代碼整理下筆記,;

2.不懂的看下視屏幕,

3.重點代碼敲一下,本身重複作老實講的項目

4.看下昨天的代碼:真理下筆記;

5.預習下後天,老後天上課的內容!

//==   =之間的使用:必須0==index?:no,yes     不要  index=0?no,yes

 

 

字典:保存數據, 經過鍵取

數據模型:保存數據

//         專門用來保存數據的對象稱之爲數據模型

//         數據模型就是繼承NSObject的一個類

*/

 

 

4.1建立模型對象

/*

NJApp  *app = [[NJApp alloc] init];

app.name = dict[@"name"];

app.icon = dict[@"icon"];

*/

 

NJApp *app = [[NJApp alloc] initWithDict:dict];

 

應用管理封裝本身敲中uiLABle  裏還有UIview   objes中

應用管理封裝2,李明傑:封裝是怎麼樣的過程;

 

 

//桃木貓

#pragma mark - 喝奶點擊事件

- (IBAction)drink {

/*

//    self.tomImageView.image = [UIImage imageNamed:@"drink_00.jpg"];

//    0判斷是否正在執行動畫

if ([self.tomImageView isAnimating]) {

return;

}

 

//    1.建立圖片對象

//    1.1定義數組保存圖片對象

NSMutableArray *images = [NSMutableArray array];

for (int i = 0; i <= 80; i++) {

//    1.2獲取圖片名稱

NSString *fileName = [NSString stringWithFormat:@"drink_%02d.jpg", i];

//        NSLog(@"%@", fileName);

//        1.3經過圖片名稱建立圖片對象

UIImage *image = [UIImage imageNamed:fileName];

//        1.4添加圖片對象到數組

[images addObject:image];

}

//    UIImage *image = [UIImage imageNamed:@""]

//    2.賦值圖片數組給UIImageViwe

self.tomImageView.animationImages = images;

//    4.設置動畫重複次數

self.tomImageView.animationRepeatCount = 1;

//    5.設置動畫時間

self.tomImageView.animationDuration = images.count * 0.05;

//    3.啓動動畫4

[self.tomImageView startAnimating];

*/

[self runAnimationWithFileCount:80 andFileName:@"drink"];

}

- (IBAction)knock {

[self runAnimationWithFileCount:80 andFileName:@"knockout"];

 

}

 

- (IBAction)leftFoot:(id)sender {

 

[self runAnimationWithFileCount:29 andFileName:@"footLeft"];

}

 

#pragma mark - 播放動畫

- (void)runAnimationWithFileCount:(NSInteger)count andFileName:(NSString *)name

{

//    0判斷是否正在執行動畫

if ([self.tomImageView isAnimating]) {

return;

}

 

//    1.建立圖片對象

//    1.1定義數組保存圖片對象

NSMutableArray *images = [NSMutableArray array];

for (int i = 0; i <= count; i++) {

//    1.2獲取圖片名稱

NSString *fileName = [NSString stringWithFormat:@"%@_%02d.jpg", name, i];

//        NSLog(@"%@", fileName);

//        1.3經過圖片名稱建立圖片對象

//        圖片對象被覆蓋後沒有釋放的緣由:

//        imageNamed: 自動緩存

//        UIImage *image = [UIImage imageNamed:fileName];

//        imageWithContentsOfFile: 沒有緩存

//        OfFile: 全路徑

//        獲取最主要的資源包

NSBundle *bundle = [NSBundle mainBundle];

//        獲取圖片的全路徑

NSString *fullPath = [bundle pathForResource:fileName ofType:nil];

UIImage *image = [UIImage imageWithContentsOfFile:fullPath];

//        1.4添加圖片對象到數組

[images addObject:image];

}

//    UIImage *image = [UIImage imageNamed:@""]

//    2.賦值圖片數組給UIImageViwe

self.tomImageView.animationImages = images;

//    4.設置動畫重複次數

self.tomImageView.animationRepeatCount = 1;

//    5.設置動畫時間

//    動畫持續時間

CGFloat delay = images.count * 0.05;

self.tomImageView.animationDuration = delay;

//    3.啓動動畫

[self.tomImageView startAnimating];

 

//    self.tomImageView.animationImages = nil;

 

/*

SEL: 要執行的方法

withObject:調用方法的時候傳遞的參數

afterDelay:多少秒後執行

誰調用performSelector方法就會在afterDelay秒後執行誰的SEL方法而且傳遞一個withObject參數

*/

三秒以後文件中的對象執行clearCache:方法,傳遞的參數爲nil

//    [self performSelector:@selector(clearCache:) withObject:nil afterDelay:3];

//self.tomImageView這個屬性  在延時以後執行setAnimationImages:這個方法,傳遞一個nil給他;

setAnimationImages:是系統自動生成的;

[self.tomImageView performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:delay + 1];

}

 

#pragma mark - 清空數組

- (void)clearCache:(NSString *)str

{

//    NSLog(@"clearCache = %@", str);

self.tomImageView.animationImages = nil;

 

//    [self.tomImageView setAnimationImages:nil];

}

@end

 

 

0418筆記

// 誰觸發事件就會把誰看成參數傳遞過來

// 參數的做用:區分按鈕

//- (IBAction)login:(UIButton *)sender {

//    NSLog(@"%@", sender);

//}

 

 

if (_imageData == nil) {

//        arrayWithContentsOfFile接收的不是文件名稱,而是文件的全路徑

//        abc.txt

//        /user/apple/desktop/abc.txt

//        OfFile:都是要求傳入全路徑

 

//        NSBundle : 表明一個文件夾

//        mainBundle: 程序的主要資源文件夾

//        /Users/apple/Library/Application Support/iPhone Simulator/7.1/Applications/5134E673-89EA-4D2B-AAC1-097594A7C8D9/06-圖片瀏覽器.app

//        之後在開發中,建立plist文件必定不要命名爲info.plist

NSBundle *bundle = [NSBundle mainBundle];

NSString *fullPath = [bundle pathForResource:@"imageData" ofType:@"plist"];

 

_imageData = [NSArray arrayWithContentsOfFile:fullPath];

}

 

 

//老師作傳智猜圖:如何構思的?如何思考的??

 

 

 

圖片瀏覽器的思路??(100字 ):

1>設置屬性,

2>監聽按鈕;

3>按鈕被點擊的時候:響應函數裏  經過屬性將相關的序號,圖片,說明輸出到,設置的屬性裏;

 

 

湯姆貓??:

1>監聽按鈕,設置UIView的屬性,接受動畫

2>設置數組,循環接受動畫,使用for循環,

3>接受到的數組圖片,使用系統的動畫函數,播放動畫;

 

九宮格思路:

??

猜圖思路:

固定的用story,動態的用代碼

 

@2x.png,.png同一張

view只是展現圖片,效率高

button點擊和展現;

 

 

 

修改工程名稱;

inset設置內邊距

disable just image

preferredStatusBarStyle 一敲就有繼承的系統就有

枚舉:枚舉開頭,

button不可用:enable=NO;

有dictionary  轉化爲模型

 

 

if (self=[super init])   首先調用[super init],調用父類的初始化方法,初始化之後,再返回一個

調用這個方法的對象的地址,賦值是爲了return self,return [super init];驗證,

MJQuestion*question=self.question[self.index];

 

 

btn下一題能夠連線兩次,屬性和action   一個響應點擊,一個獲取這個按鈕的屬性;

cover.alpha=0.0;

設置透明:1.徹底透明

 

 

self.view   表明控制器的view,  self.answerBtn.frame.Size

把控制view 的btn子視圖帶到控制器view最前面

[self.view bringSubviewToFront:self.iconBtn];

 

 

autolayout,勾選,btn控件就不能改變大小

autosize  subviews  勾選 子控件的大小隨父控件的大小變化

 

兩個連線

view

屬性中不要用,用NSMutableArray避免外面修改

 

UI調用set方法通常的都是set開頭,   調用get方法,直接敲

 

 

 

 

一個按鈕能夠拖多跟線,一個屬性,一個響應;

 

 

 

cover.frame=self.view.frame;

 

 

建父控件的時候爲何是 view,view最純潔什麼都不幹;也能夠用其餘的控件裝子控件;

UITableView 繼承UIScrollView,把一個東西拖到裏面就能夠滾;

 

 

 

 

viewDidLoad  程序啓動就會

 

 

setv

字典轉模型一行是四行;

屬性名和 字典的key必須和模型的屬性名如出一轍;

取出每一個字典的值賦值給屬性名變量

id 類型是指針 不恩能是22;

 

@22  把22包裝爲指針;

 

@22   kvc會解析這個;

@"22"   會自動裝換類型;

 

kvc字典轉模型

取值   賦值

 

模型轉字典

 

 

 

 

 

iPad   iPhone  名字不能錯

 

forkeypath  屬性 的屬性,屬性,賦值

setValue:只能給屬性賦值;

forkey少用  用forkeypath

kvc的,裝換,性能不是很高;

kvc經過字符串類型的鍵賦值,可能寫錯,編譯時不會寫錯,運行的時候會報錯;

 

kvo  鍵值監聽

 

 

須要用self是用全局,的變量,   不須要用self 的是局部的變量;

重寫構造方法:if(self=[superinit])

調用父類的構造方法,返回一個子類的對象;

 

 

 

 

view比較純潔的view 能夠容納其餘的控件;

 

imageView   放在scrollview的子控件能夠拖:須要告訴滾動範圍;代碼才能實現滾動的範圍;

不能滾動;

1>沒設置滾動範圍

2>scrollenabe=no;

3>imageView的自動佈局要去掉,不然沒法拖動

4>userInterfaction;

 

viewDidLoad表明方法已經加載程序啓動

 

 

self.scrollView.contentInset=UIedgeInsetMake:  UIedgeInset是結構體在 設置的時候直接

把結構體的名稱加一個make 就行;

 

scrollView

 

scrollinset:設置滾動的外邊距;

inset在button中設置內邊距;

 

 

圖:

conetntSize的x值是相對與內容的內邊距來算的,不是以inset的邊距來算的;

 

 

CGrectMak

 

傳智電臺:

1>分三部分:上中下:

 

pt 點座標:五個按鈕:

 

 

scollview的協議以scollview爲開頭

 

 

 

 

14:45??三種設置滾動範圍;

代理的應用場景:用途必背:

監聽思想:A(viewController)對象想監聽B對象,就將A(viewController)對象設爲B對象的代理;

通知思想:A(viewController)對象想通知B對象,就將A(viewController)對象設爲B對象的代理;

 

 

15:22代理大白話思想重看

 

 

分頁原理:自動更具scrollView的寬度分頁,須要設置參數;

 

nstimer只能放在主線程中,viewDidLoad中是主線程;

 

 

 

 

for (NSDictionary *dict in dictArray) {

NJQuestion *question = [NJQuestion questionWithDict:dict];

[models addObject:question];

}

遍歷dictArray中的每一個數組元素,再將每一個元素轉化爲模型,將轉化後的沒個模型放在models中;

 

 

 

若是UIScrollView沒法滾動,多是如下緣由:

1>沒有設置contentSize

2>scrollEnabled = NO

3>沒有接收到觸摸事件:userInteractionEnabled = NO

4>沒有取消autolayout功能(要想scrollView滾動,必須取消autolayout)

 

@property(nonatomic) CGPoint contentOffset;(.外面的因此off set 遠離設置的範圍)

這個屬性用來表示UIScrollView滾動的位置

 

@property(nonatomic) CGSize contentSize;(size  )

這個屬性用來表示UIScrollView內容的尺寸,滾動範圍(能滾多遠)

 

@property(nonatomic) UIEdgeInsets contentInset; (inset  設置外邊距)

這個屬性可以在UIScrollView的4周增長額外的滾動區域

 

@property(nonatomic) BOOL bounces;

設置UIScrollView是否須要彈簧效果

 

@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled;

設置UIScrollView是否能滾動

 

@property(nonatomic) BOOL showsHorizontalScrollIndicator;

是否顯示水平滾動條

 

@property(nonatomic) BOOL showsVerticalScrollIndicator;

是否顯示垂直滾動條

 

開始拖拽時調用 :scrollViewWillBeginDragging

具體滾動到某個位置時,調用scrollViewDidScroll:方法   DidScroll已經滾到

 

用戶中止拖拽時,

調用scrollViewDidEndDragging:willDecelerate:方法

 

設置UIScrollView的id<UISCrollViewDelegate> delegate代理對象

設置minimumZoomScale :縮小的最小比例

設置maximumZoomScale :放大的最大比例

讓代理對象實現下面的方法,返回須要縮放的視圖控件

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;

 

 

跟縮放相關的其餘代理方法

開始縮放的時候調用

- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view

 

正在縮放的時候調用

- (void)scrollViewDidZoom:(UIScrollView *)scrollView

只要將UIScrollView的pageEnabled屬性設置爲YES,UIScrollView會被分割成多個獨立頁面,裏面的內容就能進行分頁展現

 

通常會配合UIPageControl加強分頁效果,UIPageControl經常使用屬性以下

一共有多少頁

@property(nonatomic) NSInteger numberOfPages;

 

當前顯示的頁碼

@property(nonatomic) NSInteger currentPage;

 

只有一頁時,是否須要隱藏頁碼指示器

@property(nonatomic) BOOL hidesForSinglePage;

 

其餘頁碼指示器的顏色

@property(nonatomic,retain) UIColor *pageIndicatorTintColor;

 

當前頁碼指示器的顏色

@property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;

 

 

NSTimer叫作「定時器」,它的做用以下

在指定的時間執行指定的任務

每隔一段時間執行指定的任務

 

調用下面的方法就會開啓一個定時任務

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget

selector:(SEL)aSelector

userInfo:(id)userInfo

repeats:(BOOL)yesOrNo;

每隔ti秒,調用一次aTarget的aSelector方法,yesOrNo決定了是否重複執行這個任務

 

經過invalidate方法能夠中止定時器的工做,一旦定時器被中止了,就不能再次執行任務。只能再建立一個新的定時器才能執行新的任務

- (void)invalidate;

 

注意點:字典中的key必須和模型的屬性名稱如出一轍  才能使用KVC方法;

注意:不要濫用kvc

由於kvc要把字符串類型的屬性名稱和值轉換後才能賦值,因此性能不是很高

還有一點,由於kvc是經過字符串類型的鍵去查找對應的屬性進行賦值,因此有可能寫錯,可是寫錯後在編譯時不會報錯, 只會在運行時報錯

應用場景:

經常使用於字典和模型的相互轉換

*/

 

- (instancetype)initWithDict:(NSDictionary *)dict

{

if (self = [super init]) {

之前的字典轉模型;

/*

self.answer = dict[@"answer"];

self.icon = dict[@"icon"];

self.title = dict[@"title"];

self.options = dict[@"options"];

*/

//        KVC能夠經過一個字符串的key給屬性賦值

//        取出dict字典中key爲@"answer"的值 ,賦值給self的名字叫作answer的屬性

/*

[self setValue:dict[@"answer"] forKeyPath:@"answer"];

[self setValue:dict[@"icon"] forKeyPath:@"icon"];

[self setValue:dict[@"title"] forKeyPath:@"title"];

[self setValue:dict[@"options"] forKeyPath:@"options"];

*/

//        注意點:字典中的key必須和模型的屬性名稱如出一轍

使用KVC後一行代碼搞定,KVC 本身會轉化爲響應的代碼;

[self setValuesForKeysWithDictionary:dict];

 

[self setValue:dict[@"an"] forKeyPath:@"an"];

*/

}

return self;

}

 

 

KVC

// 能夠給p對象的屬性的屬性賦值

[p setValue:@"mini" forKeyPath:@"iPad.model"];

// 只能給p對象的屬性賦值

//    [p setValue:@"mini" forKey:@"iPad.model"];

 

    

    

 

 

 

 

[super viewDidLoad];

CGFloat lastY=self.lastBtn.frame.origin.y+self.lastBtn.frame.size.height+10;

//移動的距離

self.scrollView.contentSize= CGSizeMake   (0, lastY);

 

//移動上下的邊緣

//離上下的間距,不會回縮.上下有工具條

self.scrollView.contentInset=UIEdgeInsetsMake(44, 0, 64, 0);

 

 

更改電臺出來初始位置,下移;

//    1.取出原來的值

CGPoint tempOffset = self.scrollView.contentOffset;

//    2.修改之前的位置

/tempOffset.y = -40;

//    3.覆蓋之前的offset

self.scrollView.contentOffset = tempOffset;

傳智電臺組成:

1>上面的view條320*45;

2>中間的scrollView 滑動

3>最下面的view條 320*60;

 

 

 

 

- (void)viewDidLoad

{

[super viewDidLoad];

 

// 設置滾動範圍

self.scrollview.contentSize = self.imageView.image.size;

// 1.設置代理對象

self.scrollview.delegate = self;

//---------------------------------------------

UIScrollView中 聲明瞭協議: @protocol UIScrollViewDelegate;

,UIScrollView的屬性delegaet遵照UIScrollViewDelegate這個協議(以下所示);

@property(nonatomic,assign) id<UIScrollViewDelegate>delegate;

將控制器對象傳給delegate,delegate和控制器對象指同一對象,在控制器中實現協議中的方法

,那麼scrollview就可使用控制器實現的方法完成必定的功能,UIScrollView的屬性delegate

和控制器指向同一地址,控制器實現了,就至關於本身實現了同樣,直接使用;

 

 

//---------------------------------------------

 

 

/*

代理應用場景:

1. 監聽思想:當A對象想監聽B對象的變化的時候,就可讓A對象成爲B對象的代理

2. 通知思想:當B對象發生了變化的時候想通知A對象,就可讓A對象成爲B對象的代理

*/

 

// 設置縮放的最小和最大比例

self.scrollview.minimumZoomScale = 0.2f;

self.scrollview.maximumZoomScale = 2.0f;

}

 

// 3.實現協議中的方法

// 開始縮放的時候調用, 要求返回scrollview中須要縮放的控件

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView

{

NSLog(@"開始縮放");

return self.imageView;

}

 

縮放過程當中調用

- (void)scrollViewDidZoom:(UIScrollView *)scrollView

//{

//    NSLog(@"正在縮放");

//}

 

 

/**

*  縮放結束時調用

*

*  @param scrollView 當前的scrollview

*  @param view       被縮放的view

*  @param scale      縮放的比例

*/

//- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale

//{

//    NSLog(@"縮放結束");

//    NSLog(@"view = %@, scale = %.1f", view, scale);

//}

 

 

 

UITableView須要一個數據源(dataSource)來顯示數據

 

UITableView會向數據源查詢一共有多少行數據以及每一行顯示什麼數據等

 

沒有設置數據源的UITableView只是個空殼

 

凡是遵照UITableViewDataSource協議的OC對象,均可以是UITableView的數據源

 

 

調用數據源的下面方法得知一共有多少組數據

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

 

調用數據源的下面方法得知每一組有多少行數據

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

 

調用數據源的下面方法得知每一行顯示什麼內容

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

 

UITableView的每一行都是一個UITableViewCell,經過dataSource的tableView:cellForRowAtIndexPath:方法來初始化每一行

 

UITableViewCell內部有個默認的子視圖:contentView,contentView是UITableViewCell所顯示內容的父視圖,可顯示一些輔助指示視圖

 

輔助指示視圖的做用是顯示一個表示動做的圖標,能夠經過設置UITableViewCell的accessoryType來顯示,默認是UITableViewCellAccessoryNone(不顯示輔助指示視圖),其餘值以下:

UITableViewCellAccessoryDisclosureIndicator

 

UITableViewCellAccessoryDetailDisclosureButton

 

UITableViewCellAccessoryCheckmark

 

還能夠經過cell的accessoryView屬性來自定義輔助指示視圖(好比往右邊放一個開關)

 

 

@protocol UITableViewDataSource<NSObject>

 

@required

2>每組多少行

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

 

3>每組每行顯示什麼內容

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

 

@optional

1>有多少組

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented

4>設置頭部標題

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;    // fixed font style. use custom view (UILabel) if you want something different

5>設置尾部標題

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;

 

// Editing

 

// Individual rows can opt out of having the -editing property set for them. If not implemented, all rows are assumed to be editable.

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;

 

// Moving/reordering

 

// Allows the reorder accessory view to optionally be shown for a particular row. By default, the reorder control will be shown only if the datasource implements -tableView:moveRowAtIndexPath:toIndexPath:

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;

 

// Index

 

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;                                                    // return list of section titles to display in section index view (e.g. "ABCD...Z#")

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;  // tell table which section corresponds to section title/index (e.g. "B",1))

 

// Data manipulation - insert and delete support

 

// After a row has the minus or plus button invoked (based on the UITableViewCellEditingStyle for the cell), the dataSource must commit the change

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;

 

// Data manipulation - reorder / moving support

 

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

 

@end

 

 

 

 

禁止用戶交互:使按鈕不能點:

 

 

 

 

 

 

 

//英雄展現設計思路:

0>搭接面,拖屬性,加plist文件

1>建模新,屬性:name.icon,intro

2>模型初始化

3>重寫get寫函數將字典數組裏的數據轉化爲模型

3.1>字典轉模型函數:

3.2>兩種方法

4>只有一組

5>有一共有多少行:

6>設置cell中的數據:

6.1>取模型數據

6.2>根據模型數據設置cell的值:

7>設置行高

 

//團購界面思路

1>界面搭建:添加一個tableView,plist文件,圖片

 

2>創建xib文件:由於團購網站的樣式同樣  能夠複用,而微博是不能夠複用的

3>創建管理xib的類:爲了保證封裝性,不用viewWithtag的方式拿到xib中的子控件,創建管理xib的類,設置屬性

並拖線來,管理xib中的屬性;  Table  View Cell,xib,xib管理類三者的名字同樣;

4> 爲了加載plist文件創建模型

5>爲了將控制器設置爲代理須要拖線,將數據源和控制器拖線創建聯繫

 

6> 1) 設置每一行cell的高度,

2)隱藏狀態欄,

3)數據的懶加載,加載plist

4)數據源方法

5)一共有多少行數據

6)每一行顯示怎樣的cell---建立cell  給cell傳遞模型

 

不能拖線,不能更名字,團購網站本身敲://是由於管理xib的類不是繼承與xib中的默認類,沒創建聯繫;

 

story歸controller管

xib 歸響應的類管,不必定添加到controller

 

 

 

lable.center=CGPointMake(160, 240);//位置center易算

lable.backgroundColor=[UIColor  redColor];

[self.superview   addSubview:lable];  /找父控件

 

 

 

09:41主圖層??

lable.layer.masksToBounds=YES;//子頭層是否剪切到母塗層的大小,邊緣一致;

0943

 

??什麼意思?0945

lable.layer.cornerRadius=10;//兩個配合使用

lable.layer.masksToBounds=YES;//設置子圖層的邊角,剪邊角,邊角變圓

lable.clipsToBounds=YES;

代碼裏面父子關係不穩定

 

custom  的下面修改xib名字的tg,xib的名字不能改,繼承關係錯了

 

 

 

 

展現表格使用tableView,要展現數據須要數據源;遵照數據源協議

數據源方法什麼過後調用?  數據源顯示以前調用

1204兩種設置行高的方法;row.height,相同的行高設置的方法,不一樣的行高

static   局部變量只開闢一次存儲空間

 

 

xib封裝的讀取與賦值的過程:-------------------------------1)xib轉化爲appview 類

1>調用appView方法從xib中加載局部界面

NJAppView *appView = [NJAppView appView];

appView.delegate = self;//        設置控制器爲appview的代理

+ (instancetype)appView

{

//        獲取最主要的資源文件夾

NSBundle *bundle = [NSBundle mainBundle];

//        nib == xib

//        讀取xib中的文件(會建立xib中描述的全部對象,而且按照順序放到數組中)

NSArray *objcts = [bundle loadNibNamed:@"NJAppView" owner:nil options:nil];

 

//        UIView *appView = objcts[0];

NJAppView *appView = [objcts lastObject];

// NJAppView  xib中是什麼類型,objcts就是什麼類型

return appView;//NJAppView繼承UIView

}

 

 

2>.設置數據:.apps方法將字典中的字典轉化模型放在數組中存儲起來, --------2)取出每個模型數據

//取出模型數組中的每個模型數據:

NJApp *appInfo = self.apps[i];

- (NSArray *)apps

{

if (_apps == nil) { // 未初始化

//        1.獲取最主要資源包

NSBundle *bundle = [NSBundle mainBundle];

//        2.獲取plist全路徑

NSString *fullPath = [bundle pathForResource:@"app" ofType:@"plist"];

//        3.加載應用信息

NSArray *dictArray = [NSArray arrayWithContentsOfFile:fullPath];

//        4.字典轉模型

NSMutableArray *models = [NSMutableArray arrayWithCapacity:dictArray.count];

 

for (NSDictionary *dict in dictArray) {

//            4.1建立模型對象

NJApp *app = [NJApp appWithDict:dict];

 

//            4.2將模型對象存儲到數組中

[models addObject:app];

}

_apps = models;

}

return _apps;

}

 

3>.appInfo的get方法將 上一步中取得的模型數據,賦給xib中的nameLable和iconImageView中的模塊

appView.appInfo = appInfo;-------------------3)將模型數據賦給appview 類的屬性

 

- (void)setAppInfo:(NJApp *)appInfo

{

//    固定寫法

_appInfo = appInfo;

 

//    設置頭像

self.iconImageView.image = [UIImage imageNamed:_appInfo.icon];

//    設置名稱

self.nameLabel.text = _appInfo.name;

}

 

 

//方法在NJappVIew中只有NJAppView的對象才能調用

- (IBAction)downloadClick {

//    NSLog(@"點擊了下載");

self.download.enabled = NO;

//  self表明NJAppView,通知代理我被點擊了,同時把NJAppView傳給控制器是

[self.delegate appViewClickBtn:self];

}

 

 

1>xib中的一個按鈕被點擊了;

2>xib中被點擊的按鈕(downLaod)進行連線,只有連線了才能夠監聽這個按鈕;

3>被點擊的事件,xib的管理類MJAPPView最清楚本身的子控件被點擊,保證封裝,將點擊事件通知代理:

通知控制器,

4>控制器收到被點擊的事件後,在控制器上加彈框:

 

 

 

 

 

 

[self.view addSubview:label];

執行動畫:透明從0.0--0.6花一秒鐘的時間,通過0.5秒後,動畫消失,消失時間持續1秒鐘;

[UIView animateWithDuration:1 animations:^{

label.alpha = 0.6;

} completion:^(BOOL finished) {

 

[UIView animateWithDuration:1 delay:0.5 options:UIViewAnimationOptionCurveLinear animations:^{

label.alpha = 0.0;

} completion:^(BOOL finished) {

[label removeFromSuperview];

}];

 

}];

 

 

@interface MJTgCell : UITableViewCell//要繼承系統的UITableViewCell作一個擴展;

xib轉換爲代碼:

自定義的至關於MJTgCell這個類;

 

 

開發中字符串展現int  方便顯示;

 

當系統的cell沒法知足需求的時候,就須要自定義cell,在系統自帶的cell上作一些加強;

自定義cell

1>xib固定的界面

2>純代碼(界面不固定,微博)

 

tableview  cell  子空間contentView(必須放在這裏面),專門tableview  cell

 

 

 

 

 

 

定義一個類管理一個xib文件

1>xib與管理類名稱相同

2>管理類是xib的class類的根類:

 

 

繼承:在繼承的基礎上既要知足要求,又要擴張一些功能,因此我要繼承與他,

 

 

 

hidden   成對出現,30分鐘:

 

團購網站思路:

1>數據懶加載

2>設置行高,設置狀態欄

3>每一行顯示怎麼樣的cell:

調用:

建立cell,在建立的時候沒傳入一個tableView對象就返回一個cell

建立cell,先從緩存池中出,不爲空建立.

4>給cell傳模型數據

get 方法懶加載,得到模型數組,set方法將傳入的模型,寫入cell的各個屬性;

5>

 

 

 

 

 

 

+ (instancetype)headerView

{

return [[[NSBundle mainBundle] loadNibNamed:@"NJHeaderView" owner:nil options:nil] lastObject];

}

// 經過xib建立的view不會調用這個方法,只有經過代碼建立的時候纔會調用這個方法

//- (id)init{}

 

// 經過xib建立view的時候會調用下列方法

- (void)awakeFromNib

{

NSLog(@"醒了");

//    拿到scrollview設置圖片

}

 

 

控件的命名規則?

// 控件協議名稱以控件名稱 + Delegate

@protocol NJFooterViewDelegate <NSObject>

 

 

對象A內部發生了一些事情,想通知對象B

對象B想監聽對象A內部發生了什麼事情

對象A想在本身的方法內部調用對象B的某個方法,而且對象A不能對對象B有耦合依賴

對象A想傳遞數據給對象B

以上狀況,結果都同樣:對象B是對象A的代理(delegate)

 

 

先搞清楚誰是誰的代理(delegate)

 

定義代理協議,協議名稱的命名規範:控件類名 + Delegate

定義代理方法

代理方法通常都定義爲@optional

代理方法名都以控件名開頭

代理方法至少有1個參數,將控件自己傳遞出去

設置代理(delegate)對象  (好比myView.delegate = xxxx;)

代理對象遵照協議

代理對象實現協議裏面該實現的方法

在恰當的時刻調用代理對象(delegate)的代理方法,通知代理髮生了什麼事情

(在調用以前判斷代理是否實現了該代理方法)

 

 

 

 

 

好友列表和微博思路:0425

 

1>viewDidLoad

2>prefersStatusBarHidden

A>//懶加載plist-數組-(字典轉message模型,message模型set進入messageFrame模型,messageFrame模型組合成數組)

3> 數據源方法 ,使用懶加載返回frame模型的個數;決定行數

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return self.messageFrames.count;

}

 

4>-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

// 1.建立cell,傳入tableview就能夠將子控件建立和初始化;

MJMessageCell *cell = [MJMessageCell cellWithTableView:tableView];

 

// 2.使用懶加載get方法給建立和初始化的cell傳遞模型

//根據傳入的模型設置:時間,頭像和正文,以及frame屬性  在cell使用setMessageFrame方法中設置,無返回值

cell.messageFrame = self.messageFrames[indexPath.row];

 

// 3.返回設置號頭像和正文時間的cell

return cell;

}

 

5>- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{   //調用懶加載的方法給frame模型對象傳遞單個messageFrames模型

MJMessageFrame *mf = self.messageFrames[indexPath.row];

//根據傳入的模型數據,get得到MJMessageFrame對象中set的cellHeight屬性;此屬性在色調方法中根據字數來設定;

return mf.cellHeight;

}

@end

 

 

0427:qq聊天佈局的結構:

 

storyBorad:tableView  和文本輸入框背景圖片,三個按鈕

 

QQ好友事項方法:

一:

定義分類(兩組,擴充兩個方法):

分類是在已有類的基礎上擴展一些新的類,增長了得到能夠隨意拉伸不變形的圖片

返回:能夠隨意拉伸不變形的圖片,返回字符串所佔用的尺寸

定義方法:

@interface NSString (Extension)

- (CGSize)sizeWithFont:(UIFont *)font maxSize:(CGSize)maxSize;

@end

 

定義: MJMessageCell類   繼承自UITableViewCell

方法:

cellWithTableView   cell的建立<緩存池>

initWithStyle:      對建立的cell初步初始化:設下圖像正文的格式,字體,裏面無準確的內容

setMessageFrame:     傳入一個MessageFrame,MessageFrame中有message屬性,經過get

message屬性的方法得到message的模型(無frame)

 

MJMessage類中

屬性:聊天內容

發送時間

信息的類型

是否隱藏時間

 

方法:傳入字典就能夠返回一個模型

messageWithDict:(NSDictionary *)dict

- (instancetype)initWithDict:(NSDictionary *)dict

 

MJMessageFrame類中

屬性:頭像的frame,時間的frame,正文的frame ,cell的高度,單個初級數據模型message

方法:- (void)setMessage:(MJMessage *)message

傳入message(單個模型數據)能夠計算:

1.時間  _timeF

2.頭像  _iconF

3.正文  _textF

4.cell的高度   cellheight

 

 

 

控制器中有@interface MJViewController () <UITableViewDataSource, UITableViewDelegate, UITableViewDelegate, UITextFieldDelegate>

數據源方法和代理;

 

屬性: ;NSDictionary *autoreply;  NSMutableArray *messageFrames;

UITableView *tableView;  拖線-設置代理,通知代理作事

UITextField *inputView;  拖線-設置代理,通知代理作事

 

viewDidLoad:

1.表格的設置

去除分割線

2.監聽鍵盤的通知

3.設置文本框左邊顯示的view

永遠顯示

懶加載:得到模型數據,將模型數據和數據的frame(內部新增長一些屬性,在setMessage中設置)包裝成:messageFrames,

數據源方法:1>建立,初始化,填數據,返回cellHeight;

autoreply:自動播放方法,返回的數組(plist轉化而來);

發送一條消息:

- (void)addMessage:(NSString *)text發送的文本 type:(MJMessageType)type(發送的類型);

1.數據模型

設置數據模型的時間

看是否須要隱藏時間

2.frame模型

建立mf對象

MJMessageFrame *mf = [[MJMessageFrame alloc] init];

//對象中添加單個模型數據

mf.message = msg;

//含有單個模型數據和相關擴充功能的mf對象加到數組中;

[self.messageFrames addObject:mf];

// 3.刷新表格

[self.tableView reloadData];

// 4.自動滾動表格到最後一行

 

*  根據本身發的內容取得自動回覆的內容

本身發的內容

- (NSString *)replayWithText:(NSString *)text

 

 

#pragma mark - 文本框代理

/**

*  點擊了return按鈕(鍵盤最右下角的按鈕)就會調用

*/

- (BOOL)textFieldShouldReturn:(UITextField *)textField

{

// 1.本身發一條消息

// 2.自動回覆一條消息

// 3.清空文字

// 返回YES便可

}

/**

*  當鍵盤改變了frame(位置和尺寸)的時候調用

*/

- (void)keyboardWillChangeFrame:(NSNotification *)note

{    // 設置窗口的顏色

// 0.取出鍵盤動畫的時間

// 1.取得鍵盤最後的frame

// 2.計算控制器的view須要平移的距離

// 3.執行動畫

}];

}

 

 

 

控制器中的新方法代碼:

 

 

- (void)viewDidLoad

{

[super viewDidLoad];

// 1.表格的設置

// 去除分割線

self.tableView.backgroundColor = [UIColor colorWithRed:235/255.0 green:235/255.0 blue:235/255.0 alpha:1.0];

self.tableView.allowsSelection = NO; // 不容許選中

self.tableView.delegate = self;

 

// 2.監聽鍵盤的通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];

 

// 3.設置文本框左邊顯示的view

self.inputView.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 8, 0)];

// 永遠顯示

self.inputView.leftViewMode = UITextFieldViewModeAlways;

self.inputView.delegate = self;

}

 

做用:

- (void)dealloc

{

[[NSNotificationCenter defaultCenter] removeObserver:self];

}

 

數據源方法:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

{

// 退出鍵盤

[self.view endEditing:YES];

}

 

>-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath//建立cell初步初始化--

代理方法:- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

MJMessageFrame *mf = self.messageFrames[indexPath.row];

return mf.cellHeight;

 

 

 

}

 

/**

*  當開始拖拽表格的時候就會調用

*/

 

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

 

// 退出鍵盤

 

- (void)addMessage:(NSString *)text type:(MJMessageType)type

 

// 1.數據模型

MJMessage *msg = [[MJMessage alloc] init];

msg.type = type;

msg.text = text;

// 設置數據模型的時間

NSDate *now = [NSDate date];

NSDateFormatter *fmt = [[NSDateFormatter alloc] init];

fmt.dateFormat = @"HH:mm";

// NSDate  --->  NSString

// NSString ---> NSDate

//    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";

//  2014-08-09 15:45:56

// 09/08/2014  15:45:56

msg.time = [fmt stringFromDate:now];

 

// 看是否須要隱藏時間

MJMessageFrame *lastMf = [self.messageFrames lastObject];

MJMessage *lastMsg = lastMf.message;

msg.hideTime = [msg.time isEqualToString:lastMsg.time];

 

 

 

 

_messageFrame = messageFrame;

//取得message模型

MJMessage *message =self.messageFrame.message;

self.messageFrame=也是右邊傳過來的:(上層代碼)

 

 

 

 

 

 

 

 

0427:QQ列表

如何改textField 的圓角

答:label.alpha = 0.0;

//    label 圖層(主圖層)

label.layer.cornerRadius = 10;

//    設置超出主圖層的子圖層的邊界自動剪切掉

label.clipsToBounds = YES;

 

09:23注意點;

2>系統自帶的cell特色?

默認的狀態:一個圖像,一個button.

有的狀態:有lable, imageView,button

 

 

 

 

1> 搭接面運行;

2>一進來3.5村,

3>字典轉模型

4>數據源方法:

保存數據的模型不須要繼承;

09:36枚舉的命名規範

1>懶加載

2>初步建立cell,初步初始化;

 

 

09:08不能用tableViewController?

若是直接使用tableViewController,自動連好了tableView的數據源和代理;

在QQ列表之類的:裏面上半部分是tableView,下面是Button,因此不能用TableViewer;

 

下面須要加view保存按鈕(三個圖片按鈕)

 

09:11技巧,修改座標的技巧,本身領悟;

09:12(添加到xcode圖片的地方)ios7的圖片不出來,修改jason文檔,在四個的裏面添加名字;fileName

 

在storyBoard中,imageView不能在上面放控件;代碼中能夠建立圖像上面添加控件;

imageView繼承UIview能夠添加控件

 

@2X的時候像素是68*68,在Xcode裏面真實的是34*34(xcode);button裏的圖片:若是添加到image中

圖片不會拉昇,添加到background中,圖片會拉伸;

 

 

0952若應用,用強引用引用着他

 

1>獲取屏幕的寬度:

1041計算屏幕的最大寬度和高度?

 

去掉分割線:兩種:seperate添加函數:

tableview上放有cell,tableView上放有不少cell;

讓tableView的某一行不能選?

在tableView的storyBoard的selction(沒法選,單選,多選);

 

讓button裏面的數據顯示多行,改storyBoard,;改按鈕的圓角:在button的borderstyle裏面

biatton裏有image和lable

 

如何設置button內邊距?  conetnInset

如何自動換行?numberoflines=0

拉伸函數?

 

ios五如何解決平鋪;

拉伸的方法:

先放一個Button,Button裏面有一個lable,lable裏面放置 有文字,Button的背景加一個圖片讓圖片的某一點拉昇,拉伸函數有幾種;

 

 

通知:發佈者:名稱接受者

 

 

15:46nil接受通知,表明誰均可以接受;監聽通知,通知消失後,註冊監聽後,對象消失後,必定銷燬監聽;

 

note.info的做用?

能夠打印出鍵盤的信息

NSLog(@"notoinfo = %@\n",note.info);

 

如何改鍵盤的return爲send?

在storyBoard裏面的修改returnKey,變爲send

 

對於崩的程序,如何肯定在哪裏崩了?

 

// 2.frame模型

//建立mf對象

MJMessageFrame *mf = [[MJMessageFrame alloc] init];

//對象中添加單個模型數據

mf.message = msg;

//含有單個模型數據和相關擴充功能的mf對象加到數組中;

[self.messageFrames addObject:mf];

 

// 3.刷新表格

[self.tableView reloadData];

 

// 4.自動滾動表格到最後一行

NSIndexPath *lastPath = [NSIndexPath indexPathForRow:self.messageFrames.count - 1 inSection:0];

[self.tableView scrollToRowAtIndexPath:lastPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

- (void)setMessageFrame:(MJMessageFrame *)messageFrame(右邊傳過來的)

 

 

單例模式:

在內存中只分配一次存儲空間:不少對象能夠一應用他;

 

 

readOnly  在一個.h文件中聲明爲只讀(只有get方法,沒有set方法)的在他的.m文件中是能夠經過直接賦值的,不能使用set方法賦值.

 

如何設置:

條件斷點:循環中讓斷點停在某個地方;處於某個特定的狀態中止;

斷點忽略-在斷點處  edit breakpoint;

點擊控制檯:print description;

異常斷點:在斷點異常的左下角中,點+,選擇:Symbolic Breakpont :在Symbol中輸入:objc_exception_throw

po 對象不存在時打印爲nil;

 

print打印基本的數據類型;

info symbol 0xffdd;

調試的時候:某一點有問題,查找某一點有關的全部代碼,一個個的檢查;

 

放在message.m中:

/**

*  根據文本計算文本佔用的寬高

*

*  @param str     要計算的文本

*  @param font    文本的字體和大小

*  @param maxSize 文本最大能佔用的寬高

*/

CGSize textSize = [self sizeWithString:message.text font:NJTextFont maxSize:maxSize];  self表明messageFrame的對象;經過self調用;

//傳入一個字符串,用一個對象調用

- (CGSize)sizeWithString:(NSString *)str font:(UIFont *)font maxSize:(CGSize)maxSize

{

NSDictionary *dict = @{NSFontAttributeName : font};

CGRect rect =  [str boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil];

return rect.size;

}

/**

*  根據文本計算文本佔用的寬高

*

*  @param str     要計算的文本

*  @param font    文本的字體和大小

*  @param maxSize 文本最大能佔用的寬高

*/直接使用message.text調用;

CGSize textSize = [message.text sizeWithFont:NJTextFont maxSize:maxSize];

- (CGSize)sizeWithFont:(UIFont *)font maxSize:(CGSize)maxSize

{

NSDictionary *dict = @{NSFontAttributeName : font};

CGRect rect =  [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil];

return rect.size;

}

 

#pragma mark - 轉換拉伸圖片方法:留出1*1的空間被拉,也能夠直接(h,w,h,w)留0.000001;

+ (UIImage *)resizableImage:(NSString *)name

{

// 建立一張圖片

UIImage *image =  [self imageNamed:name];

// 製做指定範圍能夠拉伸的圖片

CGFloat w =  image.size.width * 0.5;

CGFloat h = image.size.height * 0.5;

UIImage *resizeImage = [image resizableImageWithCapInsets:UIEdgeInsetsMake(h - 1, w - 1, h, w) resizingMode:UIImageResizingModeStretch];

return resizeImage;

}

 

 

根據文字寬高的計算公式計算出文字的size,size的寬高屬性加上間距就能夠得出button的寬高,也就是計算出文字的frame,

設置的背景和button是一塊兒的,內部的文字和button有間距,button 的frame是根據文字的size來設置的;

:

button上有文字:設置button的寬高,在設置button內部,文字的

// 3.正文frame

CGFloat contentY = iconY;

// 計算文本寬高,寬度150;

CGSize maxSize = CGSizeMake(150, MAXFLOAT);

// 文本實際佔用的寬高

//    CGSize textSize = [self sizeWithString:message.text font:NJTextFont maxSize:maxSize];

CGSize textSize = [message.text sizeWithFont:NJTextFont maxSize:maxSize];

// 計算button的寬高

CGFloat contentW = textSize.width + NJEdgeInset * 2;

CGFloat contentH = textSize.height + NJEdgeInset * 2;

CGFloat contentX = 0;

if (NJMessageTypMe == message.type) {// 本身發

contentX = iconX - padding - contentW;

}else

{

contentX = CGRectGetMaxX(_iconF) + padding;

}

_contentF = CGRectMake(contentX, contentY, contentW, contentH);

 

 

- (void)setMessageFrame:(NJMessageFrame *)messageFrame

{

 

_messageFrame = messageFrame;

//    [self settingData];

//    [self settingFrame];

NJMessage *message = self.messageFrame.message;

 

// 1.設置時間

self.timeView.text = message.time;

self.timeView.frame = messageFrame.timeF;

 

// 2.設置頭像

// 根據發送類型獲取頭像圖片的名稱

NSString *iconName = (NJMessageTypMe == message.type ? @"me" : @"other");

self.iconView.image = [UIImage imageNamed:iconName];

self.iconView.frame = messageFrame.iconF;

 

// 3.設置textView(即button)設置文字;

[self.textView setTitle:message.text forState:UIControlStateNormal];

//給textView設置frame,get和set方法

self.textView.frame = messageFrame.contentF;

 

// 設置背景圖片

if (NJMessageTypMe == message.type) { // 本身發 藍色

// 普通圖片

 

//利用已封裝好的方法給button設置一個只有中間1*1的地方能夠拉伸的頭像;

[self.textView setBackgroundImage:[UIImage resizableImage:@"chat_send_nor"] forState:UIControlStateNormal];

// 高亮圖片

 

}else

{

// 白色圖片

[self.textView setBackgroundImage:[UIImage resizableImage:@"chat_recive_nor"] forState:UIControlStateNormal];

}

 

- (BOOL)textFieldShouldReturn:(UITextField *)textField

{

//    NSLog(@"send按鈕被點擊了 %@",textField.text);

 

//    1.添加模型數據

 

//    1.1建立數據模型

NJMessage*ms=[[NJMessage alloc]init];

ms.text=textField.text;

//    1.2根據數據模型建立frame模型

NJMessageFrame*mf=[[NJMessageFrame alloc]init];

 

 

//    1.3將frame模型添加到messageFrames中

mf.message=ms;

//   [NJMessageFrame

//    2.刷新表格

[self.tableView reloadData];

 

return YES;

}

- (void)keyboardWillChange:(NSNotification *)note

{

//    NSLog(@"鍵盤彈出了");

//    讓輸入框隨着鍵盤移動就OK

//    NSLog(@"%@", note.userInfo);

 

//    1. 取出鍵盤移動結束後的Y值

CGRect rect = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];

// 鍵盤彈出後的Y值

CGFloat keyboardY  = rect.origin.y;

// 鍵盤的高度( 輸入框要移動的距離)

CGFloat transformY = keyboardY - self.view.frame.size.height;

//    NSLog(@"%.1f", transformY);

 

//    2.取出鍵盤彈出須要的時間

CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];

 

//    3.修改輸入框位置

[UIView animateWithDuration:duration animations:^{

self.inputView.transform = CGAffineTransformMakeTranslation(0, transformY);

}];

}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

{

//    NSLog(@"被拖拽了");

[self.view endEditing:YES];

}

 

{

[super viewDidLoad];

// 設置tableView的背景顏色

self.tableView.backgroundColor = [UIColor lightTextColor];

// 設置tableview不能選中

self.tableView.allowsSelection = NO;

// 註冊監聽鍵盤位置改變的通知

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

//註冊通知的監聽器,有UIKeyboardWillChangeFrameNotification事件時時,self是監聽器

 

通知中心(NSNotificationCenter)提供了方法來註冊一個監聽通知的監聽器(Observer)

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

/*observer:監聽器,即誰要接收這個通知-----self

aSelector:收到通知後,回調監聽器的這個方法,而且把通知對象當作參數傳入keyboardWillChange:

aName:通知的名稱。若是爲nil,那麼不管通知的名稱是什麼,監聽器都能收到這個通知

anObject:通知發佈者。若是爲anObject和aName都爲nil,監聽器都收到全部的通知*/

[center addObserver:self(監聽器) selector:@selector(keyboardWillChange:(回調的方法)) name:UIKeyboardWillChangeFrameNotification(通知的名稱) object:nil(nil表明監聽器能夠收到全部的對象)];//

/*self  控制器對象*/

// 監聽文本輸入框召喚出來的鍵盤的發送按鈕的點擊

// 設置文本輸入框代理

上述方法是鍵盤的,下面

self.inputTextField.delegate = self;設置代理作下面的事情;scroolView滾動時調用,滾動時讓鍵盤結束編輯;

 

/* - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

{

//    NSLog(@"被拖拽了");

[self.view endEditing:YES];

}*/

}

#pragma mark - 鍵盤位置發生改變時調用

- (void)keyboardWillChange:(NSNotification *)note

{

//    NSLog(@"鍵盤彈出了");

//    讓輸入框隨着鍵盤移動就OK

//    NSLog(@"%@", note.userInfo);

 

//    1. 取出鍵盤移動結束後的Y值

CGRect rect = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];

// 鍵盤彈出後的Y值

CGFloat keyboardY  = rect.origin.y;

// 鍵盤的高度( 輸入框要移動的距離)

CGFloat transformY = keyboardY - self.view.frame.size.height;

//    NSLog(@"%.1f", transformY);

 

//    2.取出鍵盤彈出須要的時間

CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];

 

//    3.修改輸入框位置

[UIView animateWithDuration:duration animations:^{

self.inputView.transform = CGAffineTransformMakeTranslation(0, transformY);

}];

}

 

 

 

某個控件出不來:

1.frame的尺寸和位置對不對

2.已經出來了,沒顯示正確的內容,賦值出錯,誤覺得沒出來;

2.hidden是否爲YES

3.有沒有添加到父控件中

4.alpha 是否 < 0.01

5.被其餘控件擋住了

6.父控件的前面5個狀況

 

但凡init建立的控件frame都是0;1448?必須在layOutSubviews中設置frame,init裏面不能設置frame;

layOutSubviews,必定要記住;

frame修改了會調用:-(void)layOutSubviews

 

 

.m文件中聲明的弱引用的屬性

@property (nonatomic, weak) UIImageView *iconView;

{

//在此處不能:self.timeView=[UILable alloc ]init]  self.timeView中的timeView屬性是weak的即若應用,在建立的

後就會釋放,使用新建立的默認是強引用;

UILabel *timeView = [[UILabel alloc] init];

timeView.textAlignment = NSTextAlignmentCenter;

timeView.font = [UIFont systemFontOfSize:13];

[self.contentView addSubview:timeView];

self.timeView = timeView;//右邊的timeView是強指針,左邊的是弱指針,至關於有兩個指針指着timeView,那麼timeView就不會消失

}

 

 

0428:QQ好友列表;

老師的面試題?

如何解決移動(鍵盤和輸入條)不一致:動做不一致;

使控制器(包含tableView和輸入buttton)參見0427代碼總體移動;

widow 繼承UiView window子控件是控制器view

Nslog(@"%@",self.view.superView)打印父控件;

如何解決黑色?

更改UIWindow的顏色,使UIwindow的顏色和view的背景顏色一致;

0923代碼運行-第一份代碼;

差異:鍵盤輸入框調出,有輸入框管理;

添加數據:改懶加載de NSArray 爲NSMutableArray;

 

如何操做tableView滾到最後一條?

- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)(此處是枚舉能夠進去看下什麼)scrollPosition animated:(BOOL)animated;滾到哪一行,在UITableView

 

發送完如何清空輸入框?:

self.inputView.text=nil;

 

改輸入框線的位置:

leftView,(添加一次:在viewdeload);

更改顯示模式leftViewMode的模式:代碼?

 

如何獲取當前時間:NSDate;

NSDate*date=[NSDate date];//返回當前時間;

NSLog(@"date = %@\n",date+8);//東華區,

 

時間轉字符串;如何輸出時間代碼(1節)

NSDateFormatter*fm=[NSDateFormatter alloc]init];

fm stringf

時間格式:

 

判斷是否須要時間:

取出上一條,-數組的最後一條消息;

判斷時間是否相等

 

 

 

靜態單元格;

 

若是運行結果與預期不同

有緩存:

刪模擬器軟件,再clean;

 

tableViewController添加步驟?(xib相似)

1>NJViewController 繼承與UItableVIewcontroller,

2>刪掉strory的controllerViewor 從新拖一個UItableVIewcontroller,

3>更改UItableVIewcontroller的class名位NJViewController

 

tableViewController加,改繼承,改類;

tableViewController已經實現了代理數據源方法不用拖線

 

 

改group就是分組;

 

修改模式:tableVIew-static

把cell設置爲靜態的;

 

設置靜態設置成怎麼樣就是怎麼樣的;

 

stattic-cell(basic  stytle)--設置image

下一級設置lable;

tableView group分組,設置組數(界面中);

靜態單元格用在設置等不變的地方;能夠在界面中修改行高;

0>建立tableViewController   (步驟);

1>好友列表

2>建立兩個模型:MJFRiendGroup;mjFrend

屬性:frends,name ,online

mjFrend屬性:四個屬性;(pilst文件決定)

 

3>字典轉模型

兩個方法傳字典返回模型;

//註冊全部的屬性,frends中存放的仍是字典;

對frends數組進行轉換;

 

mjFrend中提供兩個方法將字典轉換爲模型

 

kvc轉換的是字典,須要將字典轉模型

 

所有是tableView  拖一個tableView;

 

4>實現數據源方法:

4.1>多少組;

4.2>每一組有多少數據;numberof

4.2.1.取出對應租的模型

4.2.2.返回當前組中有多少好友;

4.2.3.只寫一句,再把cell打上標記@ abc,自動建立

4.2.3.1  建立模型,取出對應組的組模型;

4.2.3.2  取出組對應行的模型

4.2.3.3用對應租的模型爲cell賦值;

 

 

 

14:08打印bounds?

UITableView

5>去處狀態欄

//6>頭部標題,取得對應組的模型

 

怎麼找方法?分組的標題上放按鈕;

1>顯示分組,調用數據源的方法,因爲在頭部標題中須要能夠點的view,有一個返回nsStringd的相似的方法,不對;

2>因爲須要視圖是UIView的再到代理中找是否有返回UIView,名稱相似的方法;

 

 

6>添加頭部視圖view(解決性能)

下面的封裝,繼承與tableViewcell的類;

1.headerView中添加按鈕

建立添加到contentView

2.添加lable

建立添加lable

return cell

3.設置數據;

UIButton裏面有添加加好按鈕的方法:buttonwith...

 

設置分組的頭部視圖數據;

一個視圖不顯示:

 

NSLog(@"<#name#> = %@\n",NSStringFromCGrect);

 

QQ好友列表

 

 

 

對齊方式:

1>content內容對其方式;左對齊?代碼 contentMode

2>設置內邊距,不要太靠左代碼  inset

3>設置lable和imageView的距離:

 

展開:能夠點擊,監聽響應---

 

 

 

實現監聽函數:(不必定非得)

-(void)layOutSubviews

#warning 必定須要調用父類的方法

{

[super layOutSubViews];

}

 

旋轉:修改iamge的transform;

 

16:02展開與還原;

在init

設置視圖的高度16:10兩種方式:統一設,每一個分步設

經過cell的高度的兩種方式:

 

如何偷圖片?展現類的app,720度旋轉

docments 或者library

1>image

2>拿到image,託圖片到資源

3>設默認圖片;

4>拖動的時候從新設置一張圖片

5>設置圖片容器

建立觸摸事件:平移的手勢管理器

self表明self的某個方法(viewDidLoad)

讓imageView能夠和用戶交互;

 

6>定義變量,當前是第幾張;切換圖片

經過手勢管理器獲取在平模上的座標

圖片不顯示:刪掉從新添加;

 

代理和通知的區別?

 

打印bounds和frame的值

NSLog(@"%@", NSStringFromCGRect(view.bounds));

*  但凡在iOS中,init方法建立出來的控件frame/bounds都是0

 

UITableViewCell

@property (nonatomic, readonly, retain) UIView      *contentView;

UITableViewHeaderFooterView

@interface UITableViewHeaderFooterView : UIView

@property (nonatomic, readonly, retain) UIView *contentView;

 

 

沒有進入set方法,調用set方法的對象爲空;

 

 

0428qq頭像點擊?  0428:-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 爲甚麼警告?//可能定義cell爲另外的類型

+(instancetype)headerWithTableView:(UITableView *)tableView

{     //標記,出列,建立,放回

static  NSString *IDH = @"header";

MJHeaderView *header=[tableView  dequeueReusableHeaderFooterViewWithIdentifier:IDH];

if (nil == header) {

//若從新建立,是局部變量,執行完就銷燬,返回的永遠爲空

MJHeaderView* header=[[MJHeaderView alloc]initWithReuseIdentifier:IDH];

}

NSLog(@"headerWithTableView\n");

return header;

}

 

 

+(instancetype)cellWithTableView:(UITableView*)tableView

{  //標記,出列,建立,放回

static NSString*ID = @"friend";

 

MJFriendCell* cell = [tableView dequeueReusableCellWithIdentifier:ID  ];

if (nil==cell)

{//MJFriendCell*  cell,不能從新建立,從新建立會返回爲空

cell=[[MJFriendCell  alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];

}

return cell;

}

 

//0426qq

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

MJMessageFrame*mf=self.messageFrames[indexPath.row];   //[[MJMessageFrame  alloc]init];

// NSLog(@"%d",mf.cellheight);

MJMessageFrame*mf = [[MJMessageFrame  alloc]init]此處不能從新建立,

return  mf.cellheight;

}

 

 

[btn addTarget:self action:@selector(headerClick) forControlEvents:UIControlEventTouchUpInside];

不須要設代理,不須要設監聽,直接能夠用;

知識點:

1.若是界面上有不一樣視圖組成不能使用uitableviewcontroller

2.imageveiw在storyboard中不能添加子控件

3.設置按鈕圖片若是想要原樣顯示設置爲image便可,若是設置爲background會自動拉伸

4.設置uitextfield的背景不能選擇樣式(border style)

5.經過代碼自定義Cell;

 

 

3.1.2經過tag獲取子控件賦值

UIImageView *iconView = (UIImageView *)[appView viewWithTag:55];

iconView.image = [UIImage imageNamed:appInfo.icon];

 

//        取出UILabel

UILabel *nameLabel = (UILabel *)[appView viewWithTag:100];

nameLabel.text = appInfo.name;

 

 

contentOffset位置修改,大圖展現就實現滾動

 

圖片輪播:實現原理??

 

 

#import "NJViewController.h"

 

@interface NJViewController () <UIScrollViewDelegate>

@property (weak, nonatomic) IBOutlet UIScrollView *scrollview;

/**

*  頁碼

*/

@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;

 

@property (nonatomic, strong) NSTimer *timer;

@end

 

@implementation NJViewController

 

- (void)viewDidLoad

{

[super viewDidLoad];

 

 

//    圖片的寬

CGFloat imageW = self.scrollview.frame.size.width;

//    CGFloat imageW = 300;

//    圖片高

CGFloat imageH = self.scrollview.frame.size.height;

//    圖片的Y

CGFloat imageY = 0;

//    圖片中數

NSInteger totalCount = 5;

//   1.添加5張圖片

for (int i = 0; i < totalCount; i++) {

UIImageView *imageView = [[UIImageView alloc] init];

//        圖片X

CGFloat imageX = i * imageW;

 

//        設置frame

imageView.frame = CGRectMake(imageX, imageY, imageW, imageH);

 

//        設置圖片

NSString *name = [NSString stringWithFormat:@"img_0%d", i + 1];

imageView.image = [UIImage imageNamed:name];

//        隱藏指示條

self.scrollview.showsHorizontalScrollIndicator = NO;

 

[self.scrollview addSubview:imageView];

}

 

//    2.設置scrollview的滾動範圍

CGFloat contentW = totalCount *imageW;

self.scrollview.contentSize = CGSizeMake(contentW, 0);

 

//    3.設置分頁

self.scrollview.pagingEnabled = YES;

 

//    self.pageControl.currentPage = 3;

 

//    4.監聽scrollview的滾動    控制器的對象的地址傳給了scrollView的代理的地址

//   控制器對象和scrollView指向同一對象

self.scrollview.delegate = self;

 

 

//    NSTimer // 定時器 適合用來隔一段時間作一些間隔比較長的操做

/*

NSTimeInterval:多長多件操做一次

target :操做誰

selector : 要操做的方法

userInfo: 傳遞參數

repeats: 是否重複

*/

//   self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];

[self addTimer];

 

}

 

- (void)nextImage

{

//    NSLog(@"切換圖片");

//    1.獲取頁碼

/*

if (self.pageControl.currentPage == 4) {

self.pageControl.currentPage = 0;

}else

{

//        假設當前是第0頁   變成第一頁,就會馬上把小紅點變成第一頁

self.pageControl.currentPage++;

}

*/

 

int page = self.pageControl.currentPage;

if (page == 4) {

page = 0;

}else

{

page++;

}

 

 

//    2.滾動scrollview

//    CGFloat x = self.pageControl.currentPage * self.scrollview.frame.size.width;

CGFloat x = page * self.scrollview.frame.size.width;

 

self.scrollview.contentOffset = CGPointMake(x, 0);

}

 

// scrollview滾動的時候調用

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

{

 

NSLog(@"滾動中");

//    計算頁碼

//    頁碼 = (contentoffset.x + scrollView一半寬度)/scrollView寬度

CGFloat scrollviewW =  scrollView.frame.size.width;

CGFloat x = scrollView.contentOffset.x;

int page = (x + scrollviewW / 2) /  scrollviewW;

self.pageControl.currentPage = page;

}

 

// 開始拖拽的時候fxs

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

{

//    關閉定時器(注意點; 定時器一旦被關閉,沒法再開啓)

//    [self.timer invalidate];

[self removeTimer];

}

 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

{

//    開啓定時器

[self addTimer];

}

 

/**

*  開啓定時器

*/

- (void)addTimer{

 

self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];

[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

}

/**

*  關閉定時器

*/

- (void)removeTimer

{

[self.timer invalidate];

}

 

傳智電臺的做用:

- (void)viewDidLoad

{

[super viewDidLoad];

CGFloat lastY = self.lastBtn.frame.origin.y + self.lastBtn.frame.size.height + 10 /* + 44 */;

//     只要不橫向滾動, 寬度能夠設置爲0

//    設置滾動範圍

self.scrollview.contentSize = CGSizeMake(0, lastY);

 

//    2.爲了避免讓導航view擋住scrollview

//    設置外邊距

self.scrollview.contentInset = UIEdgeInsetsMake(64, 0, 44, 0);

 

//    設置contentOffset

//    1.取出之前的offset

CGPoint tempOffset = self.scrollview.contentOffset;

//    2.修改之前的位置

tempOffset.y = -64;

//    3.覆蓋之前的offset

self.scrollview.contentOffset = tempOffset;

}

 

大圖展現中修改contentOffset的值就能夠實現滾動;

 

 

圖片縮放:只要添加函數就能夠完成縮放嗎?

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView

{

NSLog(@"開始縮放");

return self.imageView;

}

 

//縮放過程當中調用

- (void)scrollViewDidZoom:(UIScrollView *)scrollView

{

NSLog(@"正在縮放");

}

 

 

/**

*  縮放結束時調用

*

*  @param scrollView 當前的scrollview

*  @param view       被縮放的view

*  @param scale      縮放的比例

*/

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale

{

NSLog(@"縮放結束");

NSLog(@"view = %@, scale = %.1f", view, scale);

}

 

typedef  enum {

MJMessageTypeMe=0,

MJMessageTypeOther

} MJMessageType;  不能定義再累擴展中,MJMessageType不會被發現?

 

 

打印frame利器:

NSStringFromCGAffineTransorm(CGAffineTransorm transform)

NSStringFromClass(<#__unsafe_unretained Class aClass#>)

NSStringFrom.....打印frame,size.point.aff,transfrom,

NSStringFromClass(<#__unsafe_unretained Class aClass#>)

NSStringFromCGSize(<#CGSize size#>)

NSStringFromCGPoint(<#CGPoint point#>)

NSStringFromCGAffineTransform(<#CGAffineTransform transform#>)

NSStringFromProtocol(<#Protocol *proto#>)

NSStringFromRange(<#NSRange range#>)

NSStringFromSelector(<#SEL aSelector#>)

NSStringFromUIEdgeInsets(<#UIEdgeInsets insets#>)

NSStringFromUIOffset(<#UIOffset offset#>)

NSStringFromUIOffset(<#UIOffset offset#>)

 

微博本身敲的錯誤總結:

1>在左上角顯示頭像的位置顯示VIP是由於,顯示頭像賦值時,賦給的是vip圖標;正文的字體,賦值給時間顯示;

2>字體無顯示,沒有字體的frame:也是賦值frame的時候ok,傳智frame的"過橋時"兩個frame不是同一個;        NSLog(@"打印frame利器:%@",NSStringFromCGRect(self.pictureView.frame));

[NSStrin]

3>圖片無顯示,前面設置好frame,在最後顯示的時候,沒有將設置號的值賦值過去,傳值環節出問題;

經過打印設置frame的最後一步肯定;

 

instancetype 和  MJMessageCell的值 不能寫錯:instancetype不是UITableViewcell,

MJMessageCell  不要寫爲 uUITableViewcell

+( instancetype)cellWithTableView:(UITableView *)tableView

{

static  NSString *ID=@"message";

MJMessageCell *cell=[tableView  dequeueReusableCellWithIdentifier:ID];

if (cell == nil) {

cell = [[MJMessageCell  alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];

}

return cell;

}

 

 

 

UIImageView *iconView = [[UIImageView  alloc]init];

[self.iconView  addSubview: iconView];

self.iconView = iconView;

 

self.iconView.image = [UIImage  imageNamed: @"me"];

_iconView.frame =messageFrame.iconF;

NSLog(@" self.iconView.frame = %@\n", NSStringFromCGRect(self.iconView.frame))  ;

NSLog(@"iconframe = %@\n",NSStringFromCGRect(messageFrame.iconF));

打印發現_iconView爲nil 爲nil說明是上一層的錯誤, 再找上一層,發現加控件錯了;

[self.iconView  addSubview: iconView];

 

 

 

QQ發消息中鍵盤不能移動只是inputView移動到上面,改成view總體移動就解決問題了,view上面有tablView和view,因此讓view總體,移動,

 

一個文本lable在沒有寫入文字的時候,給文字設置顏色,可能會沒顯示;或者設置的文字可能不成功; 9o

 

 

字典轉模型:若是一個plist文件下面

 

汽車列表:plist=NSString*title +  NSArray*cars

 

- (instancetype)initWithDict:(NSDictionary *)dict

{

if (self = [super init]) {

self.title = dict[@"title"];

NSArray *dictArray = dict[@"cars"];

NSMutableArray *modles = [NSMutableArray  arrayWithCapacity:dictArray.count];

for (NSDictionary *dict in dictArray) {

MJCar *car = [MJCar  carWithDict:dict];

[modles addObject:car];

}

self.cars = modles;

}

return  self;

}

 

好友列表:plist 兩個屬性 +NSArray* friends

-(instancetype)initWithDict:(NSDictionary *)dict

{

if (self=[super  init])

{

//注入全部的屬性   三個屬性轉化爲字典

[self setValuesForKeysWithDictionary:dict];

//建立,遍歷,轉化,添加,賦值   處理特殊的屬性

 

//下面的是補充轉化,二次處理

NSMutableArray*models=[NSMutableArray arrayWithCapacity:self.friends.count];

//取出self.frends數組中的每一個字典轉化

for (NSDictionary*dict in self.friends) {

MJFriend*friend=[MJFriend  friendWithDict:dict];

[models addObject:friend];//medels是一個數組,轉化後存放4個模型的數組

}

self.friends=models;//models        是模型數組,MJFriend中friend是轉化後的模型數組:裏面存放有不少單個模型

 

}

//返回的是一組模型;

return self;

}

 

 

- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

{   //1.建立頭部視圖

MJHeaderView *header = [MJHeaderView  headerWithTableView:tableView];

//  header.userInteractionEnabled=YES;

MJFriendGroup *gp = self.groups[section];

header.group=gp;

//設置代理

header.delegate=self;

 

return header;

}

 

 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

{

//    1.取出對應的模型

NJCarGroup *cg = self.cars[section];

return cg.title;

}

 

 

設置每一行的高度:heightForRow

 

誰的代理方法用誰開頭

刷新是relaod從新加載模型數據;

什麼狀況下使用tableViewController (只有tableView一種的狀況) 和  MJViewController(界面狀況比較複雜,不僅tableView一種),怎麼區分?

 

 

什麼狀況下用系統自帶的cell,什麼狀況下須要自定義cell

1>相似於微博,QQ發消息,每一個cell的內容都不同的時候,無規律的時候須要自定義cell

2>相似團購,九宮格,自定義cell不能知足,可是數據之間是有規律的狀況下使用xib,

3>像汽車品牌展現,英雄展現,QQ好友列表等,系統的subtitle,default,title等模式能夠知足的狀況下使用系統自帶的cell

4>相似傳智猜圖,上半部分的界面固定使用storyBoard,下半部分的不固定使用代碼實現,代碼實現較麻煩,比較靈活

 

 

建立cell類,爲cell賦值等一些操做;

 

 

 

0501KVC的本質:將字典中的鍵值爲dict[@"name"]的對應的value  賦值給建立模型中屬性名爲name的值;

 

 

0501 好友列表中MJFriendGroup中setValuesForKeysForDict   這行=0504好友列表所示?(kvc的名字沒有一一對應)

 

0504  控制器中,btw中設置 btn.titleLable.text  she設置了字體和顏色沒法顯示????區別

 

 

0504好友列表的頭部視圖點擊原理待複習,bug待調試

 

/**

*  當視圖的frame被修改的時候就會調用  ?沒看見修改frame啊?(是在頭部視圖建立完成return header  而且設置了數據才調用,建立frame的時候默認有一個建立frame也算改變)

*  通常在這個方法中佈局子控件

*/

- (void)layoutSubviews

{

#warning 必定要調用父類的改方法

[super layoutSubviews];

 

//    1.設置按鈕的frame

self.btn.frame = self.bounds;

NSLog(@" = %@\n",NSStringFromCGRect(self.bounds));

//    2.設置label的frame

CGFloat labelY = 0;

CGFloat labelH = self.bounds.size.height;

CGFloat labelW = 50;

CGFloat labelX = self.bounds.size.width - 10 - labelW;

self.nameLabel.frame = CGRectMake(labelX, labelY, labelW, labelH);

}

 

 

 

#pragma mark - 當視圖被添加到別的視圖中的時候就會調用

- (void)didMoveToSuperview

{

// 修改三角形的旋轉角度

//    NSLog(@"當前視圖被添加到了其它視圖中");

// 判斷當前組是否展開

if (self.group.isOpened) {

//  展開狀態

self.btn.imageView.transform = CGAffineTransformMakeRotation(M_PI_2);

}else

{

// 合攏狀態

self.btn.imageView.transform = CGAffineTransformIdentity;

}

}

 

 

 

//通知控制器刷新表格,看下self的代理是否實現了headerViewDidClicked:這個方法,若是實現了這個方法

// 就通知self的代理(指代控制器)  去調用headerViewDidClicked這個方法

if ([self.delegate  respondsToSelector:@selector(headerViewDidClicked:)])

{

[self.delegate headerViewDidClicked:self];

}

 

 

0504

pickerView  不用設寬高 拖數據源

自帶的,連線不須要協議和設代理?相似UITableViewController

隨機函數

self.foods.count

正確的:[self.foods  count]  錯誤:self.Foods[0].count     self.Foods[0]= [self.foods objectAtIndex 0]

objectAtIndex返回的是id類型的;

 

1029  1034做業

button裏面

1056批量改類名(文件)技巧,變藍色修改

pickerView設間距:行高高點54;

viewForRow一行出現視野會調用,相似cellforRow

 

dataPichker  改歸屬地

中文:model  date只顯示日期

pick裏面有最小時間和最大時間

 

textField  能夠設置鍵盤的格式(時間選擇器)

 

toolBar只能添加bar  button

添加別的自動包裝成bar  button

 

barButton是有樣式,在ios7無效

flexible  可拉昇的;能夠移到靠右;

 

屏幕的動態獲取

self

1420的第三個自動拉昇\

 

test  用在單元測試中,include  unitytest  xcode4中勾選以後纔會出選test

prodecuts 文件對於ios是廢物

 

ipone  正,左右,ipone  upsde down不支持

 

 

pch文件自動去掉nslog

開發:打印日誌

打包:打包程序上傳到appstore

pch文件:先看下公司是否有自定義的宏  ,nslog

自定義log

 

 

DEBUG 宏:(在公司不要使用nslog):(目前不要使用nslog,自定義log );

 

UIApplication 是應用程序的象徵

UIApplication *app = [UIApplication sharedApplication];得到單利對象(程序啓動建立的第一個對象);

 

UIApplication應用級別的操做,用應用A打開應用B,分享;

多個對象同一地址:單例

屢次獲取的地址都相同;

 

設置顯示聯網狀態  看菊花

app.networkActivityIndicatorVisible = YES;

 

0表明 清除圖標右上角的數字  998添加圖標數字

app.applicationIconBadgeNumber = 0;

 

lightContent是白色的字體

 

app.statusBarStyle = UIStatusBarStyleLightContent;(修改狀態欄樣式)

 

[app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];狀態欄的動畫

app.statusBarHidden = YES(全部的狀態欄都會隱藏); 隱藏狀態欄:動態的顯示修改狀態欄:(動態)

// URL : 一個資源的惟一路徑

 

// URL的組成 == 協議頭://主機域名/路徑

 

網絡資源URL的組成 == http(協議頭)://www.baidu.com/1.png

 

// 本地文件資源URL的組成 == file:///Users/apple/Desktop/1.png(無資源地址,本地)

[app openURL:[NSURL URLWithString:@"http://ios.itcast.cn"]];

 

使用app打開網頁

[app openURL:[NSURL URLWithString:@"http://ios.itcast.cn"]];

 

打電話

[app openURL:[NSURL URLWithString:@"tel://10086"]];

發短信

[app openURL:[NSURL URLWithString:@"sms://10086"]];

郵件

[app openURL:[NSURL URLWithString:@"Mailto://lnj@126.cn"]];

打開其餘的應用程序

 

default.png 顯示完畢,程序啓動完畢

程序啓動完畢後當即執行的指令:

程序進入後臺執行的指令:這個方法一般在這個方法中保存應用信息

程序進入前臺執行的方法;

從新獲取焦點

即將失去焦點:失去焦點不能使用

 

 

 

 

iOS程序啓動完畢後,建立的第一個視圖控件就是UIWindow,接着建立控制器的view,最後將控制器的view添加到UIWindow上,因而控制器的view就顯示在屏幕上了

 

一個iOS程序之因此能顯示到屏幕上,徹底是由於它有UIWindow

 

也就說,沒有UIWindow,就看不見任何UI界面

 

 

 

添加UIView到UIWindow中兩種常見方式:

- (void)addSubview:(UIView *)view;

直接將view添加到UIWindow中,但並不會理會view對應的UIViewController

\@property(nonatomic,retain) UIViewController *rootViewController;

自動將rootViewController的view添加到UIWindow中,負責管理rootViewController的生命週期

 

經常使用方法

- (void)makeKeyWindow;

讓當前UIWindow變成keyWindow(主窗口)

 

- (void)makeKeyAndVisible;

讓當前UIWindow變成keyWindow,並顯示出來

 

window view

誰是爸

1648 之間的關係,強應用,

 

只要有強引用使用對象,對象就不會釋放,有強指針指着他;

 

hosring  文本換行或者特殊的字符youcompleteme插件,在vim中添加自動代碼補全的功能;

 

 

創建一個工程後,會在Supporting files文件夾下看到一個「工程名-Info.plist」的文件,該文件對工程作一些運行期的配置,很是重要,不能刪除

 

 

在舊版本Xcode建立的工程中,這個配置文件的名字就叫「Info.plist」

項目中其餘Plist文件不能帶有「Info」這個字眼,否則會被錯認爲是傳說中很是重要的「Info.plist」

項目中還有一個InfoPlist.strings的文件,跟Info.plist文件的本地化相關

 

常見屬性(紅色部分是用文本編輯器打開時看到的key)

Localiztion native development region(CFBundleDevelopmentRegion)-本地化相關

 

Bundle display name(CFBundleDisplayName)-程序安裝後顯示的名稱,限制在10-12個字符,若是超出,將被顯示縮寫名稱

 

Icon file(CFBundleIconFile)-app圖標名稱,通常爲Icon.png

 

Bundle version(CFBundleVersion)-應用程序的版本號,每次往App Store上發佈一個新版本時,須要增長這個版本號

 

Main storyboard file base name(NSMainStoryboardFile)-主storyboard文件的名稱

 

Bundle identifier(CFBundleIdentifier)-項目的惟一標識,部署到真機時用到

 

 

 

 

項目的Supporting files文件夾下面有個「工程名-Prefix.pch」文件,也是一個頭文件

 

pch頭文件的內容能被項目中的其餘全部源文件共享和訪問

 

通常在pch文件中定義一些全局的宏

 

在pch文件中添加下列預處理指令,而後在項目中使用Log(…)來輸出日誌信息,就能夠在發佈應用的時候,一次性將NSLog語句移除(在調試模式下,纔有定義DEBUG)

#ifdef DEBUG

#define Log(...) NSLog(__VA_ARGS__)

#else

#define Log(...) /* */

#endif

 

 

設置應用程序圖標右上角的紅色提醒數字

@property(nonatomic) NSInteger applicationIconBadgeNumber;

 

 

 

 

設置聯網指示器的可見性

@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;

 

 

若是想利用UIApplication來管理狀態欄,首先得修改Info.plist的設置

 

全部的移動操做系統都有個致命的缺點:app很容易受到打擾。好比一個來電或者鎖屏會致使app進入後臺甚至被終止

 

還有不少其它相似的狀況會致使app受到干擾,在app受到干擾時,會產生一些系統事件,這時UIApplication會通知它的delegate對象,讓delegate代理來處理這些系統事件

 

delegate可處理的事件包括:

應用程序的生命週期事件(如程序啓動和關閉)

系統事件(如來電)

內存警告

… …

[self.foods[component] count]計算二維數組中某個一維數組的個數

 

 

 

/        3.讓pickerview主動選中某一行某一列

[self.pickerView selectRow:newRow inComponent:component animated:YES];

 

//        經過代碼讓pickerview選中某一行不會調用代理的didSelectRow方法

 

//        4.手動調用didSelectRow方法(更改lable的文字)

[self pickerView:nil didSelectRow:newRow inComponent:component];

 

 

 

/**

pch文件的做用:

1.存放一些全局的宏(整個項目中都用得上的宏)

2.用來包含一些所有的頭文件(整個項目中都用得上的頭文件)

3.能自動打開或者關閉日誌輸出功能

*/

 

#import <Availability.h>

 

#ifndef __IPHONE_5_0

#warning "This project uses features only available in iOS SDK 5.0 and later."

#endif

// 寫在__OBJC__裏面的代碼被全部的.m 和 .mm文件共享

// 之後全部和OC相關的東西都方法__OBJC__裏面#ifdef __OBJC__ #endif  裏面有嵌套

#ifdef __OBJC__

#import <UIKit/UIKit.h>

#import <Foundation/Foundation.h>

 

#define NUMBER 55

#import "NJPerson.h"

 

#ifdef DEBUG

#define NJLog(...) NSLog(__VA_ARGS__)

#else

#define NJLog(...)

#endif

 

#endif

 

// 寫在__OBJC__外面的代碼被全部的文件共享  裏面外面怎麼區分?

#define ABC 10

 

//#import "NJPerson.h"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

程序啓動就執行

 

self.window.frame = [UIScreen mainScreen].bounds;(bounds從00開始?)

 

self.window = window;保存,使用強指針指向他,不然是局部變量

 

MjOneViewController *one = [[MjOneViewController alloc] init];

//    [self.window addSubview:one.view];

self.window.rootViewController = one;

兩種的區別:0921選裝,更着轉,強弱應用

 

程序啓動

老師筆

MjOneViewController *one = [[MjOneViewController alloc] init];

//    [self.window addSubview:one.view];

self.window.rootViewController = one;

 

一.UIPickerView

1.UIPickerView的常見屬性

// 數據源(用來告訴UIPickerView有多少列多少行)

@property(nonatomic,assign) id<UIPickerViewDataSource> dataSource;

// 代理(用來告訴UIPickerView每1列的每1行顯示什麼內容,監聽UIPickerView的選擇)

@property(nonatomic,assign) id<UIPickerViewDelegate>   delegate;

// 是否要顯示選中的指示器

@property(nonatomic)        BOOL                       showsSelectionIndicator;

// 一共有多少列

@property(nonatomic,readonly) NSInteger numberOfComponents;

 

2.UIPickerView的常見方法

// 從新刷新全部列

- (void)reloadAllComponents;

// 從新刷新第component列

- (void)reloadComponent:(NSInteger)component;

 

// 主動選中第component列的第row行

- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated;

 

// 得到第component列的當前選中的行號

- (NSInteger)selectedRowInComponent:(NSInteger)component;

 

3.數據源方法(UIPickerViewDataSource)

//  一共有多少列

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;

//  第component列一共有多少行

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;

 

4.代理方法(UIPickerViewDelegate)

//  第component列的寬度是多少

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;

//  第component列的行高是多少

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component;

 

//  第component列第row行顯示什麼文字

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;

 

//  第component列第row行顯示怎樣的view(內容)

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view;

 

//  選中了pickerView的第component列第row行

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component;

 

二.UIDatePicker

1.常見屬性

// datePicker的顯示模式

@property (nonatomic) UIDatePickerMode datePickerMode;

// 顯示的區域語言

@property (nonatomic, retain) NSLocale   *locale;

 

2.監聽UIDatePicker的選擇

* 由於UIDatePicker繼承自UIControl,因此經過addTarget:...監聽

 

三.程序啓動的完整過程

1.main函數

 

2.UIApplicationMain

* 建立UIApplication對象

* 建立UIApplication的delegate對象

 

3.delegate對象開始處理(監聽)系統事件(沒有storyboard)

* 程序啓動完畢的時候, 就會調用代理的application:didFinishLaunchingWithOptions:方法

* 在application:didFinishLaunchingWithOptions:中建立UIWindow

* 建立和設置UIWindow的rootViewController

* 顯示窗口

 

3.根據Info.plist得到最主要storyboard的文件名,加載最主要的storyboard(有storyboard)

* 建立UIWindow

* 建立和設置UIWindow的rootViewController

* 顯示窗口

keyWindow:鍵盤顯示的window

讓window成爲keyWindow(主窗口)

//    [self.window makeKeyWindow];並不會顯示,只是成爲主要window

// 讓window成爲keyWindow(主窗口)\而且可見

[self.window makeKeyAndVisible];

//    self.window = window;(強指針保存,不然局部銷燬)

0920平模旋轉事件過程

.keyWindow

[UIApplication sharedApplication].keyWindow);獲取主UIWindow

 

主window接受鍵盤點擊

uitextField默認透明

tf.borderStyle = UITextBorderStyleRoundedRect;

 

ios7以前只有keywindow才能接受鍵盤輸入和觸摸

ios7 以後

根控制器

 

 

NSLog(@"%@", [UIApplication sharedApplication].windows);

獲取全部的window

 

鍵盤處在一個獨立的window中

獲取鍵盤的view 從而自定義

 

 

layoutSubviews

在建立的時候,自動賦值frame,至關於改變了frame因此會調用

1016?

主窗口才能接受鍵盤

 

 

一個window只能有一個跟控制器

 

 

控制器常見的建立方式有如下幾種

經過storyboard建立,建立,添加

 

直接建立

MJViewController *mj = [[MJViewController alloc] init];

 

指定xib文件來建立

MJViewController *mj = [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];

 

 

系統建立控制器

控制器的三種建立方式

 

fiesOwner

裏面的class設置爲那個控制器(類名),就能夠爲那個控制器服務,連線fileowner

 

 

11:38總結0506  view建立的八種方式

控制器的view 加載;

 

 

 

UINavigationController的使用步驟

初始化UINavigationController

設置UIWindow的rootViewController爲UINavigationController

根據具體狀況,經過push方法添加對應個數的子控制器

導航條44:20導航欄

導航控制器經過棧的形式管理子控制器

 

當前看到的是棧頂的控制器

push移開,back  控制器和view 銷燬

 

autolayOut  子控件的不現實,或者結果不對的時候,去掉autolayOUt的溝,不然一個控件移動他會自動佈局,影響結果;

 

導航控制器的棧兩種形式

root控制器棧低的控制器

棧頂的.nav  topView

 

放回出棧,前進進棧;

[控制器  popView ]移除棧頂的控制器

根=棧低

pop  出移除 push推入

程序加載完畢:viewDidLoad

self.UINavigationItem.title

 

返回按鈕不是當前的控制器,是有上一個控制器決定,其餘的都是當前控制器決定

nav.UINavigationBar.frame 打印frame

1616?爲何拖nav

storyBoard 拖線不能往回拖

 

viewWillUnload  即將銷燬的時候調用

viewDidUnload   徹底銷燬

配合內存警告使用

 

 

 

 

// 建立控制器

NJViewController *vc = [[NJViewController alloc] init];

 

// 添加控制器的view到window上面

// 這種方式很差,不推薦

//    [self.window addSubview:vc.view];  view添加後被強引用着,NJViewController的對象會被提早釋放

 

 

 

// 設置window的根控制器

self.window.rootViewController = vc;

 

// 3.顯示window

[self.window makeKeyAndVisible];

return YES;

 

 

 

打印方法(當前的window和rootController)

NSLog(@"self.Window = %@\n",self.window);

NSLog(@"rootControl = %@\n",self.window.rootViewController);

 

建立一個控制器 若是沒指定跟控制器,會是默認的白色,即便給控制器的View設置有顏色;

 

outlet連線

連接folesOwner做用是什麼這隻self.view

 

 

從xib中加載storyBoard  拖兩個view 更改xib所屬的類名(控制器的類),當有兩個view的時候

 

那個控制器是根控制器,那麼就顯示根控制器的顏色

 

storyBoard的本質是將storyBoard轉化爲代碼

 

 

//  nav.viewControllers == nav.childViewControllers

 

//經常使用

 

 

建立window必須得初始化frame 不然上面的控件不顯示,或者不起做用

 

 

遍歷出UIView中的全部子控件;並將遍歷的結果寫入文件

- (void)applicationDidBecomeActive:(UIApplication *)application

{

 

NSString *xml =  [self digView:self.window];

[xml writeToFile:@"/Users/wg689/Desktop/ios6.xml" atomically:YES];

 

}

// 取出window中全部的子控件 以及他們的frame

- (NSString *)digView:(UIView *)view

{

if ([view isKindOfClass:[UITableViewCell class]]) return @"";

// 1.初始化

NSMutableString *xml = [NSMutableString string];

 

// 2.標籤開頭

[xml appendFormat:@"<%@ frame=\"%@\"", view.class, NSStringFromCGRect(view.frame)];

if (!CGPointEqualToPoint(view.bounds.origin, CGPointZero)) {

[xml appendFormat:@" bounds=\"%@\"", NSStringFromCGRect(view.bounds)];

}

 

if ([view isKindOfClass:[UIScrollView class]]) {

UIScrollView *scroll = (UIScrollView *)view;

if (!UIEdgeInsetsEqualToEdgeInsets(UIEdgeInsetsZero, scroll.contentInset)) {

[xml appendFormat:@" contentInset=\"%@\"", NSStringFromUIEdgeInsets(scroll.contentInset)];

}

}

 

// 3.判斷是否要結束

if (view.subviews.count == 0) {

[xml appendString:@" />"];

return xml;

} else {

[xml appendString:@">"];

}

 

// 4.遍歷全部的子控件

for (UIView *child in view.subviews) {

NSString *childXml = [self digView:child];

[xml appendString:childXml];

}

 

// 5.標籤結尾

[xml appendFormat:@"</%@>", view.class];

 

return xml;

}

 

0508預習筆記

在恰當的時刻,使用perform方法執行對應的Segue

[self performSegueWithIdentifier:@"login2contacts" sender:nil];?

// Segue必須由來源控制器來執行,也就是說,這個perform方法必須由來源控制器來調用

利用performSegueWithIdentifier:方法能夠執行某個Segue(繼續==線對象),完成界面跳轉

 

若是點擊某個控件後,須要作一些判斷,也就是說:知足必定條件後才跳轉到下一個界面,建議使用「手動型Segue」

 

 

接下來研究performSegueWithIdentifier:sender:方法的完整執行過程

[self performSegueWithIdentifier:@「login2contacts」 sender:nil(/*同對象*/)];

// 這個self是來源控制器

1>找到線,新建  2>設置來源和目標

根據identifier去storyboard中找到對應的線,新建UIStoryboardSegue對象

設置Segue對象的sourceViewController(來源控制器)

新建而且設置Segue對象的destinationViewController(目標控制器)

 

跳轉的步驟:

1>準備,建立對象

調用sourceViewController的下面方法,作一些跳轉前的準備工做而且傳入建立好的Segue對象

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender(/*同對象*/);

// 這個sender是當初performSegueWithIdentifier:sender:中傳入的sender

2>開始跳轉

調用Segue對象的- (void)perform;方法開始執行界面跳轉操做

3>取得導航控制器

取得sourceViewController所在的UINavigationController

4>壓棧 完成跳轉

調用UINavigationController的push方法將destinationViewController壓入棧中,完成跳轉

 

跟UINavigationController(導航控制器)相似

,UITabBarController也能夠輕鬆地管理多個控制器,輕鬆完成控制器之間的切換,典型例子就是QQ、微信等應用

 

 

每一個iOS應用都有本身的應用沙盒(應用沙盒就是文件系統目錄),與其餘文件系統隔離。應用必須待在本身的沙盒裏,其餘應用不能訪問該沙盒

應用沙盒的文件系統目錄,以下圖所示(假設應用的名稱叫Layer)

模擬器應用沙盒的根路徑在: (apple是用戶名, 6.0是模擬器版本)

/Users/apple/Library/Application Support/iPhone Simulator/6.0/Applications

 

// 應用沙盒的結構分析:

1>應用程序包:(上圖中的Layer)包含了全部的資源文件和可執行文件

2> Documents:保存應用運行時生成的須要持久化的數據,iTunes同步設備時會備份該目錄。例如,遊戲應用可將遊戲存檔保存在該目錄

 

3> tmp:保存應用運行時所需的臨時數據,使用完畢後再將相應的文件從該目錄刪除。應用沒有運行時,系統也可能會清除該目錄下的文件。iTunes同步設備時不會備份該目錄

 

4> Library/Caches:保存應用運行時生成的須要持久化的數據,iTunes同步設備時不會備份該目錄。通常存儲體積大、不須要備份的非重要數據

 

5> Library/Preference:保存應用的全部偏好設置,iOS的Settings(設置)應用會在該目錄中查找應用的設置信息。iTunes同步設備時會備份該目錄

 

 

沙盒根目錄:NSString *home = NSHomeDirectory();

 

Documents:(2種方式)

利用沙盒根目錄拼接」Documents」字符串

NSString *home = NSHomeDirectory();

NSString *documents = [home stringByAppendingPathComponent:@"Documents"];

// 不建議採用,由於新版本的操做系統可能會修改目錄名

利用NSSearchPathForDirectoriesInDomains函數

// NSUserDomainMask 表明從用戶文件夾下找

// YES 表明展開路徑中的波浪字符「~」

NSArray *array =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask<表明從用戶文件夾下找>, NO<不展開路徑的波浪字符>);

// 在iOS中,只有一個目錄跟傳入的參數匹配,因此這個集合裏面只有一個元素

NSString *documents = [array objectAtIndex:0];

 

 

0508私人通信錄

1>界面搭建

多個控制器,使用導航來管理其餘的控制器

2>登錄界面(viewController,普通View界面)  ,聯繫人界面(繼承UItableView),添加聯繫人界面(繼承View 不能夠滾),編輯界面(不能夠滾,普通的view),

3>登錄界面(viewController,普通View界面),設置rootView(拖view 的線),一個總體就放在view上,(使用view來管理子控件).title(雙擊頭部標題)

4>要得到屬性監聽->連線,剛開始btn不能點:enable 去掉溝

5>監聽方式選擇(輸入文本框):addTarget通常監聽按鈕的點擊,以及進度條值的改變(無方法),  --代理(中沒有UItextFieldDelegate中沒有監聽輸入框值改變的方法)  --通知

6>  [[NSNotificationCenter defaultCenter](建立通知中心) addObserver:self (誰來監聽)selector:@selector(textChange(接到通知後執行的操做)) name:UITextFieldTextDidChangeNotification(通知名稱) object:self.pwdField(誰發送的通知)(nil表明誰發送均可以接受通知,此處不能寫nil,只能接受兩個,不是多個的通知)];

UITextFieldTextDidChangeNotification(輸入框改變的時候會發出此通知)

7>拖線自動登陸,記住密碼

8>登陸作完,作聯繫人列表,拖下一個界面;

9>數據傳遞

10>判斷是否登陸正確:連線,監聽:若是正確

 

 

 

 

拖不了線===沒創建關係:類名

不須要參數就手寫代碼

alert彈框顯示:show一下

彈框:UIActionSheet   1>建立  2>顯示:showInView

避免每次輸入密碼:直接修改代碼:輸入數據肯定,省得每次輸入

 

btn.enable =YES;表明btn能夠用,

placeHolder   輸入框提示:(*)必填

暗文  secure

UISwith和按鈕同樣:

 

segue:身份,來自哪,去哪;

手動的:控制器拖到控制器(表面上看是View);

 

自動:控件到控制器

coco4app  加快工做效率

封裝:->

 

 

/**

*  執行segue後,跳轉以前會調用這個方法

*  通常在這裏給下一個控制器傳遞數據

*/

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{

// 1.取得目標控制器(聯繫人列表控制器)

UIViewController *contactVc = segue.destinationViewController;

 

// 2.設置標題

contactVc.title = [NSString stringWithFormat:@"%@的聯繫人列表", self.accountField.text];

// contactVc.title 等價於 contactVc.navigationItem.title

//    contactVc.navigationItem.title = [NSString stringWithFormat:@"%@的聯繫人列表", self.accountField.text];

}

 

 

須要修改cpntroller的類;下一個控制器:的返回上個控制器決定,copy 代碼  不會拷貝連線

 

通知不用須要移除

讓鍵輸入框成爲第一響應者:就能夠當即召喚出鍵盤

讓姓名

 

stro  xib建立的都不會調用init方法

 

若是對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,能夠直接用NSKeyedArchiver進行歸檔和恢復(不能寫歸檔)

不是全部的對象均可以直接用這種方法進行歸檔,只有遵照了NSCoding協議的對象才能夠

NSCoding協議有2個方法:

encodeWithCoder:

每次歸檔對象時,都會調用這個方法。通常在這個方法裏面指定如何歸檔對象中的每一個實例變量,可使用encodeObject:forKey:方法歸檔實例變量

initWithCoder:

每次從文件中恢復(解碼)對象時,都會調用這個方法。通常在這個方法裏面指定如何解碼文件中的數據爲對象的實例變量,可使用decodeObject:forKey方法解碼實例變量

 

 

NSString *home = NSHomeDirectory();

 

// 2.document路徑

NSString *docPath = [home stringByAppendingPathComponent:@"Documents"];

 

// 3.新建數據

//    MJPerson *p = [[MJPerson alloc] init];

//    p.name = @"rose";

NSArray *data = @[@"jack", @10, @"ffdsf"];

 

 

// 1.利用NSUserDefaults,就能直接訪問軟件的偏好設置(Library/Preferences)

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

 

 

// 3.馬上同步:保存數據

[defaults synchronize];

 

發送未識別的消息.沒有那個方法(找不到這個方法);

 

 

 

- (IBAction)save {

// 1.新的模型對象

MJStudent *stu = [[MJStudent alloc] init];

stu.no = @"42343254";

stu.age = 20;

stu.height = 1.55;

 

// 2.歸檔模型對象

// 2.1.得到Documents的全路徑

NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

// 2.2.得到文件的全路徑

NSString *path = [doc stringByAppendingPathComponent:@"stu.data"];

// 2.3.將對象歸檔

[NSKeyedArchiver archiveRootObject:stu toFile:path];

}

 

- (IBAction)read {

// 1.得到Documents的全路徑

NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

// 2.得到文件的全路徑

NSString *path = [doc stringByAppendingPathComponent:@"stu.data"];

 

// 3.從文件中讀取MJStudent對象

MJStudent *stu = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

 

NSLog(@"%@ %d %f", stu.no, stu.age, stu.height);

}

 

 

/**

*  將某個對象寫入文件時會調用

*  在這個方法中說清楚哪些屬性須要存儲

*/

- (void)encodeWithCoder:(NSCoder *)encoder

{

[encoder encodeObject:self.no forKey:@"no"];

[encoder encodeInt:self.age forKey:@"age"];

[encoder encodeDouble:self.height forKey:@"height"];

}

 

/**

*  從文件中解析對象時會調用

*  在這個方法中說清楚哪些屬性須要存儲

*/

- (id)initWithCoder:(NSCoder *)decoder

{

if (self = [super init]) {

// 讀取文件的內容

self.no = [decoder decodeObjectForKey:@"no"];

self.age = [decoder decodeIntForKey:@"age"];

self.height = [decoder decodeDoubleForKey:@"height"];

}

return self;

}  extern

 

 

父頁面是tableViewceller,父父頁面是navigationer,子頁面 tableViewceller,父子頁面之間沒連線的時候,子頁面的tableViewcontroll是沒法顯示導航條的標題的

 

英文的時候能夠本地化裏面修改,sh

 

導航上添加按鈕:經過代碼

 

tableView從新顯示:兩個步驟:

1>增長模型

2>刷新表格

3>持久化數據

 

每一個Cell 有 contenTView =圖像+text  +text

 

 

 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

 

/*

// 1.沒有xib和storyboard的狀況(默認會建立一個空白色view)

NJOneViewController *one = [[NJOneViewController alloc] init];

one.view.backgroundColor = [UIColor redColor];

*/

 

/*

// 2.經過storyboard建立(會去storyboard中建立剪頭指向的view)

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];

NJOneViewController *one = [storyboard instantiateInitialViewController];

*/

/*

// 3.指定xib的狀況(去xib中建立files onwner 的view屬性鏈接的view)

NJOneViewController *one = [[NJOneViewController alloc] initWithNibName:@"Demo" bundle:nil];

*/

 

/*

// 4.有同名xib的狀況 (自動加載同名的xib,建立xib中files onwner 的view屬性鏈接的view)

NJOneViewController *one = [[NJOneViewController alloc] init];

*/

 

 

/*

// 5.有同名xib的狀況,xib名稱是去掉controller的狀況 ((自動加載去掉controller的xib,建立xib中files onwner 的view屬性鏈接的view)

NJOneViewController *one = [[NJOneViewController alloc] init];

*/

 

// 6.若是重寫了控制器的loadview方法,就不會自動去加載xib

//NJOneViewController.xib

NJOneViewController *one = [[NJOneViewController alloc] init];

 

/*

//7.若是重寫了控制器的loadview方法,就不會自動建立storyboard中剪頭指向的view

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];

NJOneViewController *one = [storyboard instantiateInitialViewController];

*/

 

// 8.若是重寫了控制器的loadview方法, 而且在loadview方法中建立了uiview,就會顯示loadview中的uiveiw,不會再去建立其它(xib,storyboard)的veiw

//     NJOneViewController *one = [[NJOneViewController alloc] init];

 

self.window.rootViewController = one;

[self.window makeKeyAndVisible];

return YES;

}

 

 

添加tabBar是controller;添加子控制器

控制器包含view

 

如何驗證控制器是否建立:重寫生命週期方法

子類都用用到某一個,抽取父類

 

該繼承,改一個就行

從新建立調用:viewDidload

 

did

- (void)applicationDidBecomeActive:(UIApplication *)application

獲取焦點,程序可用,能夠點

 

 

tabBar  控制器   封裝導航控制器

導航欄,由棧頂控制器管理

返回上一個控制器決定

hideTabar  設置那個界面的tabarbtn的屬性

跟控制器不能hideTabar

14:30修改?

不顯示,刪掉數據源:爲0;  導航會執行默認的方法

 

model  遮蓋,蓋住原來的控制器

 

toot展現的控制器,雖然說顯示two,root仍是 one

 

弱指針  一建立就是放

 

 

strong   只要我在,你得在,在其餘的地方還可使用

weak   避免我銷燬了,你還不銷燬,形成內存泄露

 

 

 

 

歸檔:

- (IBAction)saveBtnClick:(id)sender {

// 建立對象

NJPerson *p = [[NJPerson alloc] init];

p.name = @"lnj";

p.age = 29;

p.height = 1.75;

 

// 獲取目錄

NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

NSLog(@"docPath = %@\n",docPath);

NSString *filePath = [docPath stringByAppendingPathComponent:@"arc.xxoo"];

NSLog(@"filePath = %@\n",filePath);

 

 

// 保存自定義對象(歸檔)

[NSKeyedArchiver archiveRootObject:p toFile:filePath];

 

}

 

- (IBAction)readBtnClick:(id)sender {

 

// 獲取目錄

NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

NSString *filePath = [docPath stringByAppendingPathComponent:@"arc.xxoo"];

// 解歸檔

NJPerson *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

NSLog(@"%@, %d, %.1f", p.name, p.age, p.height);

}

 

 

私人通信錄:鍵盤文字改變的時候,讓添加姓名的按鈕變爲可用,涉及通知:addtarget  :代理,通知三種辦法;

self.nameField  addTarget:self(添加到當前控制器) action:執行的操做 forControlEvents:<#(UIControlEvents)#>(什麼事件,)

當self.nameField

 

//addTarget:通常用於監聽按鈕的點擊 以及進度條值的改變

//    self.nameField addTarget:self action:@selector() forControlEvents:UIControlEvent

 

// self.nameField.delegate = self;

 

// 經過通知監聽UITextfield的改變

/*

addObserver: 誰來監聽

selector: 通知發生的時候調用什麼方法

name:通知名稱

object:誰發送的通知

注意:object不能寫nil, 由於若是是nil只要是UITextField發生改變都會調用textChange方法, 而咱們指向帳號和密碼輸入框發生改變的時候才調用

*/

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.nameField];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.pwdField];

 

@property(nonatomic,assign) id<UITextFieldDelegate> delegate;

- (void)textFieldDidBeginEditing:(UITextField *)textField;           // became first responder

 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;   // return NO to not change text

{

代理不行

}

 

通知的使用:

1>若是繼承於UIControl :使用addTarget(看下里面是否有)

2>看一下UITextFiled中有沒有方法

3>看下通知:NSUITextField,通知名稱:UITextField

 

//只要經過xib或者stotyBoard建立的cell都會調用這個方法

 

- (void) awakeFromNib

 

// 當控件的frame被修改就會調用

- (void)layoutSubviews

{

 

 

 

0511 qua2d

形上下文(Graphics Context):是一個CGContextRef類型的數據

 

圖形上下文的做用

保存繪圖信息、繪圖狀態

決定繪製的輸出目標(繪製到什麼地方去?)

(輸出目標能夠是PDF文件、Bitmap或者顯示器的窗口上)

相同的一套繪圖序列,指定不一樣的Graphics Context,就可將相同的圖像繪製到不一樣的目標上

Quartz2D提供瞭如下幾種類型的Graphics Context:

Bitmap Graphics Context

PDF Graphics Context

Window Graphics Context

Layer Graphics Context

Printer Graphics Context

 

layer控件能顯示就由於這個

如何利用Quartz2D自定義view?(自定義UI控件(由於有layer))

 

如何利用Quartz2D繪製東西到view上?

1> 首先,得有圖形上下文,由於它能保存繪圖信息,而且決定着繪製到什麼地方去

2>其次,那個圖形上下文必須跟view相關聯,才能將內容繪製到view上面 聯繫點   Layer Graphics Context(創建聯繫bug點)

 

自定義view的步驟

新建一個類,繼承自UIView(bug點)

實現- (void)drawRect:(CGRect)rect方法 只有這個方法得到Layer Graphics Context ,而後在這個方法中

取得跟當前view相關聯的圖形上下文

繪製相應的圖形內容

利用圖形上下文將繪製的全部內容渲染顯示到view上面

 

爲何要實現drawRect:方法才能繪圖到view上?

由於在drawRect:方法中才能取得跟view相關聯的圖形上下文

 

drawRect:方法在何時被調用?

當view第一次顯示到屏幕上時(被加到UIWindow上顯示出來)

調用view的setNeedsDisplay或者setNeedsDisplayInRect:時

 

Quartz2D的API是純C語言的

 

Quartz2D的API來自於Core Graphics框架

 

 

數據類型和函數基本都以CG做爲前綴

CGContextRef

CGPathRef

CGContextStrokePath(ctx);

……

 

 

在drawRect:方法中取得上下文後,就能夠繪製東西到view上

 

View內部有個layer(圖層)屬性,drawRect:方法中取得的是一個Layer Graphics Context,所以,繪製的東西實際上是繪製到view的layer上去了

View之因此能顯示東西,徹底是由於它內部的layer

 

建立類繼承UIView 同時storyBoard中更改類名

 

 

// 1.得到圖形上下文  typedef struct CGContext *CGContextRef;

CGContextRef ctx = UIGraphicsGetCurrentContext()不須要星??

 

2>起點終點

3>上下文輸出;

 

繪圖和顏色的線的類型一致

// set : 同時設置爲實心和空心顏色

// setStroke : 設置空心顏色

// setFill : 設置實心顏色

 

 

圖形填充得邊緣

 

 

 

 

1140?小細節

 

 

 

數碼取色器

 

 

#define MJColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]

 

.0沒有沒顏色

 

 

 

圖形上下文:

獲取圖形上下文

 

 

上下文棧結束的地方

 

quas2dX

加班,複用性不好,模擬;傳感器,物聯網gps定位;

 

ios leader  ui 網絡多線程,基本的(技術);工具類經常使用的東西,cto 主要技術負責人;那個模塊細節的問題;ui改動需求,細節問題,需求

社交,網絡多線程,實際的價值; 前期:ui高級  高級最後的  關於細節的問題,項目,新浪微博,細節的東西,

 

工具類封裝;座位的事;本身組團;//本身

填充在剪切以後調用

自定義UIImageView

 

 

png 瀏覽器;搜圖片

 

 

NSTimer 定時的更新數據;

CADisplayLink 更新動畫的時候調用,一秒調用60次;

 

arc中經過C語言建立的函數,若是函數中保存create,retain,copy  必須調用release;

CGContextRef ctx =CGPathCreateMutable();須要釋放內存

 

 

0512彩票

 

導航控制器copy  viewControllers

1>資源

2>圖標  application

3>去掉玻璃球prerender ,使其扁平化 勾選去掉玻璃花效果(刪去程序,點文件夾再溝),IOS5以前在配置文件中加一個行見0512的彩票視頻

4>lanch 上面下面的黑,改Jasonios7 讓其有四村的圖片;

5>啓動去掉狀態欄  去掉溝,啓動時全屏  general裏面,

6>導航控制器設置根控制器

7點擊的時候隱藏下面的工具條hidden

 

- (void)setHighlighted:(BOOL)highlighted

{

//重寫這個方法讓按鈕normal - highlight(使這個爲瞬態) -disable

// [super setHighlighted:YES];//設置按鈕爲高亮狀態

}

 

系統ios6

 

設置狀態欄顏色0935,如何看??只能經過application,

 

ios 6  適配

狀態欄的設置批量在主題裏面設置;

 

guide -- 經驗-- UTransition??

 

1038看文檔??如何分析??

strory 裏面勾選界面

 

+initia

 

1156如何調bug

sdk 7.1  才能調用ios7 的方法;

編譯器適配:

#ifdef _

 

else

 

shift  等比例縮放

ios6   00 與  ios7 00 1433總結  結構 器之間???

st裏面的上下擴展,修改了相對的0點

在ios7 6  垂直方向都不變

scollView 作穿透  :不是scroolView 的時候,直接都去掉溝

 

UIStoryboard  裏面也能夠拉,strch 只有imageView能夠拉伸

class 懶加載  小寫的class

1>代碼優化:使某些不能夠點擊

2>

 

指向函數:

block  本質是內斂函數,初學能夠理解爲宏定義,在編譯的時候能夠替換宏名

block使用copy

=1113以前的沒聽打電話去了;

建立xib 的時候須要制定重用的標示;'

xib和peng 不須要後綴

拖con了特殊cell   inset

item  =row

maskToBounds

 

 

#import "MJSettingItem.h"

 

@implementation MJSettingItem

 

+(instancetype)itemWithIcon:(NSString *)icon title:(NSString *)title destVc:(Class)destVc

{

 

#warning item仍是self

//建立item,使用self能夠item???

MJSettingItem *item = [[self alloc] init];

item.icon = icon ;

item.title = title ;

item.destVc = destVc;

return item;

 

}

 

NSProxy.h

class

Returns self (the class object).  返回本身,返回類對象

 

+ (Class)class

Return Value  這是類方法  返回類對象

 

@property(nonatomic,assign) Class  destVc;  class 類方法>

 

一個界面對應一個控制器

 

loadView 裝載的時候,直接複製webView 重寫loadView

0920爲何要強轉

控制器包裝成導航控制器

 

 

父類對象指向子類須要強轉

JavaScript  寫對幾條就編譯幾條

1015使用javascript

 

typeof (10)  = int  動態的獲取某個變量的類型

typeof self;

 

 

- (void)viewDidLoad

{

[super viewDidLoad];

 

// 把self變成弱指針

// __unsafe_unretained 修飾的若是對象釋放了, 變量依然指向釋放前的地址

// __unsafe_unretained NJShareViewController *unRetainSelf = self;

//  __weak 修飾的若是對象釋放了, 變量自動指向nil

// __weak NJShareViewController *unRetainSelf = self;

 

__weak typeof(self) unRetainSelf = self;//獲取self的類型

 

//    int a = 5;

//    typeof(100) b  = 5;

 

// Do any additional setup after loading the view.

NJSettingItem *item0 = [NJSettingArrowItem itemWithIcon:nil title:@"新浪微博" destVc:nil];

NJSettingItem *item1 = [NJSettingArrowItem itemWithIcon:nil title:@"短信分享" destVc:nil];

item1.option = ^{

if (![MFMessageComposeViewController canSendText]) return;

MFMessageComposeViewController *vc = [[MFMessageComposeViewController alloc] init];

// 設置短信內容

vc.body = @"吃飯了沒?";

// 設置收件人列表

vc.recipients = @[@"10010", @"123456"];

// 設置代理

vc.messageComposeDelegate = unRetainSelf;

 

// 顯示控制器

[unRetainSelf presentViewController:vc animated:YES completion:nil];

 

sel.age = 10;

// _age = 10;

// self->_age = 10;

 

};

 

0519觸摸

 

當前的控制器有group;

NJSettingGroup *group = [[NJSettingGroup alloc] init];

@property (nonatomic, strong) NSArray *items;

 

group.items = @[item0, item1, item2];(數組strong)

item2.option = ^{        // 設置代理

vc.mailComposeDelegate = self;}(這個中又有self  組成強應用的閉環)

在iOS中不是任何對象都能處理事件,只有繼承了UIResponder的對象才能接收並處理事件。咱們稱之爲「響應者對象」

 

UIApplication、UIViewController、UIView都繼承自UIResponder,所以它們都是響應者對象,都可以接收並處理事件

 

UIResponder內部提供瞭如下方法來處理事件

觸摸事件

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

 

加速計事件

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;

- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;

 

遠程控制事件

- (void)remoteControlReceivedWithEvent:(UIEvent *)event;

 

UIView是UIResponder的子類,能夠覆蓋下列4個方法處理不一樣的觸摸事件

一根或者多根手指開始觸摸view,系統會自動調用view的下面方法

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

 

一根或者多根手指在view上移動,系統會自動調用view的下面方法(隨着手指的移動,會持續調用該方法)

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

 

一根或者多根手指離開view,系統會自動調用view的下面方法

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

 

觸摸結束前,某個系統事件(例如電話呼入)會打斷觸摸過程,系統會自動調用view的下面方法

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

 

提示:touches中存放的都是UITouch對象

觸摸:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

 

touchesBegan->touchesMoved->touchesEnded(必須的過程)

 

當用戶用一根觸摸屏幕時,會建立一個與手指相關聯的UITouch對象

mutiple touch 勾選  支持多點觸摸

一個手指對應一個touch對象

// 當前觸摸點

CGPoint current = [touch locationInView:superView];//self];

// 上一個觸摸點

CGPoint previous = [touch previousLocationInView:self];

 

爲何不精準??

 

一次完整的觸摸過程,會經歷3個狀態:

觸摸開始:- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

觸摸移動:- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

觸摸結束:- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

觸摸取消(可能會經歷):- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

 

4個觸摸事件處理方法中,都有NSSet *touches和UIEvent *event兩個參數

一次完整的觸摸過程當中,只會產生一個事件對象,4個觸摸方法都是同一個event參數

 

若是兩根手指同時觸摸一個view,那麼view只會調用一次touchesBegan:withEvent:方法,touches參數中裝着2個UITouch對象

 

若是這兩根手指一前一後分開觸摸同一個view,那麼view會分別調用2次touchesBegan:withEvent:方法,而且每次調用時的touches參數中只包含一個UITouch對象

 

根據touches中UITouch的個數能夠判斷出是單點觸摸仍是多點觸摸

 

NSString經過代碼建立

- (id)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

if (self) {

[self setup];

}

return self;

}

//經過文件建立

- (id)init(O_O)?WithCoder:(NSCoder *)aDecoder

{

if (self = [super initWithCoder:aDecoder]) {

[self setup];

}

return self;

}

事件傳遞面試cha,子控件沒有實現touchBegin方法,會將事件傳遞給父控件

什麼是響應者鏈條

應用場景

怎麼響應的??

面試常考?????響應者鏈條視頻面試常考

 

UIGestureRecognizer是一個抽象類,定義了全部手勢的基本行爲,使用它的子類才能處理具體的手勢

這個類不能建立對象

 

代理名稱:UI   ,方法去掉UI

美術,圖書故宮,汽車,快用蘋果助手    顯示包內容:那圖片

搜簡歷  看簡歷,企業帳號,看簡歷的帳號

 

 

 

 

 

夏國華:2011ios開發

什麼是響應者鏈條:由響應者組成的鏈條

什麼是響應者:繼承UIrespond的對象

如何響應:本身是否是控制器的view ?(本身問本身的問題,響應者的方法:三個觸摸的方法;可以響應就是實現了touch的三個方法) 不是  傳給父控件,是   傳給控制器

父控件或控制器沒有實現觸摸響應的事件,繼續上傳,直到找不到那麼就丟棄

 

響應者的應用場景:在子控件中讓父控件也響應觸摸事件,在子控件的方法中調用父控件的觸摸方法,而且把子空間傳上去;

 

觸摸事件的傳遞:從父控件傳到子控件,如何找到最合適的控件來處理事件?

本身是否能接收觸摸事件?

觸摸點是否在本身身上?

從後往前遍歷子控件,重複前面的兩個步驟

若是沒有符合條件的子控件,那麼就本身最適合處理

 

 

UISwipeGestureRecognizer *swipGesture1 = [[UISwipeGestureRecognizer  alloc] initWithTarget:self action:@selector(swipView:)];

添加監聽事件:會將swipGesture當作參數傳給swipView 的參數

 

 

autoLayout  去掉纔會出現:自動邊緣四周的畫面

 

 

 

 

//----------代理傳值方法總結------------代理傳值方法總結----------代理傳值方法總結-------------

//這裏的btn點擊了,調用代理執行方法把btn做爲參數,btn.tag

//傳給實現代理的對象在代理對象中拿到這個tag的值進行一些操做

//            NJTabBar.m文件

- (void)btnOnClick:(UIButton *)btn

{

// -1.通知代理

if ([self.delegate respondsToSelector:@selector(tabBar:from:to:)]) {

[self.delegate tabBar:self from:self.currentSelectBtn.tag to:btn.tag];

}

//            NJTabBar.h文件

@class NJTabBar;

@protocol NJTabBarDelegate <NSObject>

- (void)tabBar:(NJTabBar *)tabBar from:(NSInteger)from to:(NSInteger)to;

@end

@interface NJTabBar : UIView

@property (nonatomic, weak) id<NJTabBarDelegate> delegate;

@end

 

#import "NJTab BarController.h"

NJTabBarController.m 文件  遵照代理代理:

@interface NJTabBarController ()<NJTabBarDelegate>

 

#pragma mark - NJTabBarDelegate //實現這個代理方法

- (void)tabBar:(NJTabBar *)tabBar from:(NSInteger)from to:(NSInteger)to

{

// 切換子控制器

self.selectedIndex = to;

}

 

//-------代理傳值方法總結--------代理傳值方法總結-------------代理傳值方法總結-----------------

 

 

子類繼承父類先調用子類的方法再調用父類的方法(若是子類中有函數調用super的方法會去父類中調用父類的方法)

 

UIView先繪製在圖層上,系統將圖層顯示在屏幕上

 

layer.contents =(id) [UIImage  imageNamed:@"12"].CGImage;

 

 

UIView和CALayer的選擇

經過CALayer,就能作出跟UIImageView同樣的界面效果

 

既然CALayer和UIView都能實現相同的顯示效果,那究竟該選擇誰好呢?

其實,對比CALayer,UIView多了一個事件處理的功能。也就是說,CALayer不能處理用戶的觸摸事件,而UIView能夠

因此,若是顯示出來的東西須要跟用戶進行交互的話,用UIView;若是不須要跟用戶進行交互,用UIView或者CALayer均可以

固然,CALayer的性能會高一些,由於它少了事件處理的功能,更加輕量級

 

每個UIView內部都默認關聯着一個CALayer,咱們可用稱這個Layer爲Root Layer(根層)

 

 

 

全部的非Root Layer,也就是手動建立的CALayer對象,都存在着隱式動畫

 

什麼是隱式動畫?

當對非Root Layer的部分屬性進行修改時,默認會自動產生一些動畫效果

而這些屬性稱爲Animatable Properties(可動畫屬性)

 

列舉幾個常見的Animatable Properties:

bounds:用於設置CALayer的寬度和高度。修改這個屬性會產生縮放動畫

backgroundColor:用於設置CALayer的背景色。修改這個屬性會產生背景色的漸變更畫

position:用於設置CALayer的位置。修改這個屬性會產平生移動畫

 

 

返回按鈕由上一個控制器決定;在上一個控制器setback,

CAPropertyAnimation的子類

屬性解析:

fromValue:keyPath相應屬性的初始值

toValue:keyPath相應屬性的結束值

隨着動畫的進行,在長度爲duration的持續時間內,keyPath相應屬性的值從fromValue漸漸地變爲toValue

若是fillMode=kCAFillModeForwards和removedOnComletion=NO,那麼在動畫執行完畢後,圖層會保持顯示動畫執行後的狀態。但在實質上,圖層的屬性值仍是動畫執行前的初始值,並無真正被改變。好比,CALayer的position初始值爲(0,0),CABasicAnimation的fromValue爲(10,10),toValue爲(100,100),雖然動畫執行完畢後圖層保持在(100,100)這個位置,實質上圖層的position仍是爲(0,0)

 

//           UIView  與圖層的關係?

當UIView須要顯示到屏幕上時,會調用drawRect:方法進行繪圖,而且會將全部內容繪製在本身的圖層上,繪圖完畢後,系統會將圖層拷貝到屏幕上,因而就完成了UIView的顯示

換句話說,UIView自己不具有顯示的功能,是它內部的層纔有顯示功能

 

每個UIView內部都默認關聯着一個CALayer,咱們可用稱這個Layer爲Root Layer(根層)

//view.layer.delegate == view;

    

    

//----------------view的完整顯示過程-----------------------------

 1. view.layer會準備一個Layer Graphics Contex(圖層類型的上下文)

 2. 調用view.layer.delegate(view)的drawLayer:inContext:,並傳入剛纔準備好的上下文

 3. view的drawLayer:inContext:方法內部又會調用view的drawRect:方法

 4. view就能夠在drawRect:方法中實現繪圖代碼, 全部東西最終都繪製到view.layer上面

 5. 系統再將view.layer的內容拷貝到屏幕, 因而完成了view的顯示

//----------------view的完整顯示過程-----------------------------

 

    coreQuatz  庫不能重複添加,重複添加彙報連接錯誤,解決方法:重建工程:從新添加文件代碼和UIStoryboardSegue

daima

 

 

 

 

    // 1.建立動畫對象

    CABasicAnimation *anim = [CABasicAnimation animation];

    // 2.設置動畫對象

    // keyPath決定了執行怎樣的動畫, 調整哪一個屬性來執行動畫

    

    anim.keyPath = @"bounds";

    //    anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 0)];

    anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];

    anim.duration = 2.0;

    

    /**讓圖層保持動畫執行完畢後的狀態**/

    // 動畫執行完畢後不要刪除動畫

    anim.removedOnCompletion = NO;

    // 保持最新的狀態

    anim.fillMode = kCAFillModeForwards;

    

    // 3.添加動畫

    [self.layer addAnimation:anim forKey:nil];

 

block 封裝函數的變化點

    

 

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);

使用給定的block 執行數組中的對象,從第一個對象執行到最後一個對象,block是應用到每個對象的代碼

    

    int stopIndex = 1;

    NSArray *array = @[@"張三", @"李四", @"王五", @"趙六"];

    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        NSLog(@"第 %d 項內容是 %@", (int)idx, obj);

        if ([@"王五" isEqualToString:obj] || idx == stopIndex) {

            *stop = YES;

        }

    }];

    注意,

 

    for (int i = 0; i < 10; ++i) {

        NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{

            [self operationAction:@(i)];

        }];

        

        [self.myQueue addOperation:op];

    }

 

 

 

 

//----------------block強引用---------------------------------------------------

@property (nonatomic, strong) NSMutableArray *myBlocks;

 

#pragma mark 將代碼改成調用self的方法

int(^sum)(int, int) = ^(int x, int y) {

return [self sum:x y:y];

};

[self.myBlocks addObject:sum];

#pragma mark 對象被釋放時自動調用

- (void)dealloc

{

NSLog(@"DemoObj被釋放");

}

循環引用的結果就是對象沒法被釋放!

 

上述代碼:self 強應用myBlaocks  ,myBlocks 強引用sum   sum強引用self 構成強引用的循環三角形(沒法釋放)

 

局部變量默認都是強引用的,離開其所在的做用域以後就會被釋放

 

使用__weak關鍵字,能夠將局部變量聲明爲弱引用

__weak DemoObj *weakSelf = self;

在Block中引用weakSelf,則Block不會再對self作強引用

int(^sum)(int, int) = ^(int x, int y) {

return [weakSelf sum:x y:y];

};

//----------------block強引用---加上最後一句-<2>解決問題-----------------------------------------------

#warning 註釋---******* 3> option被item2強引用  ??????

    item2.option = ^{

        //  判斷當前設備可否發送郵件 ,不能發郵件

        if (![MFMailComposeViewController canSendMail]) return;

        

        MFMailComposeViewController *vc = [[MFMailComposeViewController alloc] init];

        

        // 設置郵件主題

        [vc setSubject:@"會議"];

        // 設置郵件內容

        [vc setMessageBody:@"今天下午開會吧" isHTML:NO];

        // 設置收件人列表

        [vc setToRecipients:@[@"643055866@qq.com"]];

        // 設置抄送人列表

        [vc setCcRecipients:@[@"1234@qq.com"]];

        // 設置密送人列表

        [vc setBccRecipients:@[@"56789@qq.com"]];

        

        // 添加附件(一張圖片)

        UIImage *image = [UIImage imageNamed:@"lufy.jpeg"];

        NSData *data = UIImageJPEGRepresentation(image, 0.5);

        [vc addAttachmentData:data mimeType:@"image/jepg" fileName:@"lufy.jpeg"];

#warning 註釋--- 4> option中的block強引用着當前類(造成強應用閉環)

        // 設置代理

        vc.mailComposeDelegate = self;

        // 顯示控制器

        [self presentViewController:vc animated:YES completion:nil];

        

    };

#warning 註釋---*******1> group(被本類強引用,裏面的成員)

    NJSettingGroup *group = [[NJSettingGroup alloc] init];

    group.items = @[item0, item1, item2];

    [self.data addObject:group];

#warning 註釋---*******2> items(被group強引)

    

    // 把self變成弱指針

    // __unsafe_unretained 修飾的若是對象釋放了, 變量依然指向釋放前的地址

    // __unsafe_unretained NJShareViewController *unRetainSelf = self;

    //  __weak 修飾的若是對象釋放了, 變量自動指向nil

    // __weak NJShareViewController *unRetainSelf = self;

    

   <2> __weak typeof(self) unRetainSelf = self;

    

    __block  能夠修改block的值  少用:破壞可讀性,偶爾性過高,不容許修改快代碼中的指針,能夠修改快代碼中指針的內容,

    對象有兩個地址:指向對象的地址(兩個),對象本省的地址(一個,不能夠修改),地址中存放內容(能夠修改),

    __weak  NJcontroller *weakself  = self;

    

}

//----------------block強引用---------------------------------------------------

 

    對象添加到數組會被數組強引用;[self  sum:x ,y]  self 會對sum強引用   ????強引用??

    self 中有property (nonatomic, strong) NSMutableArray *myBlocks;

    self  會強應用myBlocks

    

    sum 會強引用self

    int(^sum)(int, int) = ^(int x, int y) {

        return [self sum:x y:y];

    };

 

    [self.myBlocks addObject:sum];

 

    myblock會強引用sum  致使的循環引用

    

    

    代碼網站:githup   和codeforapp  兩個網站  上面有不少內容

    

//----------------block循環引用---------------------------------------------------

    for (int i = 0; i < 10; ++i) {

        

        [self.queue addOperationWithBlock:^{

            self  ->queue ->block  在主線程的運行循環中,隊列的代碼塊執行完畢會銷燬

            [self demoOp:@(i)];

        }];

    }

//----------------block循環引用---------------------------------------------------

 

 

快代碼  準備的函數,隨時被調用,預先準備好的,

    快代碼實現控制器中的傳值,

    1>快代碼預先準備的代碼塊,在須要的時候執行

    2>準備一個快代碼,傳遞給detail

    3>快代碼自行時間有detail(定義快代碼) 決定

    

快代碼比較靈活,若是監聽的事件比較多,仍是使用代理比較好

    

  堆中存放對象,棧中存放地址

    

 

    ?const 的做用

    CGPathCreateMutableCopyByTransformingPath(<#CGPathRef path#>, <#const CGAffineTransform *transform#>)

    dispatch_queue_t q = dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>)

    const 鎖定指向lable的指針,

    UIKIT_EXTERN NSString *const NSTabColumnTerminatorsAttributeName

    鎖定的是NSTabColumnTerminatorsAttributeName這內容;

    //const  指針能夠修改,指針所指向

 

    

    

    //----------------串行隊列-----------------------------

    串行隊列前面的沒有執行完後面的隊列沒法執行

    並行隊列,先同步後異步  順序執行:

    並行隊列:先異步後同步,混合執行,同步異步混合;先同步後異步,會對後面的阻塞;

    同步操做在主線程上,異步會新建線程,在並行隊列中:異步會新建多個線程,在串行隊列中異步只會新建一個線程

    全局隊列:同步操做順序進行,在主線程上,會阻塞後面的,異步操做無序,會新建線程,無序進行

    //----------------建立全局對列-----------------------------

    dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    //執行同步操做,在主線程上

    //執行異步操做,在子線程上仍是會有順序

    //---------------------------------------------

    

    //-------------------主(線程)隊列--------------------------

    

#pragma mark - 主(線程)隊列,保證操做在主線程上執行

    

    // 每個應用程序都只有一個主線程

    // 爲何須要在主線程上工做呢?

    // 在iOS開發中,全部UI的更新工做,都必須在主線程上執行!

    dispatch_queue_t q = dispatch_get_main_queue();

    

    // 主線程是由工做的,並且除非將程序殺掉,不然主線程的工做永遠不會結束!

    // 阻塞了!!!

    //    dispatch_sync(q, ^{

    //        NSLog(@"come here baby!");

    //    });

    

    // 異步任務,在主線程上運行,同時是保持隊形的

    同步任務:不會新建線程,運行在主線程上只能在(隊列在哪裏,任務就在哪裏)主線程上,

    異步任務:會新建線程;同步任務能夠堵住異步任務

    

    同步任務會堵死程序

    主線程的任務不會結束(除非退出程序),

    全局隊列不能跟蹤:本身建立的隊列能夠跟蹤

    全局隊列能夠指定優先級,本身建立的隊列不能建立優先級

    

    主隊列添加任務在主隊列工做,本身建立的nsopration  自動的並行異步

    

An NSThread object controls a thread of execution. Use this class when you want to have an Objective-C method run in its own thread of execution. Threads are especially useful when you need to perform a lengthy task, but don’t want it to block the execution of the rest of the application. In particular, you can use threads to avoid blocking the main thread of the application, which handles user interface and event-related actions. Threads can also be used to divide a large job into several smaller jobs, which can lead to performance increases on multi-core computers.

一個線程對象控制一個線程的執行,當你想要一個oc 的方法運行在執行的線程上,就使用這個類,當你須要執行一個長時間的任務,線程是很是有用的,可是不要去阻塞其餘應用程序的執行,特殊是:你可使用線程避免阻塞主線程

主線程來更新界面相關的動做事件,線程能夠劃分一個大的任務爲幾個小的任務,在多核的設備中,這樣能夠提升性能

 

    1>NSObject  多線程方法沒有自動釋放池

    2>在oc,當自動釋放池被釋放或銷燬的時候,會向自動釋放池中得全部對象發送release消息

    

    //可是使用nsthread 的時候系統

    同步任務在多線程中少用,(少用)

    

    串行 異步:

    並行  異步:

    

    NSAutoreleasePool

    {

        for (int i = 0; i < 10; ++i) {

//            NSAutoreleasePool也能夠在這裏加自動釋放池,這樣的每次執行完畢對象會釋放{

            NSString *str = @"Hello World";

            str = [str stringByAppendingFormat:@" - %d", i];

            str = [str uppercaseString];

            NSLog(@"%@", str);

//        }

        }

    }      問:以上代碼存在什麼樣的問題?若是循環的次數很是大時,應該如何修改?

 

    

    

#pragma mark - 串行(一個接一個,排隊跑步,保持隊形)隊列

    - (void)gcdDemo1

    {

        // 將操做放在隊列中

        // 在C語言函數中,定義類型,絕大多數的結尾是_t或者ref

        // 使用串行隊列,的異步任務很是很是很是有用!新建子線程是有開銷的,不能無休止新建線程

        // 便可以保證效率(新建一個子線程),用可以實現併發

        // 應用案例:

        // 1> 從網絡上上下載圖片

        // 2> 濾鏡(高光,紅眼...)

        

        dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", DISPATCH_QUEUE_SERIAL);

        

        // 非ARC開發時,千萬別忘記release

        //    dispatch_release(q);

        

        // 串行行隊列的同步任務,一樣會在主線程上運行

        // 提示:在開發中極少用

        // 面試中有可能會問!

        for (int i = 0; i < 10; ++i) {

            // 同步任務順序執行

            dispatch_sync(q, ^{

                NSLog(@"%@ %d", [NSThread currentThread], i);

            });

        }

        

        for (int i = 0; i < 10; ++i) {

            // 異步任務,併發執行,可是若是在穿行隊列中,仍然會依次順序執行

            dispatch_async(q, ^{

                // [NSThread currentThread] 能夠在開發中,跟蹤當前線程

                // num = 1,表示主線程

                // num = 2,表示第2個子線程。。。

                NSLog(@"%@ %d", [NSThread currentThread], i);

                

            });

        }

    }

    

    NSThread 對象的做用:

    一個線程對象控制一個線程的執行,當你想要一個oc 的方法運行在執行的線程上,就使用這個類,當你須要執行一個長時間的任務,線程是很是有用的,可是不要去阻塞其餘應用程序的執行,特殊是:你可使用線程避免阻塞主線程

    主線程來更新界面相關的動做事件,線程能夠劃分一個大的任務爲幾個小的任務,這樣能夠提升性能

    

    互斥鎖:每一次只容許一個任務執行操做

    

    

    //

    //  DemoObj.m

    //  05.單例

    //

    //  Created by apple on 14-4-23.

    //  Copyright (c) 2014年 itcast. All rights reserved.

    //

    

    #import "DemoObj.h"

    

    @implementation DemoObj

    

    static DemoObj *instance;

    //---------------------單例的寫法,面試常考------------------------

    /**

     1. 重寫allocWithZone,用dispatch_once實例化一個靜態變量

     2. 寫一個+sharedXXX方便其餘類調用

     */

    

    // 在iOS中,全部對象的內存空間的分配,最終都會調用allocWithZone方法

    // 若是要作單例,須要重寫此方法

    // GCD提供了一個方法,專門用來建立單例的

    + (id)allocWithZone:(struct _NSZone *)zone

    {

        static DemoObj *instance;

        

        // dispatch_once是線程安全的,onceToken默認爲0

        static dispatch_once_t onceToken;

        // dispatch_once宏能夠保證塊代碼中 i的指令只被執行一次

        dispatch_once(&onceToken, ^{

            // 在多線程環境下,永遠只會被執行一次,instance只會被實例化一次

            instance = [super allocWithZone:zone];

        });

        

        return instance;

    }

    

    + (instancetype)sharedDemoObj

    {

        // 若是有兩個線程同時實例化,頗有可能建立出兩個實例來

        //    if (!instance) {

        //        // thread 1 0x0000A

        //        // thread 2 0x0000B

        //        instance = [[self alloc] init];

        //    }

        //    // 第一個線程返回的指針已經被修改!

        //    return instance;

        return [[self alloc] init];

    }

    

    @end

    //  DemoObj.m

    //  0526_單利

    //

    //  Created by 汪剛 on 07-9-19.

    //  Copyright (c) 2007年 it.cast. All rights reserved.

    //

    

#import "DemoObj.h"

    

    @implementation DemoObj

    static DemoObj *instance

    //

    +(id)allocWithZone:(struct _NSZone *)zone

    {

        static DemoObj*instance;

        //這個

        static dispatch_once_t onceToken;

        dispatch_once(&onceToken, ^{

            //這個中得代碼只執行一次

            instance = [super allocWithZone:zone];

        });

        return instance;

    }

    

    +(instancetype)shareDemoObj

    {

        return [[self alloc] init];

    }

 

    //----------------------單例的寫法,面試常考-----------------------

   

oc函數中參數凡是看到**  傳入對象的地址

    + (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:/*傳地址*/(NSURLResponse **)response error:(NSError **)error

 

1M主線程,每一個線程對應一個棧區,子線程對應512K的棧區

    

    堆區,有系統管理和維護   包含全部應用程序共享的(包含內存,虛擬內存(磁盤內存))

    

    對象在堆中,內存沒有釋放(沒法訪問)那麼對象就是內存泄露

    堆系統管理全部對象的,

    NSData  二進制

    NULL = 0;

    nil 地址指向0 的對象;調用任何方法不會報錯; =空

    

//--------------------- performSelectorOnMainThread------------------------

-(void)setImagePath:(NSString *)imagePath

{

NSLog(@"%@ = \n",[NSThread currentThread]);

//1>模擬下載延時

[NSThread  sleepForTimeInterval:5.0];

//A Boolean that specifies whether [the current thread blocks until after the specified selector is performed on the receiver on the main thread].

//2>設置頭像,蘋果容許inbackground方法在後臺更新ui線程,強烈建議不要這麼作

//yes直到方法調用爲yes

[self   performSelectorOnMainThread:@selector(setImage:) withObject:[UIImage imageNamed:imagePath] waitUntilDone:NO];//調用的方法num =1;

 

}

 

//1>設置頭像

-(void)setImage:(UIImage *)image

{

NSLog(@"%@ = setImage\n",[NSThread currentThread]);

 

//image = [UIImage imageNamed:@"頭像1.png"];

self.imageView.image = image;

//根據頭像自動調整大小

[self.imageView sizeToFit];

}

 

- (void)viewDidLoad

{

[super viewDidLoad];

[self.view addSubview:self.imageView];

//在後臺執行這個程序

for (int i = 0; i<50; i++) {

[self performSelectorInBackground:@selector(setImagePath:) withObject:@"頭像1.png"];

}

//調用的方法Num= 1-50;

}

//--------------------- performSelectorOnMainThread------------------------

    

    

    apach演示:拖兩個文件到本地服務器  打開

    再輸密碼

    

    界面(uitextFiled)+ UILabel

    

    2>拖線

    3>

    

NSMutableArray *arrM

    

init

    

    

    整數  NSNumber  整數對象

    

    網絡數據包裝

    assign  NSInteger

    @(12)

    輸出爲NSNumber 類型  %@   @(12)

    

    strong   NSNumber* userNum  %@

    

    

  在處理網絡數據的時候,數值的屬性 能夠省略不少麻煩

    

    異步操做不會阻塞線程

    

    打印description  便於調試

    

 

 跟蹤數組,打印數組

    自動備份;勾上;必定要掌握:switch  備份

    

    

   // copy  創建副本    爲了修改屬性互不影響

    

#define   kBaseUrl @"http://192.168.1.1"

    有中文的時候:url = [url string +中文轉義];

    

    asi 建議須要的時候本身去自學,http 訪問終結者

    非Arc

    1>第三方框架:不須要去看全部的源程序

    2>不須要熟悉全部的功能以後再使用

    

    刷新表格會從新調用數據源的方法

    

    modal  是臨時的視圖控制器

    橫豎頻還須要修改plist 裏面的播放的順序

    

    

    以shared standart  default  開頭表明是單例

    

    @interface Video : NSObject

    // copy  創建副本    爲了修改屬性互不影響

    @property (nonatomic, copy) NSNumber *videoId;

    @property (nonatomic, copy) NSString *name;

    @property (nonatomic, copy) NSNumber *length;

    @property (nonatomic, copy) NSString *videoURL;

    @property (nonatomic, copy) NSString *imageURL;

    @property (nonatomic, copy) NSString *desc;

    @property (nonatomic, copy) NSString *teacher;

    

    - (instancetype)initWithDict:(NSDictionary *)dict;

    + (instancetype)videoWithDict:(NSDictionary *)dict;

 

    // 在處理網絡數據解析的時候,數值型的屬性,必定用NSNubmer,會避免不少麻煩

    @property (nonatomic, strong) NSNumber *userId;

 

    小技巧:若是在OC中看到枚舉類型的起始數值不爲0,說明若是傳入0做爲參數,意味着不會作任何附加操做

    結果就是方法運行的效率最高

    

    一般開發時,拿到數據字典,會字典轉模型,所以不須要對反序列化的結果進行處理

 

    /*

     

     (下面的ok)

     void(^me)(UIImage *image) = ^(UIImage *image) {

           self.imageView.image = image;

     };

     

   (類型的時候省略block的名稱)  void(^me)(UIImage *image) = ^(UIImage *image) {

     self.imageView.image = image;

     };

     

     

     

     completion(參數)調用

     

     ==

     

     ^(UIImage *image) {

     

     self.imageView.image = image;

     } 

     

     ==

     

     void (^)(UIImage *image)

     

     */

 

涉及用戶隱私的  都不須要用get 方法

    不能把密碼保存在本地:

    不能直接傳輸用戶的密碼:

    

    request  請求用可變的nsmuatblequequest  post  須要更改請求?

    和用戶隱私相關的用post   沒有隱私的時候用get   能夠用瀏覽器輔助yong

    post 的文件不能覆蓋

    post  會有大小的限制

    

     全部的網絡都是異步的

    request.HTTPMethod = @"PUT";只要不是get方法  必須是可變的

 

    

    php  輸入張三  zhang 的密碼後,返回null null 是由於加密後,在php文件中須要更改  加密後的密碼

    後面:添加psot 文件夾,系統也是這麼設置的

    

    

    

    //---------------------------------------------

    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task

didSendBodyData:(int64_t)bytesSent

totalBytesSent:(int64_t)totalBytesSent

totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend

    {

        float progress = (float)totalBytesSent/totalBytesExpectedToSend;

        double delayInSeconds = 1/30;

#warning 註釋---???此處若是沒有延時,不會重繪??  刷新頻率過高???

        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));

        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

            self.progressView.progress = progress;

            

        });

        NSLog(@"progress- = %.2f\n",progress);

        //    NJProgressView *progress1 = [[NJProgressView alloc] init];

    }

    

    - (UILabel *)label

    {

        if (!_label) {

            _label = [[UILabel alloc] initWithFrame:self.bounds];

            _label.textAlignment = NSTextAlignmentCenter;

            _label.font = [UIFont systemFontOfSize:14.0];

            _label.textColor = [UIColor redColor];

            

            [self addSubview:_label];

        }

        return _label;

    }

    

    - (void)setProgress:(float)progress

    {

        _progress = progress;

        

        int value = progress * 100;

        self.label.text = [NSString stringWithFormat:@"%d%%", value];

        NSLog(@"%@", [NSThread currentThread]);

        

        // 繪製圓弧, 調用drawRect

        [self setNeedsDisplay];

    }

    

    - (void)drawRect:(CGRect)rect

    {

        // 1. context

        CGContextRef context = UIGraphicsGetCurrentContext();

        

        // 2. 給context添加路徑,圓弧

        CGFloat x = self.bounds.size.width / 2.0;

        CGFloat y = self.bounds.size.height / 2.0;

        CGFloat r = MIN(x, y) - 5;

        CGFloat startA = -M_PI_2;

        CGFloat endA = startA + self.progress * 2 * M_PI;

        

        // 順時針繪製,須要設置成false

        CGContextAddArc(context, x, y, r, startA, endA, false);

        

        // 3. 設置顏色,線寬

        CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0);

        CGContextSetLineWidth(context, 3.0);

        

        // 4. 繪製

        CGContextDrawPath(context, kCGPathStroke);

    }

 

    

    //---------------------------------------------

 

 

    /** 下載是 get 方法 */

    - (IBAction)download

    {

        // 1. url

        NSURL *url = [NSURL URLWithString:@"http://localhost/123.zip"];

        

        // 2. request

        NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:10.0f];

        

        // 3. sesssion

        NSURLSession *session = [NSURLSession sharedSession];

        

        // 4. 下載任務

        [[session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {

            

            // 用urlsession下載的文件,會保存到臨時文件夾中

            // 若是不進行特殊的處理,就會被刪除掉

            NSLog(@"%@", location.path);

            

            // 解壓縮

            // 小說,下載的是zip文件,解壓縮zip文件,zip不須要

            // 目標文件夾

            // Documents 只能保存應用程序自己由用戶生成的文件,不能把網絡下載的文件放在此文件夾中

            // Cache:從新啓動不會丟失

            // Tmp:從新啓動會清空

            // 偏好設置:會備份

            NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];

            [SSZipArchive unzipFileAtPath:location.path toDestination:cacheDir];

        }] resume];

    }

    

    /**

     completionHandler  結束後的操做

     */

    

    文件下載從服務器下載到手機,;;能夠指定下載的路徑

    

    備課筆記

    

    1.  POST提交數據 application/x-www-form-urlencoded

    ================================================================================

    application/x-www-form-urlencoded在HTTP網絡訪問中一般用於向服務器提交用戶隱私相關的信息

    

    緣由以下:

    1>  使用GET方法全部參數都包含在URL中,這樣用戶信息會暴露在URL中,若是黑客獲取到服務器訪問日誌文件。

    則意味着會出現用戶數據泄露的問題

    2>  服務器的訪問日誌是黑客攻擊的重點對象之一

    

    在iOS開發中,使用application/x-www-form-urlencoded提交POST請求時,程序員只須要負責包裝數據體便可

    其餘諸如:

    1>  Content-Type

    2>  Content-Length

    3>  數據體字符串中的百分號轉義

    ...

    系統會默認處理,無需程序員作任何操做

    

    實例代碼以下:

    // 1. 設置請求的HTTP方法

    request.HTTPMethod = @"POST";

    // 2. 拼接數據體字符串

    NSString *bodyStr = [NSString stringWithFormat:@"username=%@&password=%@", self.userNameText.text, pwd];

    // 3. 使用NSData設置HTTPBody

    request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];

    

    2.  數據安全

    ================================================================================

    在網絡傳輸中,若是涉及用戶隱私的數據,請記住如下兩點:

    

    1>  任何應用程序都不能"在本地直接存儲與安全相關的用戶信息"

    2>  任何應用程序在於服務器傳遞數據時,都"不能直接傳輸與安全相關的用戶信息"

    

    一般使用MD5對用戶的密碼進行加密,MD5函數具備如下特色:

    

    1>  算法不可逆,即便用散列後的MD5字符串,在知道MD5算法的前提下,仍然沒法反算會初始值

    2>  長度固定,使用MD5函數處理後的字符串長度統一爲32位

    3>  對於相同字符串使用MD5函數,每次的計算結果是相同的

    

    因爲目前網絡上有160TB的數據庫,記錄已經破解的,MD5加密字符串

    爲了保證用戶數據的安全,在使用MD5對用戶密碼進行處理時,能夠爲密碼加點"鹽"

    

    NSString *saltStr = [NSString stringWithFormat:@"%@%@", pwd, kSaltStr];

    return [saltStr md5String];

    

    3.  POST上傳 multipart/form-data

    ================================================================================

    multipart/form-data是目前很是流行的向網絡服務器上傳文件的一種方式,具備如下幾個特色:

    

    1>  國內的絕大多數網站都採用這種方式上傳文件,網絡上要上傳用戶頭像,一般都使用此種方式

    2>  會限制上傳文件的大小通常是2M或者更小

    3>  POST上傳的文件在服務器上不能重名,若是指定的文件名重複,則沒法上傳

    

    要在iOS中實現文件上傳,須要拼接一個NSData,具體個數以下:

    

# 頭部字符串

    --'本次上傳標示字符串' \n

    Content-Disposition: form-data; name="服務端字段"; filename="上傳文件名" \n

    Content-Type: '上傳文件MIMEType' \n\n

    

# 上傳文件的二進制數據

    

# 底部字符串

    --本次上傳標示字符串 \n

    Content-Disposition: form-data; name="submit" \n\n

    

    Submit \n

    --'本次上傳標示字符串'-- \n

    

    除此以外,還需設置網絡請求的'Content-Type'和'Content-Length'

    // Content-Type

    NSString *typeStr = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", randomIDStr];

    [requestM setValue:typeStr forHTTPHeaderField:@"Content-Type"];

    // Content-Length

    NSString *lengthStr = [NSString stringWithFormat:@"%ld", (long)[dataM length]];

    [requestM setValue:lengthStr forHTTPHeaderField:@"Content-Length"];

    

    網絡請求準備就緒以後,直接使用NSURLConnection的異步方法便可上傳文件。

    

    4.  POST上傳 文件名

    ================================================================================

    爲了解決POST上傳文件名不能重複的問題,一般採用時間戳做爲上傳文件的文件名,示例代碼以下:

    

    // 日期的格式化類

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

    // 設置日期格式[年月日時分秒]

    formatter.dateFormat = @"yyyyMMddHHmmss";

    // 使用當前系統時間做爲文件名

    NSString *fileName = [formatter stringFromDate:[NSDate date]];

    

    5.  NSURLSession

    ================================================================================

    1>  NSURLSession是iOS7中新的網絡接口,與NSURLConnection是並列的

    2>  NSURLSession是線程安全的思路

    3>  NSURLSession提供了後臺上傳下載的支持

    

    使用NSURLSession的步驟

    

    1>  實例化NSURLSession對象,若是不使用代理,可使用系統提供全局網絡回話單例

    [NSURLSession sharedSession]

    

    2>  由session發起任務

    (1) 數據任務    NSURLSessionDataTask

    (2) 上傳任務    NSURLSessionUploadTask

    (3) 下載任務    NSURLSessionDownloadTask

    

    3>  注意:全部任務默認都是掛起的,須要調用resume方法,啓動任務

    

    //---------------------------------------------

    put 上傳通常傳到,weddav 服務器中,能夠傳的數據比較大

    文件下載:從指定的服務器中下載數據  默認會存在 tmp 文件夾下面,(這個文件夾中的)

    //---------------------------------------------

 

    responseSerializer  序列化

    

    子類中的找不到所須要功能,類型的時候,到父類中得去找有沒有須要的功能;

    先去頭文件中框架  看看簡介

    

    xml解析器 設置代理  六個方法解析 xml

    

  monitor  [  visible

 

 

青花瓷  在  工做中抓數據青花瓷安裝

    UIScrollView 的bounds  和其contentoffset 是同樣的

#warning 註釋---微博:筆記

 

1>服務器

    2>項目組:

    1>開發組(iOS Android)

    2>服務器開發組

    3>產品需求組

    4>測試組

    5>美工組

    

    去大公司,積累規範

        1>

    項目文檔

            1>需求文檔-產品經理,怎麼寫

            2>接口文檔-服務器

            3>開發文檔 - 開發進度

            4>產品文檔-  相似商品計劃書

            5>原型圖 - 相似需求文檔 (index.html   首頁)

            

    項目架構:

            1>UI界面層

            2>業務層

            3>網絡處理層

            4>工具層

            5>網絡處理層

    分配任務

            1>功能和模塊分

            2>項目的架構(各個UI,網絡,不一樣的人)

            3>混合分

    新浪開放了部分數據,開放了部分數據接口

    1>下載安裝包  獲取裏面的資源

            

   

    launchimage 裏面全部的設備都要有圖標,修改json  參見新浪微博的圖標json

            1>project  Hide during  application launch(加載的時候隱藏狀態欄,不要時加載完)

            2>完成加載顯示

            玻璃效果,右邊的

            刪storyBord  ,更改main?? 建立窗口

            重寫控制器在initNib的方法,init會調用這個 %100會調用initWithNib的方法

            隨機色

            適配兩張圖片   6,7 分別

            重構 代碼:相同的提取 不一樣的

            

            

     默認渲染藍色,因此設置渲染模式,參見0606-6,

            

           7.6適配

            適配 判斷很複雜(每一個)

            在初花化中判斷:(高級一點)

            image分類:分類的方法會覆蓋系統的方法,當同名的時候

            pch  中導入全部的文件

            

            對系統的項目包裝;

            刪插件;改插件   改plist

            

            友盟   GitHub   codeForApp

            git 寫-

            uiview 加分類;擴充功能

            分類中加方法;

            分類中加屬性,只會生成get  set 聲明,不會生成 方法

            

 懶加載的好處1>代碼獨立   2>爲空就建立   3>提升性能

            只須要建立一次的時候,用懶加載

            

            要想爲何這麼寫???多思考

            

#warning 註釋---此處刪掉storyBoard  就須要建立windown 而且顯示,讓程序

 

    

            0924:導航欄一行至關於兩行:child.title  設置上面和下面

    

            手動切換比較快

            

            系統很差用得時候 ,自定義TabBar  SearchBar

#warning 註釋---技巧

            子類中沒有的屬性去父類中找

            

            init 默認的寬高 00

            initwithImage  寬高是圖片的寬高

 

#warning 註釋---此處裏面不能設置frame

            - (id)initWithFrame:(CGRect)frame

在layoutSubview 裏面設置frame

        當圖片在右 文字在左的時候須要自定義button

 

            讓一個View  填充整個圖片  思路:重寫drawRect  自定義Viw

 

            彈出view 14:12 ????爲何加載window上面

        私有api  不能使用  能夠用父類

            

            手勢識別器  若是爲空,

            

 橋接是  corefoundation  和foundatio之間的轉換

            3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  

   self.plusButton.bounds = (CGRect){CGPointZero, plusButtonSize};

    上面這種寫法,返回值必須強轉CGRect

      類方法中只能調用類方法

         [navBar setBackgroundImage:[UIImage imageWithName:@"navigationbar_background"] forBarMetrics:UIBarMetricsDefault];

//            默認用一條線平鋪

            imageWithName:@"searchbar_textfield_search_icon"];

    // 經過initWithImage:建立的UIImageView, UIImageView的尺寸就是圖片的尺寸

  能夠自定義按鈕的尺寸和 文字和圖片的大小

    - (CGRect)imageRectForContentRect:(CGRect)contentRect

    {

        CGFloat imageY = 0;

        CGFloat imageW = IWTitleButtonImageW;

        CGFloat imageX = self.width - imageW;

        CGFloat imageH = self.height;

        return CGRectMake(imageX, imageY, imageW, imageH);

    }

    

    - (CGRect)titleRectForContentRect:(CGRect)contentRect

    {

        CGFloat titleY = 0;

        CGFloat titleX = 0;

        CGFloat titleW = self.width - IWTitleButtonImageW;

        CGFloat titleH = self.height;

        return CGRectMake(titleX, titleY, titleW, titleH);

    }

 

    

            微博思路:

            1> 設置窗口的根控制器

            2>   1.建立一個新的tabbar s

                 2.移除系統自帶的tabbar

            3> 建立並添加子控制器   初始化本身的全部子控制器,每一個子控制器UITableViewController,添加到UITabBarController 的時候就具備tabar

            的屬性,能夠設置標題,圖像;

                3.1>初始化每一個的時候在初始化具體的控制器

            

             4>系統自帶的tabBar  只有四個按鈕(比較整齊),沒有添加大加號,因此自定義tabBar,

            5>

 

UIButton

    

    @property(nonatomic)          UIEdgeInsets contentEdgeInsets UI_APPEARANCE_SELECTOR; // default is UIEdgeInsetsZero

    @property(nonatomic)          UIEdgeInsets titleEdgeInsets;                // default is UIEdgeInsetsZero

    @property(nonatomic)          BOOL         reversesTitleShadowWhenHighlighted; // default is NO. if YES, shadow reverses to shift between engrave and emboss appearance

    @property(nonatomic)          UIEdgeInsets imageEdgeInsets;

   設置button  image title 的四周多大的範圍不能用,內部內容會壓縮

 

 

    切換控制器   :

    1>modal  會保住以前的控制器

    2>push  須要導航控制器(須要導航,缺點,push後的不能銷燬)

    3>切換根控制器

    1>2>根據動畫效果決定

    

  對象無指針會銷燬

    

default-568h.@2x.png  ;lanuch

     裏面纔會自動加載

    @2x 點擊rentnia  拖動  不然unsign  不能用

    

    

    隱私刪Cookie

    

    oauth受權

當使用的是  數字的時候,使用  對數字對象便於用戶開發

    /**

     *  用戶的惟一標示

     */

    @property (nonatomic, copy) NSNumber *uid;

    新建不一樣的方法類  能夠保證不一樣的值在不一樣的文件中傳輸

 

    字符串截取

    - (void)setSource:(NSString *)source

    {

        int loc = [source rangeOfString:@">"].location + 1;

        int length = [source rangeOfString:@"</"].location - loc;

        source = [source substringWithRange:NSMakeRange(loc, length)];

        

        _source = [NSString stringWithFormat:@"來自%@", source];

    }

    新浪返回的格式是美國的時間格式,   loacl  應該寫美國的時間;

    真機調試須要加fmt.local  = [[nsloclal alloc ]init];

    不然時間不顯示

    

    沒法測試環境,好比去年的時間, 能夠寫死創造測試條件;

    Next

    Overview

    

    The UIWindow class defines an object known as a window that manages and coordinates the views an app displays on a device screen. Unless an app can display content on an external device screen, an app has only one window.

    

    The two principal functions of a window are to provide an area for displaying its views and to distribute events to the views. To change the content your app displays, you can change the window’s root view; you don’t create a new window. A window belongs to a level—typically, UIWindowLevelNormal—that represents where it sits on the z-axis relative to other windows. For example, a system alert window appears above normal app windows.

    

Note: When you use storyboards and the Xcode app templates to create an app, a window is created for you. If you choose to create a window in Interface Builder, be sure to select the Full Screen at Launch option in the Attributes inspector so that the window is sized appropriately for the current device. Because a window doesn’t receive touch events outside of its bounds and views aren’t clipped to the window’s bounds by default, an improperly sized window might not be able to deliver touch events to all its views.

    For more information about how to use windows, see Multiple Display Programming Guide for iOS.

        

        Tasks

        

        Configuring Windows

        windowLevel  property

        screen  property

        rootViewController  property

        Making Windows Key

        keyWindow  property

        – makeKeyAndVisible

        – becomeKeyWindow

        – makeKeyWindow

        – resignKeyWindow

        Converting Coordinates

        – convertPoint:toWindow:

        – convertPoint:fromWindow:

        – convertRect:toWindow:

        – convertRect:fromWindow:

        Sending Events   – sendEvent:

        Properties

        

keyWindow(是不是keyWindo )

@property(nonatomic, readonly, getter=isKeyWindow) BOOL keyWindow

 

Discussion

If YES, the receiver is the key window for the application; otherwise, NO.

//主window  接受鍵盤,和其餘非觸摸相關的事件,同一時間只能有一個keywindow

 

rootViewController

The root view controller for the window.

 

window 的根控制器,提供window的內容view 指定根控制器 讓控制器的view 做爲window的contenView  添加根控制器之前的控制器

會移除,新的控制器的view 會被安裝,默認的屬性,,[pp]

@property(nonatomic, retain) UIViewController *rootViewController

 

 

The default value of this property is nil.

 

 

  #warning 註釋---

    // 當前時間

    NSDate *now = [NSDate date];

    // 比較當前時間 和 帳號的過時時間

    if ([account.expires_time compare:now] == NSOrderedAscending) { // 過時

        return nil; // 直接返回nil

    }

    

    return account;

    

    

    圖文混排,coreText  使用第三方框架

    #pragma mark-

    字符串退換  很強大

    

    //---------------------------------------------

    只要用到令外的東西  ,都須要導入該頭文件(即便已經導入了父的頭文件)

    //---------------------------------------------

    

    [UIColor  colorwithimage :]= color

    

    一個控件移動須要回去的時候  使用CATransform3D

    [NSTimer  sched

     

     

     kvc   key Value  coding

     kvo  key value  observe  監聽對象的屬性改變

     NSDictionary *dict = @{@(1):@(2),@(1):@(2)};

     

     

    nsnumber  轉化爲字符串 description

 

     如何保證程序在後臺運行

       //---------------------------------------------

#warning 註釋---set方法沒保存  後面的圖片出不來

    // 還有須要調用父類的方法,layoutsubViews///

 

    //---------------------------------------------

    

     initWithImage :設置的圖片默認不能交互,自動調整frame,就是圖片的大小

     

     

     點擊按鈕 :  touchupinside

     textField  單行

                不能滾動

                 有提示文字

     textview   多行輸入,能滾動

                 沒有提示文字

     

 

     //添加label到導航欄的下面

     [self.navigationController.view  insertSubview:lable belowSubview:self.navigationController.navigationBar];

     

     copy 之後不相互影響

     

    代理只能設一個  通知能夠多個

     

     一條線平鋪: 平鋪的方法

     // 1.設置背景

     self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageWithName:@"compose_toolbar_background"]];

 

     // 3.監聽鍵盤的通知

     位置改變的通知UIKeyboardWillChangeFrameNotification  等於下面兩個通知

     

     [IWNotificationCenter addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

     [IWNotificationCenter addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

     之前

     

對象轉結構體

        CGRect keyboardF = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];

     //textView 垂直方向上永遠能夠拖拽

     textView.alwaysBounceVertical = YES;

 

 

     

     監聽scrollView  使用代理,鍵盤使用通知監聽

     彈出鍵盤

     [self.textView becomeFirstResponder];

 

     

     取字典的value

 info[UIImagePickerControllerOriginalImage]

 

 

 

     // 發送多張圖片用同一個name便可(同一個請求參數名字,服務器利用數組接收便可)

     [formData appendPartWithFileData:data name:@"pic" fileName:@"" mimeType:@"image/jpeg"];

 

     }

 

 

     //-------------------不能點擊--------------------------

     父控件沒有frame 子控件還會顯示的,只是父控件不能接受點擊事件,

    父控件設置背景色不可見,子控件就不能點擊

        //---------------------------------------------

 

    // 定時發送請求給服務器(得到未讀數)

       NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(getUnreadCount) userInfo:nil repeats:YES];//定時發送任務,

    //    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];//讓執行其餘任務的時候定時器(好比拖拽的時候,還能給定時器發送請求);

    

    

    init  內部調用 initWithNIbname(不用調父類)

     init 內部也調用 initwithname (不用調父類)

     

     模型通常繼承NSObject   或者自定義的父類

     

   backGroundView  的優先級高於backGroundColor 的優先級

     

    重寫frame 方法  修改cell   系統的東西改了   重寫系統的方法

     

     

     hilightTextColor  高亮時文本的顏色

     

     微博第八天  穿透

     1429????

     

    配兩下  配兩下 就能夠完成

     

     

     

     軟件內存的怎麼樣??

     

     靜態分析  有無潛在的的內存泄露

     

     動態分析: 分析

     

    發佈  用safir  必須用這個

     

     

     

     

     

     nscoding :archives

     

存對象

     偏好:鍵值 (bool  key)

     plist :字典

     

     (以上都是小數據)

 

     

     sqlite3  跨平臺

     core data  sqlite3是sqlite3的oc 形式

     

     sqlite3 輕型  幾百kb 速度比mysqql  postSql  速度更快

     

     數據庫

     數據結構存儲數據的倉庫

     有必定的格式

     dataBase

     關係型數據庫

     對象型數據庫

     

     經常使用的關係型數據庫

     

     pc端 :Oracle

     嵌入式/移動客戶端  SQlite

     

     數據庫以表爲單位

     數據庫有多少張表

     表(列 -字段):存儲一種數據

     5條數據 = 5條記錄

     

     建立表 - 字段(列,屬性) - 記錄(行,record );

     navicat - .app  -sn(破解)獲取  - 退出app

     blog 二進制

     

     存數據必須得有主鍵

     主鍵  增長主鍵約束  每一個表必須有一個主鍵  標記記錄,保持惟一

     一個主鍵 能夠是一個或者兩個字段組成主鍵

     主鍵必須保持惟一性

     

     移動開發搞一個一個字段的主鍵就行

     主鍵必須integer  才行

     key勾選表明是主鍵  主鍵不能爲空,兩個空 不保證惟一性

     

     寫數據必須添加主鍵

     real 浮點型

     數據庫以文件存在,永久存儲

     

     

     

     auto incre

     sql 語句增長記錄

     sql = structure  query language

     

     sql 是數據庫語句,關係型數據定義的語言

     sql 語言易學易用

     

   數據庫的  增刪改查= CRUD

     sql 語句的特色:1>不區分大小寫

     2> 分號結尾

     3> 關鍵字

     4>不能用關鍵字 標示變量

     5>ddl data defination language

     6>建立刪表

     DMl data manipunaiton language

     insert delete update

     

     數據查詢語句

     DQL     query

     

     select  查數據 (最經常使用的數據)

     drop 刪數據

     

    創表

     create Table

     

     沙盒 nsserchPath  (doc library);

     

     mainbundle (app 的路徑);

     

     

     

     - (IBAction)select {

         // 1.查詢數據, 得到查詢結果集

         FMResultSet *set = [self.db executeQuery:@"select * from t_student where name like ?;", @"%jay-5%"];

  #warning 註釋---@"%jay-5%"  與數據庫中寫判斷   加兩個% 號不一樣  字符串拼接, %% 是轉義子字符

         // 2.從結果集裏面取出數據

         while ([set next]) {

             // 取出當期指向的那行數據

             NSString *name =  [set stringForColumn:@"name"];

             int age = [set intForColumn:@"age"];

             

             NSLog(@"%@ - %d", name, age);

         }

     }

     

     

     

     

     .keyValues write14:31直接寫入plist

     

     

     

     

     NSBundle 和沙盒 的區別???

     

     

     

     

     set

     

     copy 在block中是強引用

     網絡多線程,最後一天微博多線程中的循環引用

     block 中只要用到外面東西就使用弱指針

     16:04強引用

     

     註釋註釋

    註釋paihang

     

//     看公司代碼技巧:

     修改以前備份

     名字搜不到:有多是圖片,網絡數據是搜不到的;

     代碼備份

     4>按鈕多是圖片

     5>搜不到 就搜附近的名字

     1>註釋+加搜  (主搜  + 副搜)

     2>註釋:就知道作什麼:

     3>直接加return 就能夠知道後面的代碼作什麼的?

     6>名字= 組合搜

     7>中文標籤是重點搜得對象

     8>控制器清空:nil

     9>通常先找viewdidload

     10>結構作筆記,熟悉公司代碼的結構

     11>一層層的找控制器,就會熟悉

     12>不刪除的設置背景色也能夠;

     13>改東西不能一行行找

     

     面試題:c++ xmpp 講完新浪博客 360 17.5k                     14*15

     增長的項目:多整項目,

     

     

     AFN 返回的字典數組,不能直接寫入plist 由於裏面有空格  逗號,等,須要用keyValues 傑哥寫的字典專,再數組轉模型

     

     模型再轉數組的方法,再writeTofile 的方法寫入plist

     

     模型存數據是把數據保存在模型的屬性裏面

     

     

     // 準備了一個塊代碼,傳遞給detail

     // 塊代碼的具體執行時間由detail決定  str 表明接受一個形參

     detail.saveBlock = ^ (NSString *str) {

         self.label.text = str;

     };

     

     //    [_delgate save:self.textField.text];

     if (self.saveBlock) {

         self.saveBlock(self.textField.text); 具體的執行由這行來執行,self.textField.text是傳入的參數

     }

     

     作分享的網站:友盟,分享 光速推送

     

     

     橫豎屏突破:田字格里面作橫豎屏適配;

     

     長度不同 不能全部的都勾上;

     

     讓導航控制器彈出新的控制器,  再present

     建立控制器:顯示的時候,寬度,永遠是768;高度隨屏幕

     設置彈出模態的方式;全屏中間,

     

     顯示蒙版還能夠點擊;

     

     屏模式配  一個個的往裏拖

     

     啓動圖片 一個個的修改json

     不適用Autolayout

     

     0622:14:15自動取色

     

     橫豎屏  水平自動居中: 調整田字

     

     out of date 將本身的代碼和服務器的代碼進行比對

     

     svn  拷貝  修改  合併

     

        cvs   鎖定  修改  解鎖

     快速提交代碼//

     五點鐘下班,四點鐘提交代碼

    svn 會out of date

     

     svn  sp2  service pake 3

    直接下一步

     直接下一步,

     

     版本控制:

     

     tags 重大版本的備份

     branches 分支目錄;

     

     initWithImage 默認就用寬高,

     

     UIImageView *iv = [UIImageView alloc ]initWithImage

     

     

     

     

     其實是藍牙連接

     peer to peer 對等 對端連接,

     

     

     監聽圖片點擊,實現圖片點擊

     

     如何喧染圖片;

     

     

     

     

     block  指向結構體指針

     block  回調,代碼 等待被調用,當參數,也能夠接受參數;

     

     __block int a  在block 中能夠修改a

      是指針傳遞

     copy 對應一次release

     copy  將對象放在堆裏面

     

     

     

     

     1.微信如何搜索附近人

     2.模糊搜索和精確搜索

     3.即時通信的UI佈局,要是你作你會用多少個cell

     4.有沒有直播經驗

     5.最近的ipv6上架的問題 以及瞭解ipv6是什麼

     6.消息機制瞭解麼?你用它作過什麼!

     7.iOS如何優化

     8.instuments用過哪些工具,如何測試核心動畫性能

     9.沙盒機制

     10.ffmpeg,opengl瞭解嘛

     11.如何收集APP異常信息(好比:崩潰、閃退等)

     12.離屏渲染瞭解麼,瞭解的話說一下你通常是從哪幾方面操做的

     13.瞭解GCD的信號量機制麼!能談談你對它的理解麼!

     14.聊下RAC和MVVM,你對它的見解

     15.block底層實現

     16.響應鏈底的理解

     17.KVC和KVO

     18.lldb(gdb)經常使用的調試命令

     19.熱更新

     20.GCD實現原理

     

     

     

     

     

     

     

@interface CZPlaySoundTool ()

 

//@property (nonatomic, strong) NSMutableDictionary *soundIDs;

 

@end

 

static NSMutableDictionary *_soundIDs;

 

@implementation CZPlaySoundTool

 

// 兩個方法都會調用一次

// 真正使用這個類的時候會調用

+ (void)initialize

{

    _soundIDs = [NSMutableDictionary dictionary];

}

 

// 加載類的時候就會調用

//+ (void)load

//{

//

//

//}

 

 

+ (void)playSoundWithName:(NSString *)name

{

 

    //1.根據name 取字典找soundID

    

    SystemSoundID soundID = [_soundIDs[name] intValue];

    

    //2.判斷soundID

    //獲取對應的音效文件

    //保存到字典

    

    if (soundID == 0) {

        // 1.獲取音效文件

        

        NSString *path = [[NSBundle mainBundle]pathForResource:name ofType:nil];

        NSURL *url = [NSURL fileURLWithPath:path];

        

        AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)(url), &soundID);

        

        [_soundIDs setObject:@(soundID) forKey:name];

        

    }

    

    //3.播放

    

    AudioServicesPlaySystemSound(soundID);

    

 

}