2013年1月16日 星期三

Category

這次的教學是 Catagory
先說明一下它是啥, Catagory 是一個將任一的 Class 進行擴充的功能,
主要是以補足 Class 所沒有的功能,我自己是將它與 Class Method 一起使用,
來擴充原本沒有 Class method 的內建 Class ,接下來就開始教怎麼做了。

首先開啟任一專案,之後按下⌘+N,或是 File > New > File… 新增一個檔案
新增時要選擇下面這一個,之後按下下一步,


現在就再 Catagory 欄位裡輸入你的檔名,Catagory on 的欄位是要擴充的 Class,
輸入完按下一步選擇要儲存的位置,這樣子就建好你的檔案了。


建好的檔名會像是這樣子,在+之前的要擴充的 Class 名稱,+之後的是自定的名稱


檔案建好後就開始建立要擴充的 Method 了
我就繼續使用現在的 Class 進行示範,
在原本的 UIWebView 的宣告中,都是先 initWithFrame: 建立它的大小,
之後再 loadRequest: 輸入要顯示的網址,
這樣子就需要消耗掉兩行,反而變得比較沒效率,
所以我採用了自定的 Class Mthod 的方法

UIWebView+webView.h
+ (id)webWithFrame:(CGRect)frame URL:(NSURL *)url;
- (id)initWithFrame:(CGRect)frame URL:(NSURL *)url;

因為自定了一個新的 Calss Method 就需要一個 Initial 做搭配,
雖然這並不一定,不過這是我的習慣,
接下來就實作了

UIWebView+webView.m
+ (id)webWithFrame:(CGRect)frame URL:(NSURL *)url
{
	UIWebView *webView = [[[UIWebView alloc] initWithFrame:frame URL:url] autorelease];

	return webView;
}

- (id)initWithFrame:(CGRect)frame URL:(NSURL *)url
{
	self = [super initWithFrame:frame];

	if (!self) return nil;

	[self loadRequest:[NSURLRequest requestWithURL:url]];

	return self;
}

這樣子就可以了,未來要使用 UIWebView 時就可以使用以下宣告方法,
UIWebView *webView = [UIWebView webWithFrame:CGRectMake(0, 0, 320, 480) 
										URL:[NSURL URLWithString:@"HTTP://www.google.com"]];
這樣子,就將原本的兩行變成了一行就能解決,
不過要記得使用
#import "UIWebView+webView.h"
才能使用,

這次的教學就到這邊,我再想到有啥新東西時就還會拿出來教的。

2012年12月31日 星期一

Class Method (二):Signleton

如果你有要在多執行續使用 signletion 的話,請改看這篇文章。
Class Method (三):Signleton 改 - 在多執行續的解法

之前有說到 Class Method 還有另一種用法,就是 Singleton,
它是在第一次宣告這個 Class 取得記憶體位置之後,
之後的宣告都不會改變它的記憶體位置的使用方法,
假設現在有兩個 Class,一個是 aClass、另一個是 bClass,還有一個使用 Singleton 方法的 cClass
aClass 與 bClass 都會宣告 cClass,
這時候不管是哪個 Class 先宣告,另一個 Class 裡的都會使用到相同記憶體位置的 cClass,
像是需要保持資料庫的連結時就會這麼做,
在 Objective-C 中內建的 Class 中,UIDevice、NSBundle 等等都有這種用法,
說明就到此為止,接下來就教怎麼做。

首先與上一篇的建立 Class Method 的方法一樣,
不過比較不同的的是 Singleton 通常不會有傳值的動作。

Method.h
+ (id)method;

建立完了以後就是來實作它了

Method.m
+ (id)method
{
	static Method *singleton = nil;
	if (singleton == nil) {
		singleton = [[Method alloc] init];
	}
	return singleton;
}

Singleton 與一般的 Class Method 的差別是 Singleton 完全不需要 release,
因為它的記憶體位置是需要被保留下來的,
所以之後它只要在第一次宣告之後,
未來的宣告都會使用相同的記憶體位置。

這次的教學就到此為止,下次等我有想到有不同的教學再來吧。

2012年12月30日 星期日

Class Method (一)

有一段時間沒有更新這個網誌了
剛好趁跨年假期來打個一篇
這次是 Class Method,這是大部分的書本沒交到的使用方法,
不過要是學會的話會愛不釋手,因為可以省下打一堆字,
下面就開始這次的教學了。

這次是 Class Method

什麼是 Class Method ?
在 Objective-C 中的 [NSString string] 等方法就是 Class Method。
它同時也是符合 Auto Release 的功能。

那麼要如何寫一個 Class Method 呢?
其實很簡單,只要將一般的 Method 的開頭減號改成加號即可。
不過實際的內容要怎麼寫呢?

假設有兩個檔案為 Method.h 與 Method.m
一個 Class Method 都會是對外公開的 Method
所以 Method 的名稱都會打在 h 檔中

Method.h
+ (id)aMethod; // 這是一個不需要傳入值的 Class Method
+ (id)aMethodWithValue:(NSInteger)integer; // 這是一個需要傳入值的 Class Method

實作 Class Method 有三種方法:
一是直接回傳其他 Class 的 Class Method,這個就不用說了,
二是自己建立自己的 Class Method,這個是這次教學的重點,
三是建立一個 singleton 的 Class Method,這算是 Class Method 的一種變形,在下個教學會教到。

Method.m
+ (id)aMethod
{
	Method *method = [[[Method alloc] init] autoRelease];
	// 其實這跟一般的 Class 宣告方法一樣,
	return method;}

+ (id)aMethodWithValue:(NSInteger)integer
{
	Method *method = [[[Method alloc] initWithValue:integer] autoRelease];
	// 有傳值的 Class Method 就比較特別了,這要看你傳入的值要給哪個初始化的 Method,如果沒有這個 Method 就要自己建立一個了。
	return method;
}

這樣子在其他 Class 裡要用到這個 Class 的功能時就可以這樣子宣告,

Method *method = [Method aMethod];
或
Method *method = [Method aMethodWithValue:0];

這樣子就比一般 Class 宣告的方法短多了,而且又符合 Auto Release 的條件,
就不會忘了這個變數需要 Release 的問題。

未完續待

2012年9月2日 星期日

將相機畫面加到自己的 View 裡面

基本上我們要使用相機來擷取畫面時都是呼叫一個新的 ViewController 出來使用
不過有些時候需要一啟動 App 就載入相機的畫面
這時候有兩個方式:
一個是在 AppDelegate.m 中直接將 UIImagePickerController 加入 rootViewController 中
不過要是需要自定相機的介面的時候就會比較麻煩,因為基本上不會在 AppDelegate.m 中寫太多程式在裡面

另一個是就是跟一般 UI 元件一樣加到現在這個 ViewController 中
用的方法如下:
UIImagePickerController *pickerView = [[UIImagePickerController new] autorelease];
[[self view] addSubview:[pickerView view]];

這樣子就可以在 ViewController.m 中編寫相機的相關功能,而且自定相機介面的時候也不會那麼麻煩。