2020/01/06 実務で学んだこと

【実務で学んだこと】 Diary

その日に覚えたこと、学んだこと、知ったこと、気になったこと等を日記のように書いていきます。

今回は 2020/01/06(月)に学んだことを書いていきます。

【Git】

間違えて消してしまったStashの戻し方

スタッシュを間違えて消してしまいました。

$ git stash drop [email protected]{2}
 Dropped [email protected]{2} (xxxxxxxxxxxxxxxx)

「git reset –hard」や「rebase」などを間違えて実行してしまった時は、「reflog」によって取り消せますよね。

しかし、スタッシュを消してしまった時はreflogで取り消すことができないので、以下のコマンドを実行することで戻すことができます。

$ git stash drop [email protected]{2}
Dropped [email protected]{2} (xxxxxxxxxxxxxxxx)

$ git cherry-pick -n -m1 (xxxxxxxxxxxxxxxx)

参考記事

【Swift】

UIViewControllerのViewを他のUIViewControllerで表示させる

以下のように、UIViewControllerのViewを他のUIViewControllerで使用したいという場面が出てきました。

ViewAのviewに、ViewBのviewを表示したい!!

今回はサンプルとして表示させたいUIViewControllerはViewAとし、使用したいUIViewControllerはViewBとします。

  1. viewBのインスタンスを作成
  2. ViewBをViewAの子として追加
  3. ViewBのviewをViewAのviewのsubviewに追加
  4. ViewBに対して処理の終了を通知する
import UIKit

// viewAにviewBを追加したい場合(同じstoryboard)
class ViewA: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 1. ViewBのインスタンスを作成
        let viewB = storyboard!.instantiateViewController(withIdentifier: "viewB") as! ViewB
        // 2. ViewBをViewAの子として追加
        self.addChild(viewB)
        // 3. ViewBのviewをViewAのviewのsubviewに追加
        self.view.addSubview(viewB.view)
        // 4. ViewBに対して処理の終了を通知する
        viewB.didMove(toParent: self)
    }
}
import UIKit

// viewAにviewBを追加したい場合(同じstoryboard)
class ViewA: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 1. ViewBのインスタンスを作成
        let viewB = storyboard!.instantiateViewController(withIdentifier: "viewB") as! ViewB
        // 2. ViewBをViewAの子として追加
        self.addChild(viewB)
        // 3. ViewBのviewをViewAのviewのsubviewに追加
        self.view.addSubview(viewB.view)
        // 4. ViewBに対して処理の終了を通知する
        viewB.didMove(toParent: self)
    }
}

上記のように記述することで、起動した時のViewAの画面(白い画面)にViewB(青い画面)が表示されます。

最初は addSubview だけでできると思っていたのですが、addSubview はUIViewのメソッドなので、UIViewControllerを追加したい場合はUIViewControllerを親子関係にする必要があるらしいですね!

参考にした記事ではaddChildViewController と記述されていましたが、Swiftのバージョンによって以下のように変更されているようです!

◉ Before:
self.addChildViewController(viewController)
viewController.didMove(toParentViewController: self)
↓
◉ After:
self.addChild(viewController)
viewController.didMove(toParent: self)

【実装MEMO】小さな所から試すSwiftコンバート対応の備忘録 – Fumiya Sakai – Medium より引用

参考記事

UIViewControllerのリロード

UIViewControllerをリロードしたい場面がでてきました!

UITableViewであれば tableView.reloadData とすればリロードができるのですが、UIViewControllerにはそのようなメソッドは無いそうようです。

ですが、以下のメソッドをリロードしたい場所で実行することで、リロードすることができます。

loadView()
viewDidLoad()

このメソッドはライフサイクルを理解することで、どのようにリロードされるかがわかると思います。

今回は以下の記事を参考に実装したので、こちらも確認してみてください!

【Swift】UIViewControllerの再読み込み・リロード(reload)。ViewDidLoadに戻りたい時。 | A.N.Variation

コードでのAutoLayoutの書き方

AutoLayoutをStroyboard上ではなく、コードで実装したい場面が出てきました。

NSLayoutAnchorを使用することで、コードのみでAuto Layoutを実装することができます。

以下の記事がとても参考になりました。

Auto Layoutをコードで書いてみた – Qiita