Swift:Storyboardを使わないで、コーディングのみで画面を立ち上げる(SceneDelegate使用しない)

今回はStoryboard無しで、コーディングで画面を立ち上げていきたいと思います。

ここではいつでも立ち上げられるように備忘録として残していきます。

 

■Storyboard無しのメリット/デメリット

*少し長くなるので、やり方をすぐに知りたい方は飛ばしてください。

個人的に感じたことを書いていこうと思います。機能性に関することはわかりませんので、もし詳しく知りたい方は他の方の記事等をお読みください。

 

【メリット】

・分散しない、統一性がある。

Storyboardを使用しているとUI部品など(Button、Label、TextField、ImageView等)はOutlet接続してプロパティ宣言はできるものの、その中の設定はStoryboardでされており、ソースコード(エディタエリア)からは把握できないので、Storyboardのユーティリティエリアを確認する手間があります。

設定の例:ボタンの色、ラベルの文字列の色、AutoLayoutなど

 

コーディングのみだと、例えば「名前と色が違うけど、あとは同じ設定のボタン」とうような場合、extensionやクラスで骨格だけ作成して使い回すことができます。また初心者だと難しく見える「引数」の勉強にもなります。

またAutoLayoutは一度骨格を作成すれば数値を入れるだけなので、他のXcodeプロジェクトでも使い回すことができ、非常に便利だと感じました。

僕自身StoryboardでのAutoLayout設定は正直苦手でしたが、コーディングでスムーズに配置設定ができるようになりました。

 

【デメリット】

・パッと見でわからない。

Storyboardがあれば、どんなアプリなのか?の全体感が直ぐに把握できるのですが、Storyboardが無いと、ソースコードを読んでから大凡の想像をしていく必要があります。

 

■画面の立ち上げ

それではStoryboard無しでの立ち上げをしてきます。

 

まず使わないMain.Storyboardを削除します。

f:id:SumJun-Blog:20210524114004p:plain

今回はSceneDelegateも使用しないので、全てコメントアウトします。

f:id:SumJun-Blog:20210524120635p:plain

続いて、AppDelegateを編集します。

下記画像の赤線と四角い赤線内の記述をします。

*window?.rootViewController = 「起動して最初に表示させたいViewControllerのインスタンス」を記述することで画面表示させることができます。

*window?.makeKeyAndVisible()この記述が無いと起動しても画面は真っ暗のままです。

そして丸く囲んである赤線内は使用しないので、コメントアウトします。

f:id:SumJun-Blog:20210524120701p:plain

次に、「TERGETS」の「Main Interface」に記載されている「Main」を削除します。これがあるとMain.Storyboadから始める設定になってしまいますので。

f:id:SumJun-Blog:20210524120737p:plain

残るは、「info.plist」の「Application Scene Manifest」を削除します。

この中にある「Storyboard Name」を削除するだけでも大丈夫です。

f:id:SumJun-Blog:20210524114029p:plain

あとはViewControllerをお好みで編集します。今回は背景色を設定します。

これでシミュレータ実行すると無事、画面が表示されました!

f:id:SumJun-Blog:20210524120800p:plain

とりあえず画面を立ち上げることができました。😃

また今回はSceneDelegateをコメントアウトしましたが、次回ではSceneDelegate に記述をして画面を立ち上げる方法を書いていきたいと思います。

理由としましては、Xcodeプロジェクト内で扱う内容によって今回の方法で立ち上がらない場合もあったためです。😅

 

以上、ここまで見ていただきありがとうございました!

Swift:Maps SDK for iOSでAPI取得からGoogle Maps(グーグルマップ)表示まで

今回はAPIを取得してGoogleMapsを表示する方法を書いていこうと思います。

というのも、やり方を忘れる→もう一度調べる→実装完了と毎回調べるのが面倒なので、備忘録として残すかたちになります。😅

初めての方は参考になれば幸いです。

 

■Podfileの作成とGoogleMapsのインストール

まず該当プロジェクトのターミナルを開きます。

f:id:SumJun-Blog:20210524070029p:plain

pod init」と入力してPodfileを作成します。

*もしCocoaPodsのインストールができていなければ、まずはそのインストールからお願いします。やり方は検索すればすぐに出てくるはずです。

f:id:SumJun-Blog:20210524070035p:plain

プロジェクトフォルダの中に作成したPodfileを開き、「pod 'GoogleMaps'」と入力して保存しましょう。

f:id:SumJun-Blog:20210524070100p:plain

f:id:SumJun-Blog:20210524070110p:plain

そして先ほどの該当プロジェクトのターミナルをまた開き、「pod install」と入力しPodfileで入力したことをインストールします。下記画像のように黄緑文字でインストール完了のメッセージが出てきたら、ターミナルを閉じましょう。

*初めてPodfileとターミナルを利用される方は、二つとも似ているように見えて区別に混乱するかもしれませんが慣れていきましょう。僕も最初は混乱してました、、、😅

f:id:SumJun-Blog:20210524070118p:plain

 

APIの取得(キー作成)

次はAPIを取得していきます。

 

(1)プロジェクトの作成

そのために「Google Cloud Platform」で新規プロジェクトを作成しましょう。

*もしアカウント未登録の場合はまず登録からお願いします。

f:id:SumJun-Blog:20210524070123p:plain

f:id:SumJun-Blog:20210524070128p:plain

 

(2)APIの有効化

プロジェクトを作成したら、ホームのサイドバーの「APIとサービス」→「ライブラリ」と進んでいきましょう。

f:id:SumJun-Blog:20210524070142p:plain

そこに各種APIがあり、「Maps SDK for iOS 」をクリックします。

f:id:SumJun-Blog:20210524070151p:plain

開いたら、赤い枠で囲った部分を「有効」にします。

*これが有効になっていないと、実装しても使用できません。

f:id:SumJun-Blog:20210524074341p:plain

*(2)と(3)はもしかしたら逆かもしれません。また有効化を先にしたとしても、そこからAPIキー作成の画面に移動できるかもしれません。曖昧で申し訳ありません🙇‍♂️

 

(3)APIキーの作成

APIキーの作成していきます。

ホーム→「APIとサービス」→「認証情報」→「+認証情報の作成」→「APIキー」と進んだいきます。

f:id:SumJun-Blog:20210524073941p:plain

すると、自動でキーを作成し下記画面のように表示されます。そこから「キーを制限」をクリックし、APIを使用する対象のXcodeプロジェクトなどを設定します。

f:id:SumJun-Blog:20210524070205p:plain

下記画面が表示されますので、今回はiOSアプリにチェックをし、対象のXcodeプロジェクトのバンドルIDをコピペしましょう。

f:id:SumJun-Blog:20210524070211p:plain

*バンドルIDは下記画像の箇所に記載されています。

f:id:SumJun-Blog:20210524070218p:plain

入力が終わったら、完了ボタンなどを押して閉じましょう。

もう一度ホーム→「APIとサービス」→「認証情報」と進んでいくと下記のように作成したAPIキーが表示されているはずです。

このキー値をXcodeプロジェクトにコピペします。

*キー値の横の四角いマークをクリックすればコピーできます。

*「APIキー1」の左に緑でチェックマークが入っていることを確認してください。この表示になっていないと恐らく使用できないと思いますので、有効化の確認、バンドルIDの入力漏れがないかなど再確認しましょう。

f:id:SumJun-Blog:20210524070232p:plain

 

■マップの実装

Xcodeプロジェクトを開いたら、AppDelegateファイルにて下記画像の赤線部分を追加していき、先ほど作成したAPIキー値をコピペします。

GMAServices.provideAPIKey("ここにコピーしてきたAPIキー値")

f:id:SumJun-Blog:20210524070238p:plain

次はViewControllerにてマップを表示させるコーディングをしていきます。

*最初に映し出す位置を指定してマップを表示するコーディングのみです。

f:id:SumJun-Blog:20210524070244p:plain

 

シミュレータで実行すると無事、表示されました!😃

f:id:SumJun-Blog:20210524070250p:plain

 

以上、見ていただきありがとうございます。

Xcodeが開かない時の対処方法

今回はXcodeを起動しても中々開かない状態の対処方法を書いていきます。

他の方も書かれている対処方法と一緒ですが、記事が少なかった印象だったので書くことを決めました。

Xcodeを利用されている方でしたら、誰しもが経験すると思いますので参考になれば幸いです。

 

Xcodeまたはプロジェクトを開いたら、普段は下記画像のように画面に表示されると思います。

f:id:SumJun-Blog:20210524061740p:plainf:id:SumJun-Blog:20210524061745p:plain

 

しかし偶にこれが中々開かない時があり、渦巻き状態で止まってしまうことがあります。一旦Xcodeを閉じたり、パソコンの再起動をしても変わりませんでした。

いつになったら開くのやら、、、😔

 

そこで対処方法の一つが「ファイルの削除」です。

下記に従って、一部のファイルを削除することで改善できました!

 

まずFinderにて「〇〇.xcodeproj」を右クリックします。

*「〇〇.xcworkspace」ではありません。

f:id:SumJun-Blog:20210524061750p:plain

そして「パッケージの内容を表示」をクリックします。

 

f:id:SumJun-Blog:20210524061756p:plain

中身の「project.xcworkspace」をゴミ箱に入れて削除します。

このファイルはなくても、Xcodeやプロジェクトを開いて作業する上で支障は来たしませんでした。

f:id:SumJun-Blog:20210524061815p:plain

 

これでもう一度Xcodeやプロジェクトを開いてみると、無事に開くことができるはずです。私はこの方法で開くことができました!😃

 

以上、見ていただきありがとうございました。

Swift:UIScrollViewを使った縦スクロールの実装方法(Main.Storyboardのみ操作)

今回はUIScrolleViewを使って縦スクロールの実装方法を備忘録として残していきます。

 

細かい部分の理由については私も詳しくは理解できていませんので、「とりあえずスクロールできた」という方法を書き残していきます。

 

今回はMain.Storyboardのみで作業していきます。

まずLibraryを開いてUIScrollViewをUIViewの上に設置します。

f:id:SumJun-Blog:20210326142727p:plain

UIScrollViewをSafe Areaのサイズに合わせてピンを引っ張ります。

f:id:SumJun-Blog:20210326142948p:plain

f:id:SumJun-Blog:20210326143104p:plain

f:id:SumJun-Blog:20210326143149p:plain

その後AutoLayoutで上下左右を「0」に設定します。

ここでUIScrollViewでエラーが出ますが今は無視します。

f:id:SumJun-Blog:20210326143320p:plain

f:id:SumJun-Blog:20210326143500p:plain

 

次はUIViewをUIScrollViewの上に設置します。

f:id:SumJun-Blog:20210326143527p:plain

下の画像のようにUIViewをUIScrollViewのサイズに合わせてピンを引っ張ります。

f:id:SumJun-Blog:20210326143622p:plain

続いて、UIViewのAutoLayoutを設定します。先ほどと同じように上下左右「0」に設定するのですが、ここで注意があります。

下の画像のように上下左右のプルダウンボタン🔽を押して、対象を「Scroll View(current distance = 0)」に✅を入れてください。

f:id:SumJun-Blog:20210326143826p:plain

「Frame Layout Guide(current distance = 0)」にしたままだと、UIScrollViewのエラーは解消されず、スクロールできない状態になってしまいます。おそらくUIScrollViewの外側の枠に固定してしまうので動かない状態になってしまうためだと思います。詳しい理由は他で調べてみてください。

 

次はUIScrollViewとUIViewの横幅を等しくし、固定します。

下の画像のようにViewから「control」キーを押しながらドラッグ&ドロップします。

f:id:SumJun-Blog:20210326145132p:plain

そしたら、下の画像のように選択リストが表示されますので、「Equal Widths」を選択します。

これで横幅のエラーの解消とともに縦方向にのみスクロールできるようになります。

f:id:SumJun-Blog:20210326145531p:plain

 

今度はUI部品を設置します。

今回はUILabelとUIButtonを設置します。 

f:id:SumJun-Blog:20210326145723p:plain

UILableのAutoLayout

上左右を設定

f:id:SumJun-Blog:20210326145902p:plain

UIButtonのAutoLayout

上下左右を設定

f:id:SumJun-Blog:20210326150012p:plain

 

UI部品の上下の制約がついたことで、UIScrollViewの高さの制約が決まったのでエラーが解消されました。

f:id:SumJun-Blog:20210326150117p:plain

 

あとはUILabelにテキストを記述していきます。

行は複数に表示されるようユーティリティエリアのAttributes inspectorの「Lines」を「0」にします。そしてテキトーに記述します。

f:id:SumJun-Blog:20210326150730p:plain

改行したい場合は、「control」+「Q」+「Enter」でできます。

今回はしてません。

f:id:SumJun-Blog:20210326151052p:plain

これで終わりです!!

 

出来上がりはこんな感じです!!(動画じゃなくてごめんなさい🙇‍♂️)

f:id:SumJun-Blog:20210326151315p:plain

f:id:SumJun-Blog:20210326151341p:plain

無事できました!!😃

 

見ていただいてありがとうございました!

Swift:入力した値を画面遷移先へ値渡しする方法

こんにちは!😃

Swift言語の勉強をし始めて、約2ヶ月になる初心者です。

 

今回は入力した値を遷移先に渡す方法の一例を書いていこうと思います。

 

今では簡単にできることですが、最初は各々のメソッドや変数などがどのような存在でどのように作用しているのか中々理解できず、苦労しました。😫

これから始める方に少しでもお役に立てれば嬉しいです!

  

まずはMain.storyboardでUI部品を設置していきます。

f:id:SumJun-Blog:20210321230045p:plain

Laibraryを開いて、ViewControllerの任意の位置にUITextField、UIButtonをドラッグ&ドロップして設置します。

f:id:SumJun-Blog:20210321230256p:plain

UITextFieldをOutlet接続します。

Outlet接続することにより、Main.storyboard上のUITextFieldとコードを記述するエディタエリアをつなげます。これは遷移先に値を渡す処理をエディタエリアにて記述するために必要な接続になります。

 

次は遷移先のViewControllerを設置します。

同じくLaibraryよりドラッグ&ドロップしていきます。

f:id:SumJun-Blog:20210321230537p:plain

設置したViewControllerにUIViewControllerを継承し、他のViewControllerと区別するための名前を実装していきます。

ナビゲーターエリアで右クリックして「New File...」をクリックします。

f:id:SumJun-Blog:20210321231059p:plain

今回はUIViewControllerを継承するので「Cocoa Touch Class」を選択して「Next」

f:id:SumJun-Blog:20210321232323p:plain

名前は任意で記述します。今回は「ConsequenceViewController」とします。

f:id:SumJun-Blog:20210321232520p:plain

先ほど設置した遷移先のViewControllerの下の画像左の赤線部分をクリックして、ユーティリティエリア上部バーの「identity inspector」(赤線)をクリックし、Classを選択します。リスト内に先ほど自身で決めた名前があるので、選択します。

これで設置した遷移先のViewControllerはUIViewControllerを継承できました。

f:id:SumJun-Blog:20210321233236p:plain

 *継承とはいろいろな機能が詰まった工具箱を持たせたみたいな感じです。今回UIViewControllerという工具箱を持たせたことによって、その中にあるいろいろな機能を使用することが可能になります。

 

 

今度は、画面遷移処理です。今回はSegueという遷移方法を実装します。

画像の左がViewController(遷移元)、右がConsequenceViewController(遷移先)です。

遷移元のUIButtonを「control」キーを押しながら、遷移先のView(どこでもいい)にドラッグ&ドロップします。そうすると「Action Segue」と表示がでるので、その中の「Show」を選択します。これで遷移元のUIButtonをタップしたら、遷移するという動作ができるようになりました。

f:id:SumJun-Blog:20210321234843p:plain

 

続いて、遷移先から遷移元に戻る処理を実装します。

その前に遷移先にUILabel(値を受け取る文字列)とUIButton(タップして遷移元に戻る)をMain.storyboardで設置します。

f:id:SumJun-Blog:20210321235836p:plain

それでは遷移元に戻る処理を実装します。

まず遷移元のUIButtonを「control」キーを押しながらソースコード上にドラッグ&ドロップします。

Connectionを「Action」に選択します(おそらく設置箇所から自動でなっているはず。)。ボタン名を任意で決めて設置します。

f:id:SumJun-Blog:20210322000353p:plain

設置した後、画像の赤線部分を「Any」→「UIStoryboardSegue」に変更します。

ViewController.swift

f:id:SumJun-Blog:20210322000838p:plain

次はMain.Storyboard上で遷移先のUIButtonを「control」キーを押しながら、画像のようにドラッグ&ドロップします。*画像みづらくすみません、、、。😅

f:id:SumJun-Blog:20210322090603p:plain

そうすると、下の画像のように遷移元のエディタエリアでAction接続したOkButtonが表示されます。これをクリックしたら、遷移先から遷移元に戻る処理は完了しました。

f:id:SumJun-Blog:20210322091053p:plain

 

最後に、

遷移元(ViewController):遷移先に値を渡す処理を記述

遷移先(ConsequenceViewController):値を受け取って画面に反映する処理を記述

をしていきます。

 

まず、遷移先で値を受け取る処理(準備)をします。

・値を表示するUILabelをOutlet接続します(名前は任意、今回はreceiveLabel)。

・値を受け取る変数を設定します(プロパティ宣言、receiveValue)。*1)

・受け取った値をUILabelに表示する処理を記述します。*2)

ConsequenceViewController.swift

f:id:SumJun-Blog:20210322091929p:plain

*1)var receiveValue: String = ""でString型と指定することで、受け取る値を明確にします。""はreceiveValueがどんな値を持った変数なのかを宣言するとともに、入力がない場合も考慮してこのような記述をしております。この他にもvar receiveValue: String?と記述することも可能です。「?」を入力することでオプショナル型(nil=入力がない場合も可能)になります。

*2)receiveLabel.textの「.text」で「文字列を代入する」という意味になります。そして変数を""内に記述する時は\( )をつけて記述します。

もしプロパティ宣言でvar receiveValue: String?という表現をした場合は、こちらではreceiveLabel.text = "ハロー、\( receiveValue! )!"と「!」をつけ、アンラップします。

アンラップについては検索して調べてみてください。

 

次は遷移元で値を渡す処理を下の画像のように記述します。

渡す遷移先を取得し、遷移先のreceiveValueにtextFieldで入力した内容を「.text!」をつけて代入(渡す)します。

f:id:SumJun-Blog:20210322091425p:plain

これで完成です。

 

こちらViewControllerの全体です。

f:id:SumJun-Blog:20210322094412p:plain

ConsequenceViewControllerの全体です。

f:id:SumJun-Blog:20210322094658p:plain

こちらシミュレータの一部画像になります。

f:id:SumJun-Blog:20210322094841p:plainf:id:SumJun-Blog:20210322094914p:plain

 

以上が遷移元で入力した値を遷移先に渡す一例です。

最初でも話たのですが、今では簡単に思えても最初の頃はこんな簡単なことでも中々理解できず、時間がかかりました。

僕と同じように初めて右も左もわからない方のお役に少しでも立てれば嬉しいです!😃

 

見ていただいてありがとうございました!