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

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

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

Delegatesとは、オブジェクト指向型プログラミングにおいて、あるオブジェクトの操作を一部の他のオブジェクトに代替させる手法のこと。オブジェクトは他のデリゲートに頼って関数を実行することができます。

Swift

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

iPhone

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

Q&A

解決済

1回答

397閲覧

swift デリケードを用いたデータの受け渡しについて

kult0922

総合スコア7

Delegates

Delegatesとは、オブジェクト指向型プログラミングにおいて、あるオブジェクトの操作を一部の他のオブジェクトに代替させる手法のこと。オブジェクトは他のデリゲートに頼って関数を実行することができます。

Swift

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

iPhone

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

0グッド

0クリップ

投稿2018/04/18 06:47

編集2018/04/18 08:39

前提・実現したいこと

cancelボタンを押した時にAddItemViewControllerクラスのテキストをMasterViewControllerクラスにデリケードを使用して渡したい

発生している問題・エラーメッセージ

デリゲートで呼ばれるメゾットの内容が実行されない

エラーメッセージ エラーは出ていません

該当のソースコード

//データを渡すクラス
import UIKit
protocol AddItemViewControllerDelegate {
func addItemViewControllerDidCancel(modalText: String)
}

class AddItemViewController: UITableViewController {
var text:String = "aaa"
//delegate
var delegate: AddItemViewControllerDelegate?

@IBOutlet weak var textLabel: UITextField! override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } @IBAction func clickSaveButton(_ sender: Any) { NSLog("clickedSavebutton") } @IBAction func clickCancelButton(_ sender: Any) { self.delegate?.addItemViewControllerDidCancel(modalText: self.text) NSLog("clickedCancelbutton") }

}

//データを受けとるクラス
import UIKit
class MasterViewController: UITableViewController, AddItemViewControllerDelegate{

var detailViewController: DetailViewController? = nil var objects = [Any]() let vc = AddItemViewController() override func viewDidLoad() { super.viewDidLoad() self.vc.delegate = self//デリゲートをセット // Do any additional setup after loading the view, typically from a nib. navigationItem.leftBarButtonItem = editButtonItem //let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(insertNewObject(_:))) //navigationItem.rightBarButtonItem = addButton if let split = splitViewController { let controllers = split.viewControllers detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController } } override func viewWillAppear(_ animated: Bool) { clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed super.viewWillAppear(animated) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @objc func insertNewObject(_ sender: Any) { objects.insert(NSDate(), at: 0) let indexPath = IndexPath(row: 0, section: 0) tableView.insertRows(at: [indexPath], with: .automatic) } // MARK: - Segues override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "showDetail" { if let indexPath = tableView.indexPathForSelectedRow { let object = objects[indexPath.row] as! NSDate let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController controller.detailItem = object controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem controller.navigationItem.leftItemsSupplementBackButton = true } } } // MARK: - Table View override func numberOfSections(in tableView: UITableView) -> Int { return 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return objects.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) let object = objects[indexPath.row] as! NSDate cell.textLabel!.text = object.description return cell } override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { // Return false if you do not want the specified item to be editable. return true } override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { objects.remove(at: indexPath.row) tableView.deleteRows(at: [indexPath], with: .fade) } else if editingStyle == .insert { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. } } func addItemViewControllerDidCancel(modalText: String){ print(modalText) NSLog("addItemViewControllerDidCancel")//実行されたか確認 self.vc.dismiss(animated: true, completion: nil) }

}

### 試したこと 挙動を確認するためにNSLog("addItemViewControllerDidCancel")をaddItemViewControllerDidCancelに入れたが何も表示されなかったのでaddItemViewControllerDidCancel自体が呼び出されていない可能性があると思いますが原因が分からず困っています。キャンセルボタンを押すとclickedCancelbuttonのみ表示されてaddItemViewControllerDidCancelが表示されない状況となっています。 ### 補足情報(FW/ツールのバージョンなど) Swift version 4.1 ここにより詳細な情報を記載してください。

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

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

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

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

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

fuzzball

2018/04/18 07:00

なぜAddItemViewControllerのコードが二つあるのでしょうか?
kult0922

2018/04/18 07:06

分かりずらくてすいません。該当のソースコードは問題があると思われる部分を抽出したもので下のソースコードが全体のソースコードとなっています。
fuzzball

2018/04/18 07:10 編集

MasterViewControllerがAddItemViewControllerのインスタンスを扱っているコードが無いように見えるのですが、この二つはどういう関係にあるのでしょう?
kult0922

2018/04/18 07:14

AddItemViewControllerのデータをMasterViewControllerに渡したいだけなので特別な関係はないです
guest

回答1

0

ベストアンサー

delegateをセットして下さい。


swift

1//MasterViewController 2let vc = AddItemViewController() 3vc.delegate = self

投稿2018/04/18 07:03

編集2018/04/18 07:20
fuzzball

総合スコア16731

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

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

kult0922

2018/04/18 07:16

すいません、大変初歩的な質問かもしれないのですが、delegateをセットとは具体的にどのようにするのでしょうか?
fuzzball

2018/04/18 07:20

ざっくり書きました。 delegateの記事探して一通り勉強して下さい。
kult0922

2018/04/18 07:34

ありがとうございます。この記事を参考にしたのですがこの記事ではクラスのインスタンスは作成していないように思えるのですが、私のコードがどこか間違っているのでしょうか? しつこく質問してすいません。お時間あれば回答お願いします。 https://qiita.com/osamu1203/items/6dedc01e3b975a0ceec4
fuzzball

2018/04/18 07:45

let modalView = ModalViewController() でインスタンス生成。 self.modalView.delegate = self でdelegateセット。
kult0922

2018/04/18 08:42

ありがとうございます。確かにその通りでした。しかし、そこを修正しても問題は解決しませんでした。addItemViewControllerDidCancelが表示されず、addItemViewControllerDidCancelメゾットが実行されてません。何度も申し訳無いのですがdelegateをセットしソースコードを修正しましたので問題が分かりましたらご回答よろしくお願いします。
fuzzball

2018/04/18 08:49

let vc = AddItemViewController() で生成したAddItemViewControllerと、表示されているAddItemViewControllerは別物です。 AddItemViewControllerをどうやって表示しているのか分かりませんが、表示されているAddItemViewControllerのインスタンスに対してdelegateをセットして下さい。
kult0922

2018/04/19 01:03

長々とありがとうございます。 delegateについてもう少し勉強してきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問