More Related Content
Similar to Cocoa Pro5 (20)
Cocoa Pro5
- 8. 文法実験の仕方
NSAutoreleasePoolというクラスの
ObjC Test.mのソースコードを見返してみる
インスタンス化を行っている
- 14. フレームワークのクラス宣言の
読み込み
読み込むために使うのが「#import」という文
Cocoaのクラス宣言ファイルを読み込むには,以下のように書く
これは「システムにある,Cocoaフレームワークの,
Cocoa.hというファイルを読み込む」という意味
#importの後の< >が,システムのヘッダファイルを意味する
- 15. フレームワークのクラス宣言の
読み込み
#import <Cocoa/Cocoa.h>の指示で読み込む
ファイル
/システム/ライブラリ/Frameworks/Cocoa.framework/
Headers/Cocoa.h
Foundation,AppKit,CoreDataというフレームワークのヘッダ
ファイルを読み込んでいる
- 27. インスタンスオブジェクトのための
変数型
インスタンスオブジェクトのための変数
クラスをインスタンス化するとオブジェクトができる
このオブジェクトに入れるための変数
- 28. インスタンスオブジェクトのための
変数型
変数は「クラス名のポインタ」という
形式の型になる
MyObjectクラスのインスタンスのための変数
CocoaのクラスであるNSStringのための変数
- 38. 開発の手順
1. 新規プロジェクトの作成をする
Cocoa Applicationテンプレートを使う
2. アプリケーションのためのクラスを作成をする
MVCアーキテクチャに則って,コントローラを1つ作る
アウトレットとアクションも追加しておく
- 44. プロジェクトの作成
ガベージコレクションの設定
「GCC 4.0 - Code Generation」のカ
テゴリの中にある「Objective-C
Garbage Collection」の設定を変更する
ガーベッジコレクションの設定では
「Unsupported」「Supported」
「Required」という値を指定できる
ここでは「Required」を指定する
- 67. アウトレットとアクションの
接続
テキストフィールドの titleTextField
アウトレットを接続す urlTextField
linkTextField
る
「urlTextField」,
「titleTextField」,
「linkTextField」を
コントロールキーを押しな
がらそれぞれ接続する
- 68. アウトレットとアクションの
接続
アクションの接続をする
「Read」ボタンから,
「readURL;」アクションに接続
する
入力可能なテキストフィールドか
らも「readURL ;」アクションに
接続する
readURL; readURL;
このアクションはテキスト
フィールドで Enterキーを
押したときに送られる
- 69. アウトレットとアクションの
接続
テーブルビューのアウト
レットを接続する
コントロールをしながらテーブル
ビューをクリック
し,AppControllerまでドラッグ
して,上でドロップする
dataSource
テーブルビューアウトレットの中
から「dataSource」を選択
- 71. #import "AppController.h"
@implementation AppController
- (IBAction)readURL:(id)sender
{
NSURL* url;
url = [NSURL URLWithString:[urlTextField stringValue]];
// XMLドキュメントを作成します
document = [[NSXMLDocument alloc] initWithContentsOfURL:url options:0
error:NULL];
if (!document) {
return;
}
// '/rss/channle/title'のノードを取得します
NSArray* nodes;
nodes = [document nodesForXPath:@"/rss/channel/title" error:NULL];
if ([nodes count] == 0) {
// '/rdf:RDF/channel/title'のノードを取得します
nodes = [document nodesForXPath:@"/rdf:RDF/channel/title" error:NULL];
}
if ([nodes count] == 0) {
// '/feed/title'のノードを取得します
nodes = [document nodesForXPath:@"/feed/title" error:NULL];
}
- 72. if ([nodes count] == 1) {
NSXMLNode* titleNode;
titleNode = [nodes objectAtIndex:0];
// テキストフィールドにタイトルを設定します
NSString* title;
title = [titleNode stringValue];
[titleTextField setStringValue:title];
}
// '/rss/channle/link'のノードを取得します
nodes = [document nodesForXPath:@"/rss/channel/link" error:NULL];
if ([nodes count] == 0) {
// '/rdf:RDF/channel/link'のノードを取得します
nodes = [document nodesForXPath:@"/rdf:RDF/channel/link"
error:NULL];
}
if ([nodes count] == 0) {
// '/feed/link'のノードを取得します
nodes = [document nodesForXPath:@"/feed/link" error:NULL];
}
- 73. if ([nodes count] == 1) {
NSXMLNode* linkNode;
linkNode = [nodes objectAtIndex:0];
// テキストフィールドにリンクを設定します
NSString* link;
link = [linkNode stringValue];
[linkTextField setStringValue:link];
}
// テーブルビューにデータを読み込みます
[tableView reloadData];
}
// NSTableViewデータソース
- (int)numberOfRowsInTableView:(NSTableView*)tableView
{
if (!document) {
return 0;
}
- 74. // '/rss/channel/item/'のノードを取得します
NSArray* nodes;
nodes = [document nodesForXPath:@"/rss/channel/item"
error:NULL];
if ([nodes count] == 0) {
// '/rdf:RDF/item'のノードを取得します
nodes = [document nodesForXPath:@"/rdf:RDF/item"
error:NULL];
}
if ([nodes count] == 0) {
// '/feed/entry'のノードを取得します
nodes = [document nodesForXPath:@"/feed/entry"
error:NULL];
}
// ノードの数を返します
return [nodes count];
}
- 75. // NSTableViewデータソース
- (id)tableView:(NSTableView*)tableView objectValueForTableColumn:
(NSTableColumn*)tableColumn row:(int)row
{
if (!document) {
return nil;
}
// テーブルカラムの識別子を取得します
id identifier;
identifier = [tableColumn identifier];
// '/rss/channel/item/'のノードを取得します
NSArray* nodes;
nodes = [document nodesForXPath:@"/rss/channel/item" error:NULL];
if ([nodes count] == 0) {
// '/rdf:RDF/item'のノードを取得します
nodes = [document nodesForXPath:@"/rdf:RDF/item" error:NULL];
}
if ([nodes count] == 0) {
// '/feed/entry'のノードを取得します
nodes = [document nodesForXPath:@"/feed/entry" error:NULL];
}
- 76. // 指定された行の、ノードを取得します
NSXMLNode* node;
node = [nodes objectAtIndex:row];
if ([identifier isEqual:@"title"]) {
// 'title'の文字列を取得します
nodes = [node nodesForXPath:@"title" error:NULL];
if ([nodes count] == 1) {
node = [nodes objectAtIndex:0];
return [node stringValue];
}
}
if ([identifier isEqual:@"link"]) {
// 'link'の文字列を取得します
nodes = [node nodesForXPath:@"link" error:NULL];
if ([nodes count] == 1) {
node = [nodes objectAtIndex:0];
return [node stringValue];
}
}
return nil;
}
@end