ダーヤス.com プレミアム

ダーヤス.comにようこそ。プレミアムな情報で、ワークライフバランスの充実を図りませんか。

[Xcode][Swift]画面遷移と移行先のViewControllerで処理を書く方法

   

[Xcode][Swift]画面遷移と移行先のViewControllerで処理をする方法

iOSアプリの画面上でタップされても処理をさせないみたいなことをさせる際には、面倒くさいけど別途ViewController.swiftを新規作成してそっち側で処理をさせたりすると便利だなと思ってそのコーディング方法についてメモしておきます。

参考にさせていただいたのはこちら

個人的には、1.の「同じstoryboard上に配置」だけでも充分に複雑なアプリ作ることもできるし、管理上もストーリーボード増やさない方が簡単だと思います。

バージョンはswift3,XcodeはVersion 8.3.2 (8E2002)です。

ViewController.swiftファイルの新規作成

ViewController.swiftファイルの新規作成

まずはViewControllerファイルの新規作成。

普通に新しいファイルを作る時と同様にメニューバーで「File」-「New」-「File」を選択します。

ViewController.swiftファイルの新規作成

「iOS」-「Source」-「Cocoa Touch Class」を選択してNext。

ViewController.swiftファイルの新規作成

Classの名前は適当に「NewViewController」と設定。

ViewController.swiftファイルの新規作成

デフォルトのディレクトリのままいじらずに「Create」。

ViewController.swiftファイルの新規作成

これで左側のナビゲータエリアに新しいViewControllerファイルの「NewViewController.swift」が生成されます。

Main.storyboard上でView Controllerを追加配置

私はストーリーボード上で作業するのが苦手で、各部品とか要素とかの配置等を全部コードで書きたいと思っているので、ここからの作業は全部コーディングでできるのかと思っていました。

しかしながら上記リンク先のサイトによれば、NewViewController.swiftと遷移先の「View Controller」との間の関連付けを「Main.storyboard」上でやらなければいけない模様。

Main.storyboard上でView Controllerを追加配置

「Main.storyboard」ユーティリティエリアの下の部分から「View Controller」の部品をドラック&ドロップでエディタエリアまで持ってきます。

Main.storyboard上でView Controllerを追加配置

このView Controllerで、なんと呼ぶんでしょうか、上のメニューバーの一番左の丸い形のものをクリックすると、ユーティリティエリアに「Custom Class」と「Identity」という項目が表示されます。

ここでClassにさっき新規追加したswiftファイルと同じ名前の「NewViewController」と入れます。

あと、Storyboard IDに適当に「next」などと入れておきます。

コーディングで遷移させる

「ViewController.swift」が初期のビューコントローラで、「NewViewController.swift」に画面移行することを想定します。

そしてボタン押下時に呼び出されるメソッド内などで以下の3行を書いておくと、そのボタン押下時に画面遷移がなされます。

let storyboard: UIStoryboard = self.storyboard!
let nextView = storyboard.instantiateViewController(withIdentifier: "next")
present(nextView, animated: true, completion: nil)

2行目の「withIdentifier」には先ほど設定した「Storyboard ID」と同じものを設定するようです。

あとは、移行先の処理は「NewViewController.swift」に書いておけば、移行先の画面での処理が全てコーディングだけで行えます。

なお、「NewViewController」から初期画面に戻りたい場合は、「NewViewController.swift」側の所定の場所に以下の1文を書いておけば戻れる模様。

        self.dismiss(animated: true, completion: nil)

私は、透明なNewViewControllerを最初のViewControllerの上に被せることで、ボタンタップ等の処理を透過させないようにするとかでよくViewControllerの階層構造を作ったりするのですが、まあまあ便利な機能です。

あとは、バナー広告とか消したい場合でも消せない場合があったりするので、そういった場合には、新しい側のViewControllerで広告を呼び出しておいて、広告を消したい場合には新しい側のViewControllerごと削除するとか。

 - アプリ開発