読者です 読者をやめる 読者になる 読者になる

woshidan's blog

そんなことよりコードにダイブ。

UI用のクラスのプロトコルとWebViewなどについて

iOSお遍路 iPhone iOS UIView

内容

上の本を参考にiOSのUIViewと戯れています。

とりあえず、4章までやったので、ここまでで一区切り~~。

  • UI用のクラスを使うとき実装するプロトコルについて
  • 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の使い方について

読み込み中の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

実際使っている様子は下記です。

f:id:woshidan:20160802233426p:plain

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でよさそうです