質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

2回答

6615閲覧

[Swift]Viewから別のViewの関数を呼び出したいです

Hisana

総合スコア17

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2017/07/01 11:06

###実現したいこと
iOSでSlideMenuControllerSwiftを使用したアプリを作成しています。
Swift3です。

SlideMenuControllerSwiftを使用して画面の左にスライドメニューを作成し、
その中でUITableViewを使用してメニュー項目を作成しています。

上記で作成したメニュー項目を選択時にメインのViewに定義した関数を呼び出したいのですがうまくいきません。。。

LeftViewControllerのコメントの箇所からMainViewControllerのtest()を呼び出したいです。

###該当のソースコード
AppDelegate.swift

swift

1import UIKit 2import SlideMenuControllerSwift 3 4@UIApplicationMain 5class AppDelegate: UIResponder, UIApplicationDelegate { 6 7 var window: UIWindow? 8 9 10 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 11 let storyboard = UIStoryboard(name: "Main", bundle: nil) 12 let mainVC = storyboard.instantiateViewController(withIdentifier: "Main") 13 let leftVC = storyboard.instantiateViewController(withIdentifier: "Left") 14 let navigationController = UINavigationController(rootViewController: mainVC) 15 let slideMenuController = SlideMenuController(mainViewController: navigationController, leftMenuViewController: leftVC) 16 17 self.window?.rootViewController = slideMenuController 18 self.window?.makeKeyAndVisible() 19 return true 20 } 21}

SlideViewController.swift

swift

1import UIKit 2import SlideMenuControllerSwift 3 4class SlideViewController: SlideMenuController { 5 6 override func awakeFromNib() { 7 let mainVC = storyboard?.instantiateViewController(withIdentifier: "Main") 8 let leftVC = storyboard?.instantiateViewController(withIdentifier: "Left") 9 let navigationController = UINavigationController(rootViewController: mainVC!) 10 mainViewController = navigationController 11 leftViewController = leftVC 12 super.awakeFromNib() 13 } 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 } 18}

LeftViewController.swift

swift

1import UIKit 2 3class LeftViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 @IBOutlet weak var tableView: UITableView! 6 var menus = ["メニュー1","メニュー2","メニュー3"]; 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 } 11 12 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 13 return menus.count 14 } 15 16 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 17 let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) 18 cell.textLabel!.text = menus[indexPath.row] 19 return cell 20 } 21 22 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 23 closeLeft() 24 tableView.deselectRow(at: indexPath, animated: true) 25 // 26 // ここでMainViewControllerのtest()を呼びだしたいです。 27 // 28 } 29}

MainViewController.swift

swift

1import UIKit 2import SlideMenuControllerSwift 3 4class MainViewController: UIViewController { 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 self.navigationController?.navigationBar.isTranslucent = false 9 self.navigationController?.navigationBar.barTintColor = UIColor.blue 10 self.navigationController?.navigationBar.tintColor = UIColor.white 11 } 12 13 func test() { 14 print("test") 15 } 16}

###試したこと
いろいろなサイトを参考にDelegateを使った呼び出しをしてみようかと試みましたがどれもうまくいきませんでした。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Delegateを使った呼び出しをしてみようかと試みましたがどれもうまくいきませんでした

Protocolが理解できてないっぽいのはひとまずおいといて、、、
mainVCのスコープを広げてしまえばやりたいことはできるでしょう。

SlideViewController.swift

Swift

1import UIKit 2import SlideMenuControllerSwift 3 4var mainVC:MainViewController! 5 6class SlideViewController: SlideMenuController { 7 8 override func awakeFromNib() { 9 //let mainVC = storyboard?.instantiateViewController(withIdentifier: "Main") 10 mainVC = (storyboard?.instantiateViewController(withIdentifier: "Main"))! as! MainViewController 11 let leftVC = storyboard?.instantiateViewController(withIdentifier: "Left") 12 let navigationController = UINavigationController(rootViewController: mainVC!) 13 mainViewController = navigationController 14 leftViewController = leftVC 15 super.awakeFromNib() 16 } 17 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 } 21} 22

LeftViewController.swift

LeftViewController.swift

1import UIKit 2 3class LeftViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 @IBOutlet weak var tableView: UITableView! 6 var menus = ["メニュー1","メニュー2","メニュー3"]; 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 } 11 12 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 13 return menus.count 14 } 15 16 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 17 let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) 18 cell.textLabel!.text = menus[indexPath.row] 19 return cell 20 } 21 22 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 23 closeLeft() 24 tableView.deselectRow(at: indexPath, animated: true) 25 // 26 // ここでMainViewControllerのtest()を呼びだしたいです。 27 // 28 29 mainVC.test() 30 31 } 32} 33

AppDelegate内のコードがいまいち理解できませんでした。なんとなく不要な感じがします。

投稿2017/07/20 00:59

fromageblanc

総合スコア2724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

投稿2017/07/13 17:48

ykws

総合スコア1236

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問