UI用のクラスのプロトコルとWebViewなどについて
内容
iPhone/iPadプログラミングバイブル iOS9/Xcode7/Swift 対応 (smart phone programming bible)
- 作者: 布留川英一
- 出版社/メーカー: ソシム
- 発売日: 2015/10/27
- メディア: 単行本
- この商品を含むブログ (1件) を見る
上の本を参考にiOSのUIViewと戯れています。
とりあえず、4章までやったので、ここまでで一区切り~~。
- UI用のクラスを使うとき実装するプロトコルについて
- DataSource
- Delegate
- WebViewの使い方について
- ATSの例外のためのInfo.plistの設定
- PlayGround
- TableView
- リサイズマスク
- 行のIndicatorの種類
- NavigationController
- UIPickerViewを使う時に実装するプロトコルについて
UI用のクラスを使うとき実装するプロトコルについて
TableViewやWebView, PickerViewなどのクラスをViewControllerのViewに置く場合、対応するプロトコルを実装する必要があり、クラス名DataSource, クラス名Delegateといった名前をしています。
データの表示の中身やViewから受け取れるイベントのハンドリングをそれを置くViewのViewControllerに委譲する、みたいなのりみたいです。
DataSource
Viewのクラスで扱う行数や行ごとのViewを返すメソッドなどがあるみたいです。 AndroidでいうとAdapterにあたる感じのプロトコルです。
Delegate
Viewをタップした時などのイベントをハンドリングするメソッドを書くプロところです。 AndroidでいうとSwipeRefreshLayoutのコールバックのリスナーみたいな位置付けみたいです。
WebViewの使い方について
- ViewController内でWebViewを生成するなり、StoryBoard上に配置した後ViewControllerとひも付けたり*1する
- WebViewが置いてあるViewのViewControllerでUIWebViewDelegateプロトコルを実装
- カスタマイズが必要なら下記のメソッドなどをオーバーライドする
webView(webView: UIWebView, shouldStartLoadWithRequest: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool
- https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIWebViewDelegate_Protocol/#//apple_ref/occ/intfm/UIWebViewDelegate/webView:shouldStartLoadWithRequest:navigationType:
- 与えられたURLのコンテンツの読み込みを開始しようとした時に呼び出される
- navigationTypeはフォームの投稿やリンクを踏んだなどの遷移の種類を意味する
- 戻り値がfalseならコンテンツの読み込みを開始しない
webViewDidStartLoad(webView: UIWebView)
webView(webView: UIWebView, didFailLoadWithError error: NSError?)
- カスタマイズが必要なら下記のメソッドなどをオーバーライドする
- 読み込みたいURLのリクエストを作成する
let url: NSURL = NSURL(string: "ロード先")
let urlRequest: NSURLRequest = NSURLRequest(URL: url)
- WebViewでリクエストを読み込む
WebView.loadRequest(urlRequest)
読み込み中のIndicatorを出したい場合は
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
のようにする。
ATSの例外のためのInfo.plistの設定
結局 PropertyList
からの編集がうまくいかなくて、ソースコードの編集をしました。
<plist version="1.0"> <dict> <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>localhost</key><!-- HTTPでの通信を例外的に許可したい「ドメイン名」を入れる --> <!-- ダメな例: http://localhost:3000 --> <!-- ダメな例: localhost:3000 --> <!-- ダメな例: 192.168.56.1 --> <!-- ダメな例: 192.168.56.1:3000 --> <dict> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>
PlayGround
アプリ全体のビルドをせずにViewや関数だけを試したりできるSwiftの実行環境です。
ViewをPlayGroundで表示して試したい時は、
import UIKit import XCPlayground class CustomView: UIView { // Viewの実装 } val testView = CustomView() XCPShowView("Some ID", testView)
のように、XCPShowView
メソッドを使います... と書いてあったのですが、 Swift 2.1の頃に XCPlaygroundPage
を使うように変わり、XCPShowView
メソッドはdeprectedになっていました。
参考: http://qiita.com/koishi/items/e78f8b852d5f7ae8d125
実際使っている様子は下記です。
TableView
リサイズマスク
これは実はInterfaceBuilderでやるのでは、と思ったのですが、一応設定をメモします。
let tableView = UITableView() tableView.frame = frame tableView.autoresizingMask = [ UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight, UIViewAutoresizing.FlexibleBottomMargin, UIViewAutoresizing.FlexibleLeftMargin, UIViewAutoresizing.FlexibleRightMargin, UIViewAutoresizing.FlexibleTopMargin ]
行のIndicatorの種類
// cellはUITableViewCellのインスタンス cell.accessoryType = UITableViewCellAccessoryType.None // 何もつけない cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator // そのセルの右側に「 > 」みたいなのをつける cell.accessoryType = UITableViewCellAccessoryType.DetailDisclosureButton // そのセルの右側に「(i) > 」みたいなのをつける cell.accessoryType = UITableViewCellAccessoryType.Checkmark // そのセルの右側にチェックマークをつける. Noneと切り替え?して使う?
NavigationController
- NavigationControllerを使いたいViewControllerはStoryBoardでNavigationControllerを追加
- NavigationControllerの戻るボタンに入る文字はひとつ前のスタックのViewControllerのタイトル
UIPickerViewを使う時に実装するプロトコルについて
UIPickerViewは要素が輪のようになっていてクルクル回して選択するUIです。
UIPickerView - UIKit | Apple Developer Documentation
- UIPickerViewDelegateについて
func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat
で1行の高さfunc pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView
で1行分のViewを作成func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
でピッカーの要素が
- UIPickerViewDataSourceについて
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
で、行数を返すメソッドを返すfunc numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int
で、コンポーネント数を返すが基本は1でよさそうです