20201028のSwiftに関する記事は4件です。

Alertを起動中1回のみ表示・二度と表示しない機能

ダイアログによくある選択肢

パターン①OK
--押下後、起動中はもう表示しない。次回起動したら、また表示する

パターン②二度と表示しない
--押下後、もう表示しない再起動しても表示しなくなる。
 アプリをアインインストール、再度インストールしたら、また表示する

それぞれを実装してみましたのでメモしておきます。

アプリ起動、ダイアログのOKの押下後、FlagをTrueにして起動中に表示させなくなるための準備

DialogHelper
class DialogHelper {

    static let shared = DialogHelper()
    var dialogDidSee = false

    func getDialogStatus()->Bool{

        return dialogDidSee
    }

    func setDialogStatus(_ flag:Bool){

        dialogDidSee = flag
    }
}

アンインストールするまで二度と表示させないため
アプリ終了後も消えさせないデータ、ユーザの設定のデータを保存するUser Defaultsの準備

UserDefaultsKey
enum UserDefaultsKey: String {

    case dialogNoMore = "dialog_neverAgain"

    func initalValue<T>()-> T?{
        switch self{
        case .dialogNoMore:
            return false as? T

        default:
            return nil
        }
    }
}

ViewControllerでこのようにAlert作成
Alertを出すべきかどうかを判断、の二つのメソッドを作ります。

ViewController
    func showDialogIfNeed(){

        let didSee = DialogHelper.shared.getDialogStatus()
        let neverSee = UserDefaults.standard.bool(forKey: UserDefaultsKey.dialogNoMore.rawValue)

        if neverSee {
            return
        }else{
            if didSee {
                return
            }else {
                createDialog()
            }
        }
    }

    func createDialog(){

        let alert:UIAlertController = UIAlertController(title: "Here is a message for you!", message: "", preferredStyle: .alert)

        let okAction:UIAlertAction = UIAlertAction(title: "OK", style: .default, handler: {
            (action:UIAlertAction!) -> Void in
            DialogHelper.shared.setDialogStatus(true)
        })

        let neverAgainAction:UIAlertAction = UIAlertAction(title: "Never remind me", style: .default, handler: {
            (action:UIAlertAction!) -> Void in
            UserDefaults.standard.set(true, forKey: UserDefaultsKey.dialogNoMore.rawValue)
        })
        alert.addAction(okAction)
        alert.addAction(neverAgainAction)

        present(alert, animated: true, completion: nil)
    }
ViewController
override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        showDialogIfNeed()
    }

動いてみて試したら、OKボタンとNeverAgainボタンがちゃんと動作しました。

ちなみにこのようなLayoutを作りました。
viewDidLayoutSubviews()を忘れずに気をつけよう。

ViewController
let label = UILabel()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.brown
        label.text = "Please see the Dialog"
        label.textAlignment = .center
        view.addSubview(label)
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        label.frame = view.bounds
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        showDialogIfNeed()
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【iOS14】「からペースト」通知が出る外部ライブラリまとめ

最新版では修正されている可能性がありますが、以下のライブラリでは「からペースト」通知が出ることがあるようです。
コメントいただければ未検証ですが、情報を追記していきます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift】Documentディレクトリのフルパスはビルドやアップデートの度に変更される罠

 Documentディレクトリのフルパスはビルドやアップデートの度に変更される事を知らずにハマってしまったので誰かの助けになればと思います。

Documentディレクトリのフルパスを取得

let documentPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].absoluteString

printしてみる

print(documentPath)

出力結果
file:///var/mobile/Containers/Data/Application/914B4E18-01A6-4538-9AD7-3B9887FE4B13/Documents

次にビルドを再度行い、Documentディレクトリのフルパスをprintした結果

出力結果
file:///var/mobile/Containers/Data/Application/A5A17321-C158-4A5B-B8C7-5CF53F0C78EF/Documents

パスのApplication下の数列を比べてみる

◆Application/914B4E18-01A6-4538-9AD7-3B9887FE4B13/Documents
◆Application/A5A17321-C158-4A5B-B8C7-5CF53F0C78EF/Documents

Application下の数列
914B4E18-01A6-4538-9AD7-3B9887FE4B13
A5A17321-C158-4A5B-B8C7-5CF53F0C78EF

ビルド(アップデート後)にこの数列が変更されているのがわかります。

まとめ

Documentディレクトリのフルパスをそのまま保存してデータの呼び出しに使うと、ビルドする度にURL先が見つからないという問題が発生してしまいます。
なので、ファイル名だけ保存して、その都度Documentディレクトリのフルパスを取得して繋げるというやり方で対応しました。

もし、他に何かいい対策があれば教えてください?‍♂️

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift初心者 Xcodeでのデバッグ術メモ

概要

この記事はプログラミング初心者である筆者の備忘録です。
随時追記予定。

Swiにおけるデバッグ方法まとめ

  • Break pointとは
  • LLDBコマンド
  • ビューデバッガ
  • 参考

Break pointとは

テスト中にbreake point を設定した行で処理を止めてくれる。
これを利用すると、1行ずつデバッグができる。
設定するには、下の画像のようにエディタ左端の数字をクリックするとチェックが付き設定できる。
スクリーンショット 2020-10-27 23.58.43.png

このまま実行すると下の画像のようにBreak pointで処理が停止し、デバッグエリアが出てくる。
デバッグエリアでコマンドを利用したりして色々デバッグができる。
スクリーンショット 2020-10-28 0.02.52.png

LLBDコマンド

LLBDとはソフトウェアデバッガの1つ(たぶん)。
デバッグエリアのコンソール画面でコマンドを打ち込んでデバッグを行う。

poコマンド

おそらくprint objectの略だと思われる。

po <変数>

で指定した変数の値を出力できる。便利である。
スクリーンショット 2020-10-28 0.14.03.png

expressionコマンド

expression <変数> = <値>

で指定した変数に任意の値を代入できる。poコマンドと組み合わせれば、いちいちビルドし直すことなくprintデバッグが可能。うれしい。
スクリーンショット 2020-10-28 0.18.21.png

ビューデバッガ

Xcode標準装備のView Hierarchy行う。直訳するとビューの階層。アプリ上のViewの階層構造を把握できる。
スクリーンショット 2020-10-28 0.22.06.png
上の画像中の赤丸で囲ったボタンをクリックすると起動する。
実はまだ使ったことがないのでここからは追々追記することにする。

参考

https://developer.apple.com/videos/play/wwdc2018/412

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む