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

woshidan's blog

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

UIButton, UIAlertController, UITextView, UITextFieldあたりに触りました

iOSお遍路 iPhone iOS UIView

内容

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

  • 最初からSwiftでコードを書きたい時はSwiftでプロジェクトを作成する
  • Text用, 画像用のViewがあった話
  • Swiftのクラス定数っぽいものの名前
  • ボタンの種類
    • type: UIButtonType.System
    • type: UIButtonType.InfoDark
    • type: UIButtonType.InfoLight
    • type: UIButtonType.ContactAdd
    • type: UIButtonType.DetailClosure
  • ボタンを押したときのイベントの設定
  • アラートの種類
  • アラートのボタンの挙動の設定
  • AlertActionのハンドラーの引数としてのクロージャの利用例
  • UITextFieldについて
  • UITextViewでも文字編集可能にできる

最初からSwiftでコードを書きたい時はSwiftでプロジェクトを作成する

これまでObjective-CのプロジェクトにSwiftのクラスをちょいちょい書いて試してたんですが、プロジェクト作成時にObjective-CかSwiftかを選べるのでSwiftで書きたい時は、この時点で Swiftを選んだ方が楽です。

関連して少し調べてみたのですが、, Objective-CからSwift, SwiftからObjective-Cのクラスの参照については下記ブログ記事が参考になりました。

http://techblog.yahoo.co.jp/ios/swift-from-objc/

上記記事より手順だけ簡単にまとめると、

  • SwiftからObjective-Cを参照する場合はBridging Headerを用意して、そこに必要なクラスをimportする
  • Objective-CからSwiftを呼ぶ場合はビルド時に自動生成される.hファイルをimportする

となります。

Text用, 画像用のViewがあった話

String.drawAtPointメソッドや、UIImage.drawAtPointメソッドを見て、ひええ、となっていたのですが、LabelクラスやUIImageViewクラスがちゃんとありました。

少し UIImageViewをカスタマイズしたい時などに UIImage.drawAtPointメソッドなどを使うのかな、と思いました。

Swiftのクラス定数っぽいものの名前

タイププロパティといいます。

ボタンの種類

UIButtonはコンストラクタで指定するtypeで見た目が変化します。

type: UIButtonType.System

f:id:woshidan:20160728003518p:plain

type: UIButtonType.InfoDark

f:id:woshidan:20160728003515p:plain

type: UIButtonType.InfoLight

f:id:woshidan:20160728003517p:plain

type: UIButtonType.ContactAdd

f:id:woshidan:20160728003512p:plain

type: UIButtonType.DetailClosure

f:id:woshidan:20160728003513p:plain

何かミスったかもしれない、という感じなのですが、現場に入っていろいろ見てみようと思います。

Customが画像ボタン作るときに使うみたいでした。

let button = UIButton(type: UIButtonType.Cutom)
button.setImage(image, forState: UIControlState.Normal)

また、ボタンに表示される画像やテクストはそれが表示されるときのボタンの状態と一緒に指定します。

ボタンを押したときのイベントの設定

func onClick(sender: UIButton) {
  if sender.id == BTN_TARGET {
    // do something
  }
}

func makeButton() -> UIButton {
  let button = UIButton(type: UIButtonType.System)
  button.tag = BTN_TARGET // 適当なInt
  button.addTarget(self, action: "onClick:", forControlEvents: UIControlEvents.TouchUpInside)
  return button
}

button.addTarget(self, action: "onClick:", forControlEvents: UIControlEvents.TouchUpInside) のactionのコロンを忘れてあたふたしたのはいい思い出です。

UIControlEvents.TouchUpInsideはインタフェースビルダーで設定した覚えがあるのですが、どうなのでしょう。

アラートの種類

普通のアラート(コンストラクタで指定するpreferredStyleは UIAlertControllerStyle.Alert)とアクションシート(コンストラクタで指定するpreferredStyleは UIAlertControllerStyle.ActionSheet)があります。

アクションシートは下図のようなボタンが縦に並んだシートです。

f:id:woshidan:20160728004654p:plain

アラートのボタンの挙動の設定

alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
// 表示
self.presentViewController(alert, animated: true, completion: nil)

AlertActionのハンドラーの引数としてのクロージャの利用例

慣れるために眺めます。

alert.addAction(UIAlertAction(title: "Yes",
            style: UIAlertActionStyle.Default, handler: {(alert) in
                self.showAlert(nil, text: "Yesをクリック")
            }))

{ (クロージャのブロックに渡される変数名) in 計算 } のような感じです。

UITextFieldについて

HTMLでいうフォーム。ViewControllerにUITextFieldDelegateを実装させることで、フォーム内に入力された文字が変化したときの挙動を設定できます。また、UIKeyboardTypeでキーボードの種類を、returnKeyTypeでreturnキーにあるボタンのスタイルを決定できます。

UITextViewでも文字編集可能にできる

UITextViewでもその内部の文字の編集が可能です。UITextView#becomeFirstResponder()メソッドで編集を開始させ、UITextView#resignFirstResponder()で編集を終了させます。

UITextViewで入力された文字が変化したときの挙動を設定したい場合は、 UITextViewDelegateを実装します。

今日はここまでです。