カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

UISearchControllerの警告

UISearchControllerを使っていると、ViewControllerが破棄されるタイミングで以下のような警告が出てきました。

[Warning] Attempting to load the view of a view controller while it is deallocationg is not allowed and may result in undefined behavior (<UISearchController: ...>)

どうやらViewControllerが破棄されるタイミングでSearchControllerも破棄してやらないといけないようです。

以下のコードを追加したら解決しました。

deinit {
    searchController.view.removeFromSuperview()
}

また、実際に検索をして別画面に遷移した際に、UISearchControllerの表示が残ったままになる問題が発生しました。
キャンセルをタップすれば消すことができますが、それでは気持ちが悪いので解決させたい。
解決方法は遷移元のUIViewControllerのviewDidonLoadに以下の1行を追加するだけです。

definesPresentationContext = true

私の場合、原因はUINavigationControllerを使っていたことでした。

こちらで詳しく解説されています。
参考URL: http://qiita.com/color_box/items/d13b04a88587088019af

Xcode: 8.3.2
Swift: 3.1
OS: Sierra 10.12

1,769 views

UITableView スワイプでセルを削除する

簡単に実装できるので楽ですね。

UITableViewをOutlet接続しておきます。

@IBOutlet weak var table: UITableView!

削除処理の実装

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        table.deleteRows(at: [indexPath], with: .fade)
    }
}

Xcode: 8.3.2
Swift: 3.1
OS: Sierra 10.12

3,112 views

ContainerView 親ビューから子ビューを操作したい

iOSのアプリ開発でコンテナビュー(ContainerView)が便利なので使ってみました。
その際、子ビューから別の子ビューのメソッドを実行して操作したい、ということがありました。

やってみるとそこまで難しくなかったので、簡単にご紹介したいと思います。

パターンとして、親ビューから子ビュー、子ビューから親ビュー、子ビューから別の子ビューの3通りをご紹介します。

親ビューから子ビュー

子ビュー側

class ChildController: UIViewController {
    func test() {
        //code
    }
}

親ビュー側

let targetVC = childViewControllers[0] as! ChildController
targetVC.test()

子ビューから親ビュー

親ビュー側

class ParentController: UIViewController {
    func test() {
        //code
    }
}

子ビュー側

let parentVC = self.parent as! ParentController
parentVC.test()

続きを読む…»

11,144 views

スクリーンショットを添付してメール送信

MFMailComposeViewControllerを使ってメールを作成します。

まずはMessageUIをインポートします。

import MessageUI

デリゲートを追加します。

class sample: UIViewController, MFMailComposeViewControllerDelegate {
func mail(subject: String, mailbody: String) {
    let composeVC = MFMailComposeViewController()
    composeVC.mailComposeDelegate = self

    composeVC.setToRecipients(["送信先メールアドレス"])

    composeVC.setSubject(subject)

    composeVC.setMessageBody(mailbody, isHTML: false)

    let layer = UIApplication.shared.keyWindow?.layer
    let scale = UIScreen.main.scale
    UIGraphicsBeginImageContextWithOptions((layer?.frame.size)!, false, scale)

    layer?.render(in: UIGraphicsGetCurrentContext()!)
    let screenshot = UIGraphicsGetImageFromCurrentImageContext()
    let image = UIImageJPEGRepresentation(screenshot!, 1.0)
    UIGraphicsEndImageContext()

    composeVC.addAttachmentData(image!, mimeType: "image/png", fileName: "screenshot.png")

    self.present(composeVC, animated: true, completion: nil)
}

デリゲートで必要なメソッド
メール送信やキャンセルの操作を受けて実行されます。

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
    controller.dismiss(animated: true, completion: nil)

    switch result {
    case .sent: //送信
            break
    case .saved: //保存
            break
    case .failed: //失敗
            break
    case .cancelled: //キャンセル
            break
    default:
        break
    }
}

Xcode: 8.3.2
Swift: 3.1
OS: Sierra 10.12

1,680 views

GoogleMapの操作 for iOS

GoogleMapの位置や、ズームレベルを変更します。

指定した座標に位置を設定
座標はCLLocationCoordinate2Dで渡します。

let update = GMSCameraUpdate.setTarget(coordinate)

GoogleMapを更新する

mapView.moveCamera(update)

アニメーションで更新する

mapView.animate(with: update)
その他の操作
ZoomIn ズームレベルを1.0拡大
ZoomOut ズームレベルを1.0縮小
ZoomTo ズームレベルを指定します。

それ以外の操作は公式リファレンスを参照ください。
https://developers.google.com/maps/documentation/ios-sdk/views?hl=ja

Xcode: 8.3.2
Swift: 3.1
OS: Sierra 10.12

1,556 views