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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

2067閲覧

TableViewControllerからViewControllerのテキストの内容を変化させたい。

ptpt

総合スコア22

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2016/08/13 10:54

編集2016/08/13 15:52

###前提・実現したいこと
TableViewControllerにあるボタンを押すと、ViewControllerへ遷移すると同時にViewControllerのTextViewに決まった文字(例えば"テスト"など)を表示するようにしたい。
遷移はstoryboardで行っている。
###発生している問題・エラーメッセージ

TextViewが空白のまま。

###該当のソースコード

swift

1**label版** 2 3import UIKit 4 5class ViewController: UIViewController, TableViewControllerDelegate { 6 7 @IBOutlet weak var mytext: UITextView! 8 9 @IBOutlet weak var label: UILabel! 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 } 13 14 override func didReceiveMemoryWarning() { 15 super.didReceiveMemoryWarning() 16 } 17 18 func setText(text: String) { 19 label?.text = test 20 } 21 22 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 23 24 if let tableV = segue.destinationViewController as? TableViewController { 25 tableV.delegate = self 26 } 27 } 28 29} 30 31 32**ViewController** 33 34import UIKit 35 36class ViewController: UIViewController,TableViewControllerDelegate 37{ 38 39 @IBOutlet weak var mytext: UITextView! 40 41 override func viewDidLoad() { 42 super.viewDidLoad() 43 } 44 45 46 override func didReceiveMemoryWarning() { 47 super.didReceiveMemoryWarning() 48 // Dispose of any resources that can be recreated. 49 } 50 51 52 func setText(text: String) { 53 mytext.text = text 54 } 55} 56 57 58**TableViewController** 59 60import UIKit 61 62protocol TableViewControllerDelegate: class { 63 func setText(text: String) 64} 65 66class TableViewController: UITableViewController{ 67 68 weak var delegate: TableViewControllerDelegate! 69 70 override func viewDidLoad() { 71 super.viewDidLoad() 72 } 73 74 75 override func didReceiveMemoryWarning() { 76 super.didReceiveMemoryWarning() 77 // Dispose of any resources that can be recreated. 78 } 79 80 @IBAction func zenbun(sender: AnyObject) { 81 delegate?.setText("test") 82 } 83 84}

storyboard

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

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

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

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

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

guest

回答1

0

ベストアンサー

画面遷移する際にTableViewControllerDelegateselfを設定してください。

swift

1import UIKit 2 3class ViewController: UIViewController, TableViewControllerDelegate { 4 5 @IBOutlet weak var mytext: UITextView! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 } 10 11 override func didReceiveMemoryWarning() { 12 super.didReceiveMemoryWarning() 13 } 14 15 func setText(text: String) { 16 mytext.text = text 17 } 18 19 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 20 21 if let tableV = segue.destinationViewController as? TableViewController { 22 tableV.delegate = self 23 } 24 } 25}

確認手順

s

回答追記

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var label: UILabel! 6 var labelText: String = "" 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 label.text = labelText 12 } 13} 14 15 16class TableViewController: UITableViewController { 17 18 var text = "" 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 } 23 24 @IBAction func zenbun(sender: AnyObject) { 25 text = "test" 26 performSegueWithIdentifier("next", sender: nil) 27 } 28 29 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 30 if let viewC = segue.destinationViewController as? ViewController { 31 viewC.labelText = text 32 } 33 } 34}

イメージ説明

イメージ説明

投稿2016/08/13 12:42

編集2016/08/13 16:48
_Kentarou

総合スコア8490

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

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

ptpt

2016/08/13 13:09

設定してみましたが空白のままです。可能性としてはほかに何かありますでしょうか?
_Kentarou

2016/08/13 13:13

ちなみにTableViewControlerでボタンを押した時にViewControllerのsetTextメソッドは呼ばれてますか?
ptpt

2016/08/13 13:27

呼ばれてます。
_Kentarou

2016/08/13 13:41

ラベルの上になにかViewが乗っていて見えていなとか考えられないですか、ラベルの背景色に色を付けて画面にそもそも表示されている事を確認してください。
ptpt

2016/08/13 13:56

表示されています。
_Kentarou

2016/08/13 13:59

ViewControllerでsetTextで文字を設定するとラベルに表示されますか?
ptpt

2016/08/13 14:02

表示されません。
_Kentarou

2016/08/13 14:03

textViewの高さを広げて実行してみてください。
ptpt

2016/08/13 14:09

実行してみましたがダメです。
_Kentarou

2016/08/13 14:11

試しにUILabelに変更して実行しても同じ結果ですか?
ptpt

2016/08/13 14:16

同じ結果です。
_Kentarou

2016/08/13 14:21

UILabelに変更した状態でいいので質問のコードを現在のものに変更してもらえますか?
_Kentarou

2016/08/13 14:22

ちなみにzenbunというボタンはTableViewControllerの何処に配置してありますか?
ptpt

2016/08/13 14:26

追加しました。zenbunというボタンはTableViewControllerのstatic cellsの上に貼っています。
_Kentarou

2016/08/13 14:28

ViewControllerのviewDidLoadとかでLabelに文字を設定すると表示されますか?
ptpt

2016/08/13 14:31

表示されました!!
_Kentarou

2016/08/13 14:36

直接設定しているので、表示されるのは当然ですがDelegate経由だと表示されないですよね、、、 その状態でTableViewControlerでボタンを押した時にViewControllerのsetTextメソッドは呼ばれているかもう一度確認してもらってもよいですか?
ptpt

2016/08/13 14:50

メソッドが呼ばれてるか調べる方法を間違えてるかもしれないので、教えていただくことは可能でしょうか?
_Kentarou

2016/08/13 15:07

確認手順を回答に追記しました、確認してください。
ptpt

2016/08/13 15:18

確認しました。ありがとうございます。また、メソッドは呼ばれています。
_Kentarou

2016/08/13 15:25 編集

それでもLabelには文字列(test)が設定されていないということですよね? label?.text = text となっていますが、?を取り label.text = text にして実行してみてください。
ptpt

2016/08/13 15:30

実行すると fatal error: unexpectedly found nil while unwrapping an Optional value (lldb) というエラーメッセージが表示されます。
_Kentarou

2016/08/13 15:33

ああ、labelが開放されているみたいですね、、、
_Kentarou

2016/08/13 15:36

画面遷移はsegueで結んでいるだけですか?どの様になっているでしょうか?
ptpt

2016/08/13 15:41

画面遷移はsegueで結んでるだけです。他の結びはボタンとzenbun関数(setText)で繋がっています。
_Kentarou

2016/08/13 15:44

ViewControllerに記述しているのは載せてい頂いているコードだけですよね。 Storyboardの画像載せてもらう事はできますか?該当部分だけで良いので。
_Kentarou

2016/08/13 15:46

あとlabelの?をはずした状態でviewDidLoadでラベルに文字を設定すると表示されますか?
_Kentarou

2016/08/13 15:48

> 他の結びはボタンとzenbun関数(setText)で繋がっています。 これはTableViewControllerの中だけで完結しているIBActionですよね?
_Kentarou

2016/08/13 15:55

すみません、これはTableViewControllerからViewControllerへの遷移ですか?
ptpt

2016/08/13 15:57

載せてるコードで全部です。 この画像で大丈夫でしょうか? viewDidLoadでも?をつけないと同様のエラーメッセージが出ます。 完結してるの意味がわかりませんが上に載せた通りのコードです。
ptpt

2016/08/13 15:58

そうです。TableViewControllerからViewControllerへの遷移です。
_Kentarou

2016/08/13 16:00

これはただ、遷移先のViewControllerに対してラベルに文字を設定したいという質問ですか?
_Kentarou

2016/08/13 16:01

> TableViewControllerからViewControllerへの遷移です。 この場合Delegateは必要ありません。
_Kentarou

2016/08/13 16:04

ViewControllerへの画面遷移のアクションは何をした時に実行されますか? そのようなボタンが無いのと、TableViewControllerにSegueを呼ぶようなメソッドがないので、、、
ptpt

2016/08/13 16:06

TableViewControllerのボタンを押すとそこで初めてViewControllerに文字が表示されるという仕組みの質問です。
_Kentarou

2016/08/13 16:13

Segue(画面遷移)が実行されるのはzenbunボタンを押した時ですか?
ptpt

2016/08/13 16:15

そうです。
_Kentarou

2016/08/13 16:18 編集

zenbunボタンで遷移するようにすると値が設定できないのでSegueをViewControllerにむすんでperformSegueWithIdentifierで遷移を呼ぶように変更してみてください。 ※Identifierはnextという文字列 後は回答に追記したように変更すればいけると思います。
ptpt

2016/08/13 16:27

なにからSegueをViewControllerに結ぶんでしょうか? またperformSegueWithIdentifierはViewControllerに書くんでしょうか?
_Kentarou

2016/08/13 16:40

performSegueWithIdentifierは回答に追記した様に記述してください。 結び方は画像を載せました。
ptpt

2016/08/13 16:58

結び方がわかりません。申し訳ないですが何からViewControllerにsegueを結ぶんでしょうか?
ptpt

2016/08/13 17:02

一枚目の画像が見えていませんでした。↑は忘れてください。
_Kentarou

2016/08/13 17:02

画像で分かりませんか?TableViewControllerの黄色いところから結べると思いますが。 左のツリー表示の所のTableViewControllerのところからでも同じです。
_Kentarou

2016/08/13 17:03

すみません、一枚目の画像うまく載せられず遅れてました。
_Kentarou

2016/08/13 17:04

最初にボタンから結んであったSegueは一度削除してくださいね。画面遷移を2度してしまいます。
ptpt

2016/08/13 17:06

ありがとうございました!!とうとう完成しました!!感謝します!!
_Kentarou

2016/08/13 17:07

お疲れ様でした\(^o^)/
_Kentarou

2016/08/13 17:08

ちなみにDelegateは遷移先から遷移元の画面に値を設定したい場合に使用したりします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問