ウェブブラウザのサンプルコードの補足

2010. 05. 17
基礎からのiPhone SDK 改訂版』のサンプルコードは出版社のサイトに落ちていますが、このiPhoneBG2.zipを展開し、『SampleCode』 → 『40.02.WebBrowser ( デリゲート )』フォルダ下に今回作成したウェブブラウザのサンプルコードがあります。

このサンプルコードで、本書内で説明が無い記述がありますので補足したいと思います。


●#pragma

WebAppDelegate.mの中で『#pragma』という記述が複数あります。

@synthesize window;

- (IBAction) loadUrl : (UITextField *) sender

- (void) updateWebBrowser

#pragma mark -
#pragma mark WEBVIEW_DELEGATE


- (void) webView: (UIWebView *) webView didFailLoadWithError: (NSError *) error

- (BOOL) webView: (UIWebView *) view shouldStartLoadWithRequest: (NSURLRequest *) req navigationType: (UIWebViewNavigationType) navType

- (void) webViewDidFinishLoad: (UIWebView *) view

- (void) webViewDidStartLoad: (UIWebView *) view

#pragma mark -
#pragma mark APPLICATION_DELEGATE


- (void) applicationDidFinishLaunching : (UIApplication *) application

- (void) applicationDidBecomeActive: (UIApplication *) application

- (void) applicationWillResignActive: (UIApplication *) application

- (void) applicationWillTerminate: (UIApplication *) application

#pragma mark -

- (void) dealloc

@end

試しに『#pragma』でググってみたところ、九州工業大学情報工学部C3さんのサイトの『ゲームプログラミングWiki/基本技術etc/pragma』に説明がありました。

#pragmaディレクティブというコンパイラへの命令で、コンパイラ固有の指定を行うものです。

ということは、その後に続く値はXcode独自のものということになります。

『#pragma mark』で検索してみると、xcatsanさんのサイト『Cocoaの日々』で『Xcode の #pragma mark とは何か ?』とそのままの解説がありました。

#pragma markは、Xcodeのテキストエディタのファンクションメニューに注釈を入れる機能ということです。

サンプルコードのファンクションメニューを見てみると、

309

『#pragma mark -』がセパレータ(区切り線)を入れるもので、『#pragma ●●●●●』で●●●●●をタイトルにできるようです。

これでソースの可読性が高まるということですね。

ちなみに何も考えずに書いた私のファンクションメニューは下図の様になります。

310

規模が小さい内はそんなに苦労しませんが、大きくなった時に威力を発揮するでしょう。
次回から使ってみたいと思います。

せっかくなので、xcatsanさんの仰っている原文『Xcode Workspace Guide』の『The Text Editor/A Tour of the Text Editor/Navigation Bar/The Function Menu』を読んでみます。


・ファンクションメニュー

ファンクションメニューは現在のファイルの多くのポイント(定義や宣言)に飛ぶことができます。

また、定義や宣言のされていないアイテムをユーザが追加することができます。

このメニューでは、以下の項目を閲覧できます。

・クラスの宣言と定義、関数、メソッド
・型宣言
・#defineディレクティブ
・#pragma mark
・コメントへの追加
        MARK:
        TODO:
        FIXME:
        !!!:
        ???:

これらの識別子の場所にスクロールして、メニューから選択することができます。

ファンクションメニューの内容は、ファイルの中での記述順に並べられて表示されます。

Optionキーを押したままファンクションメニューをクリックすると、アイテムがアルファベット順にソートされて表示されます。

311

ファンクションメニューのデフォルトの動作は、Xcodeの『環境設定』の『コード入力補助』で変更できます。

ファンクションメニューに出てくるアイテムの選択と、順序を設定できます。

312

・『宣言を表示』オプションは、定義している宣言をメニューに表示するかを指定します

・『リストをアルファベット順に並べ替え』オプションは、ファイル中のアイテムの表示をアルファベット順に並べるかを指定します

ソースコードで『#pragma mark』命令を使うと、ファンクションメニューにマーカーを追加することができます。

例えば、以下の命令ではファンクションメニューに『PRINTING FUNCTIONS』というマーカーを追加します。

#pragma mark PRINTING FUNCTIONS

ファンクションメニューにセパレータを追加するには、次の命令を使います

#pragma mark -

サポートする言語

ファンクションメニューは、C、Objective-C、C++、Java、Perl、Python、Rubyをサポートします。


リファレンスはここで終わっているのですが途中にあった『コメントへの追加』が気になったので、またググってみました。

西方夏子さんのサイト『Natsu's iPhone App』の『Xcode : メソッドリストにコメントを表示』と、NAOKITSさんのサイト『Life is yak shaving』の『Xcodeで使用できる便利なタグ付きコメント』の内容をまとめてみます。

『コメントへの追加』は、『//』で始まるコメント行の頭に、以下に述べる特定の識別子を記述することで、ファンクションメニューに以降のコメントを表示できるというもののようです。

『MARK:』は『#pragma mark』と同等の機能ですが、他の4つの識別子と異なり、ファンクションメニューに『MARK:』とは表示されないとのことです。

『TODO:』『FIXME:』『!!!:』『???:』は同じ動作で、ファンクションメニューに『識別子: ●●●●●』と表示することができます。

// TODO: ギターソロかも~ん♪ 

313

識別子のコロンの後ろに半角スペースを入れないと表示されないのでご注意ください。

つまりファンクションメニューで一覧を見た時に、『後でやる』『治して』『わっほい』『何これ』というような目印を付けるものと思ってください。


●NSLog

サンプルコードには、applicationDidFinishLaunching:以外のUIApplicationDelegateプロトコルがいくつか実装されています。

// アプリケーションがアクティブになりました
- (void) applicationDidBecomeActive: (UIApplication *) application {
    NSLog( @"applicationDidBecomeActive" );
}

// アプリケーションが非アクティブになります
- (void) applicationWillResignActive: (UIApplication *) application {
    NSLog( @"applicationWillResignActive" );
}

// アプリケーションが終了します
- (void) applicationWillTerminate: (UIApplication *) application {
    NSLog( @"applicationWillTerminate" );
}

アプリケーションとして何かするわけではありませんが、本書のp.110で説明されているように、デバッグ用のコマンドとしてNSLogという関数を実装しています。
(webView:didFailLoadWithError:メソッドも同様にNSLog関数を実装しています)

Xcodeの『実行』→『コンソール』でコンソールウィンドウを開き、アプリケーションを実行して終了すると、下図のようなログが出力されます。

314

アプリケーションを起動すると、applicationDidFinishLaunchingとapplicationDidBecomeActiveの2行が出力され、アプリケーションを終了するとapplicationWillTerminateが出力されます。

これにより、アプリケーションの画面に出力せずとも、アプリケーションの動作を確認できます。


・NSLog

void NSLog (
    NSString *format,
    ...
);

Apple System Log機能で、エラーメッセージのログを出力します

複数の可変値をもつ項目を出力する場合は、NSLogvを使用してください



参考文献

九州工業大学情報工学部C3/ゲームプログラミングWiki/基本技術etc/pragma

Cocoaの日々/Xcode の #pragma mark とは何か ?

Natsu's iPhone App/Xcode : メソッドリストにコメントを表示

Life is yak shaving/Xcodeで使用できる便利なタグ付きコメント

Foundation Functions Reference

基礎からのiOS SDK基礎からのiOS SDK
(2010/10/09)
鶴薗 賢吾、松浦 健一郎 他

商品詳細を見る






SoundLink Mini Bluetooth speaker_ii
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
05 | 2017/06 | 07
Sun Mon Tue Wed Thu Fri Sat
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

SoundLink Mini Bluetooth speaker_ii
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR