ウェブブラウザのデリゲート

2010. 05. 17
基礎からのiPhone SDK 改訂版』のウェブブラウザのアプリケーションデリゲートとウェブビューデリゲートの実装について説明します。


●アプリケーションデリゲートの実装

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    // Override point for customization after application launch

    // デフォルトのURLを読み込む
    NSURL *url = [NSURL URLWithString:@"http://www.idolmaster.jp/imas/"];
    NSURLRequest *urlReq = [NSURLRequest requestWithURL:url];
    [webView loadRequest:urlReq];


    [window makeKeyAndVisible];

    return YES;
}

使用しているメソッドについては『applicationDidFinishLaunching:』、『ウェブブラウザのアクションメソッド(URLWithString:、requestWithURL:、loadRequest:)』を参照してください。

applicationDidFinishLaunching:はテンプレートで自動的に記述されるメソッドで、アプリケーションの起動処理完了直後に呼び出されます。

従ってアプリケーション起動時にデフォルトで開くURL(今回の場合はhttp://www.idolmaster.jp/imas/)の指定を行っています。


●ウェブビューデリゲートの実装

・ウェブビューを開くかどうかの判別

- (BOOL)webView:(UIWebView *)view shouldStartLoadWithRequest:(NSURLRequest *)req navigationType:(UIWebViewNavigationType)navType {
    if ([[[req URL] host] isEqualToString:@"www.ng.com"]) {
        return(NO);    // 拒否
    }
    return(YES);    // 許可
}

webView:shouldStartLoadWithRequest:navigationType:』『isEqualToString:』メソッドはリンク先を参照してください。

webView:shouldStartLoadWithRequest:navigationType:はウェブビューがコンテンツを読み込む前の処理を記述します。

今回はテキストフィールドに入力されたURL(NSURLRequestオブジェクトのreq)から、NSURLRequestクラスメソッドのURLでURLを抽出、さらにNSURLProtectionSpaceクラスメソッドのhostでホストを抽出し、除外URL(この場合はwww.ng.com)と比較して該当した場合は読み込みを拒否しています。


・URL
(NSURLRequestクラス)

- (NSURL *)URL

リクエストのURLを返します


・host
(NSURLProtectionSpaceクラス)

- (NSString *)host

レシーバのホストを返します


・ブラウザの更新

- (void)updateWebBrowser {

    // アクティビティインジケータの更新
    BOOL loading = webView.loading;
    BOOL animating = [activeView isAnimating];

    if ((loading == YES) && (animating == NO)) {
        [activeView startAnimating];
    } else if ((loading == NO) && (animating == YES)) {
        [activeView stopAnimating];
    }

    // URL表示のテキストフィールド更新
    NSURL *url = [webView.request URL];    // URLを取得
    NSString *urlStr = [url absoluteString];    // URLからフルパスを取得
    urlField.text = urlStr;    // UITextFieldを変更

    // [戻る][進む]ボタンのEnabled制御
    backButton.enabled = webView.canGoBack;
    fwdButton.enabled = webView.canGoForward;
}


ウェブブラウザの更新を行う独自メソッドで、アクティビティインジケータとURL入力テキストフィールド、Back/Forwardボタンの有効/無効の制御を行っています。

アクティビティインジケータの更新は、ウェブビューが読み込み中かどうかと、インジケータがアニメーション中かどうかの2つの状態を監視し、読み込み中はインジケータをアニメーション表示、そうでなければアニメーションを停止する処理を行っています。

ウェブビューが読み込み中かどうかは、UIWebViewクラスのloadingプロパティで取得しています。


・loading
(UIWebViewクラス)

@property(nonatomic, readonly, getter=isLoading) BOOL loading

レシーバがコンテンツの読み込みを行っているかをブール値で示します(読み込み専用)

戻り値は、レシーバがまだ読み込み中であればYES、そうでなければNOを返します


インジケータがアニメーション中かどうかは、UIActivityIndicatorViewクラスのisAnimatingメソッドで取得しています。


・isAnimating
(UIActivityIndicatorViewクラス)

- (BOOL)isAnimating

レシーバがアニメーションしているかどうかを返します

戻り値は、レシーバがアニメーションしている場合はYES、そうでなければNOを返します


コンテンツを読み込み中でインジケータがアニメーションしていない場合は、UIActivityIndicatorViewクラスのstartAnimatingメソッドでアニメーションを開始し、コンテンツが読み込みを停止してインジケータがアニメーションしている場合は、UIActivityIndicatorViewクラスのstopAnimatingメソッドでアニメーションを停止します。


・startAnimating
(UIActivityIndicatorViewクラス)

- (void)startAnimating

進捗インジケータのアニメーションを開始します

進捗インジケータがアニメーションしている場合は、ギアが回転して不確定な進捗状況を示します
(ここで言う不確定とは、総量が分かっていて、それに対して何割進んでいるかを示すのではなく、進行中かそうでないかだけを示すことを指します)

インジケータはstopAnimatingが呼び出されるまでアニメーションを行います


・stopAnimating
(UIActivityIndicatorViewクラス)

- (void)stopAnimating

進捗インジケータのアニメーションを停止します

このメソッドは、startAnimatingの呼び出しで開始された進捗インジケータのアニメーションを停止する際に呼びだします

アニメーションを停止するとインジケータは非表示になります

停止してもインジケータを表示したい場合は、hidesWhenStoppedプロパティをNOにしてください


今回は停止時のインジケータの表示/非表示は、Interface BuilderのInspectorウィンドウのAttributeで設定していますが、試しにupdateWebBrowserメソッド内に

    // コードでインジケータを表示
    activeView.hidesWhenStopped = NO;

と、nibファイルの設定と反対のプロパティを設定すると、Interface Builderの設定に関わらずインジケータは表示されます。

308

同様に、Interface Builderでインジケータを表示するに設定し、

307

updateWebBrowserメソッド内のコードを

    // コードでインジケータを非表示
    activeView.hidesWhenStopped = YES;

とすると、停止時のインジケータは非表示になります。

全てにおいてそうなのかは分かりませんが、Interface Builderの設定とソースコードの設定が矛盾する場合は、ソースコードが優先されるのかもしれません。

ただ、nibファイルの設定はアプリケーション起動時のもので、updateWebBrowserメソッドが後から上書きした結果、優先しているように見えている可能性もあります

さてURL入力のテキストフィールドの更新は、ウェブビューで表示しているコンテンツのURLをリクエストから取得し、NSURLオブジェクトからNSStringオブジェクトに整形して、テキストフィールドに渡しています。

まずウェブビューから、UIWebViewクラスのrequestプロパティで場所を識別し、先に述べたNSURLRequestクラスメソッドのURLでURLを抽出します。


・request
(UIWebViewクラス)

@property(nonatomic, readonly, retain) NSURLRequest *request

URLリクエストで読み込んだコンテンツの場所を識別します(読み込み専用)


抽出したNSURLオブジェクトのURLから、NSURLクラスのabsoluteStringメソッドでNSStringオブジェクトに変換します。


・absoluteString
(NSURLクラス)

- (NSString *)absoluteString

レシーバから純粋なURLの文字列を返します

戻り値は純粋なURLの文字列で、RFC 1808の規定に基づいてレシーバの文字列を生成します


取得したNSStringオブジェクトのURLは、UITextFieldクラスのtextプロパティでテキストフィールドに表示します。
(『ウェブブラウザのアクションメソッド』参照)

Back/Forwardボタンの有効/無効の更新は、ウェブビューの履歴から進めるか戻れるかをUIWebViewクラスのcanGoBack/canGoForwardメソッドで判別し、その結果をUIBarItemクラス(UIBarButtonItemクラスの親クラス)のenabledプロパティで反映します。


・canGoBack
(UIWebViewクラス)

@property(nonatomic, readonly, getter=canGoBack) BOOL canGoBack

レシーバが前に戻れるかをブール値で示します(読み込み専用)

戻れる場合はYES、それ以外の場合はNOを返します


・canGoForward
(UIWebViewクラス)

@property(nonatomic, readonly, getter=canGoForward) BOOL canGoForward

レシーバが先に進めるかをブール値で示します(読み込み専用)

進める場合はYES、それ以外の場合はNOを返します


・enable
(UIBarItemクラス)

@property(nonatomic, getter=isEnabled) BOOL enabled

アイテムが有効かどうかをブール値で示します(読み込み専用)

有効な場合はYESを返します

デフォルトはYESです


・ウェブビュー読み込み開始の通知

- (void)webViewDidStartLoad:(UIWebView *)view {
    [self updateWebBrowser];    // ウェブブラウザ更新
}


・ウェブビュー読み込み終了の通知

- (void)webViewDidFinishLoad:(UIWebView *)view {
    [self updateWebBrowser];    // ウェブブラウザ更新
}

ウェブビューがコンテンツの読み込みを開始および完了した時には、双方ともupdateWebBrowserメソッドを呼び出して、ウェブブラウザの更新を行っています。

webViewDidStartLoad:』、『webViewDidFinishLoad:』メソッドはリンク先を参照してください。



参考文献

NSURLRequest Class Reference

NSURLProtectionSpace Class Reference

UIWebView Class Reference

UIActivityIndicatorView Class Reference

NSURL Class Reference

UITextField Class Reference

UIBarButtonItem Class Reference

UIBarItem Class Reference

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

商品詳細を見る






bose_soundlink_revolve
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
03 | 2017/04 | 05
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

bose_soundlink_revolve
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