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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

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

Xcode

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

Swift

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

Q&A

解決済

1回答

2345閲覧

labelのインスタンスがアラートでエラー起きる

退会済みユーザー

退会済みユーザー

総合スコア0

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

iOS

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/04/28 10:53

編集2018/04/29 02:09

swift

1import UIKit 2 3class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate{ 4 5 @IBOutlet weak var mytableView: UITableView! 6 var item = [String]() 7 8@IBAction func addlabel(_ sender: Any) { 9 10 alert() 11 12 } 13 14 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 15 return item.count 16 } 17 18 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 19 let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 20 let todoLabel = item[indexPath.row] 21 cell.textLabel?.text = todoLabel 22 23 //ボタンについて 24 let button = UIButton() 25 button.backgroundColor = UIColor.blue 26 button.setTitle(" 追 加 ", for: .normal) 27 cell.contentView.addSubview(button) 28 29 button.translatesAutoresizingMaskIntoConstraints = false 30 cell.contentView.rightAnchor.constraint(equalTo: button.rightAnchor, constant: 12).isActive = true 31 // 中央にする 32 //button.centerYAnchor.constraint(equalTo: cell.centerYAnchor).isActive = true 33 //丸みに対して 34 button.layer.cornerRadius = 10 35 button.layer.masksToBounds = true 36 37 cell.contentView.heightAnchor.constraint(equalTo: button.heightAnchor, multiplier: 1).isActive = true 38 39 //ラベルについて 40 var label = UILabel() 41 label.backgroundColor = UIColor.darkGray 42 label.text = "120×10" 43 //丸みに対して 44 label.layer.cornerRadius = 5 45 label.layer.masksToBounds = true 46 cell.contentView.addSubview(label) 47 48 label.translatesAutoresizingMaskIntoConstraints = false 49 cell.contentView.leftAnchor.constraint(equalTo: label.leftAnchor, constant: -6).isActive = true 50 cell.contentView.heightAnchor.constraint(equalTo: label.heightAnchor, multiplier: 1).isActive = true 51 52 //アラート 53 func alert(){ 54 let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert) 55 56 // OKボタンの設定 57 let okAction = UIAlertAction(title: "OK", style: .default, handler: { 58 (action:UIAlertAction!) -> Void in 59 60 // OKを押した時入力されていたテキストを表示 61 if let textFields = alert.textFields { 62 63 // アラートに含まれるすべてのテキストフィールドを調べる 64 for textField in textFields { 65 66 self.item.insert(textField.text!, at: 0) 67 self.label.text = textField.text! 68 self.mytableView.insertRows(at: [IndexPath(row: 0, section: 0)],with: UITableViewRowAnimation.automatic) 69 print(textField.text!) 70 } 71 } 72 }) 73 alert.addAction(okAction) 74 75 // キャンセルボタンの設定 76 let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 77 alert.addAction(cancelAction) 78 79 // テキストフィールドを追加 80 alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in 81 textField.placeholder = "テキスト" 82 }) 83 84 alert.view.setNeedsLayout() // シミュレータの種類によっては、これがないと警告が発生 85 86 // アラートを画面に表示 87 self.present(alert, animated: true, completion: nil) 88 } 89 return cell 90 } 91 92 93 override func viewDidLoad() { 94 super.viewDidLoad() 95 96 } 97 98 99 100 override func didReceiveMemoryWarning() { 101 super.didReceiveMemoryWarning() 102 // Dispose of any resources that can be recreated. 103 } 104 105 106} 107

やりたい事

labelがセルに挿入されるときにアラートにて入力したものを反映させたい。

起きている問題
self.label.text = textField.text!の部分でlabelの部分でエラーが起きていてどう書いてもエラーが取れなくて困っています。
試しにcellForRowAt外にlabelのインスタンスを作ると外のインスタンスに対してはエラーが起きませんでした。
エラーメッセージ
Value of type 'ViewController' has no member 'label'

swift

1 //アラート 2 func alert(n: String){ 3 4 5 let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert) 6 7 // OKボタンの設定 8 let okAction = UIAlertAction(title: "OK", style: .default, handler: { 9 (action:UIAlertAction!) -> Void in 10 11 // OKを押した時入力されていたテキストを表示 12 if let textFields = alert.textFields { 13 14 // アラートに含まれるすべてのテキストフィールドを調べる 15 for textField in textFields { 16 17 self.item.insert(textField.text!, at: 0) 18 self.mytableView.insertRows(at: [IndexPath(row: 0, section: 0)],with: UITableViewRowAnimation.automatic) 19 label.text = textField.text! 20 print(textField.text!) 21 } 22 } 23 }) 24 alert.addAction(okAction) 25 26 // キャンセルボタンの設定 27 let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 28 alert.addAction(cancelAction) 29 30 // テキストフィールドを追加 31 alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in 32 textField.placeholder = "テキスト" 33 }) 34 35 alert.view.setNeedsLayout() // シミュレータの種類によっては、これがないと警告が発生 36 37 // アラートを画面に表示 38 self.present(alert, animated: true, completion: nil) 39 } 40 41 alert(n: "kei") 42 print(alert)

関数の引数について

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

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

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

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

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

ykws

2018/04/28 12:55

エラーが発生している場合はエラーメッセージを記載しましょう
退会済みユーザー

退会済みユーザー

2018/04/28 12:59

追記しました。
guest

回答1

0

ベストアンサー

Value of type 'ViewController' has no member 'label'

エラーメッセージの通りなのですが、
少しでも意味を理解しようとしていますか?

ViewControllerlabel が定義されていないの原因です。

self 演算子を利用するということは、今回の場合だと ViewController のメンバ変数へアクセスするということです。

例えば、メソッド内にメンバ変数と同じ名前のローカル変数が存在する場合など、この self 演算子を利用してメンバ変数とローカル変数のアクセスを明確にできます。

投稿2018/04/28 13:03

編集2018/04/28 14:40
ykws

総合スコア1236

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

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

退会済みユーザー

退会済みユーザー

2018/04/28 13:09

メッセージの意味はわかりますがcellForRowAtの中にlabelがあるのでなぜそれが定義されないのかがわからなくて困っています。 cellForRowAtの外にlabelを書けばエラーが無くなるのは質問する前に実施して確かめました。
ykws

2018/04/28 13:12

なるほど、メンバー変数とローカル変数の違いはわかりますか? おそらくその違いが理解できればエラーメッセージの意味がわかると思います。
退会済みユーザー

退会済みユーザー

2018/04/28 13:32

メンバー変数はメソッド外の変数でローカル変数はメソッド内で宣言した変数のことですよね?そうであれば今回のエラーはローカル変数だと定義できないという事でしょうか?それともfunc alert()を取っ払えばいいのでしょうか?
ykws

2018/04/28 13:55

そうです。あと self 演算子がどういう役割かもわかりますか? つけた場合とつけない場合でどの定義を参照するのか、そこが明確になればどういうコードを書けば良いかわかってくると思います。
退会済みユーザー

退会済みユーザー

2018/04/28 14:25

試しにselfをとってみたらエラーが取れました。しかし、なんでselfが必要なときと必要じゃない時の違いがわかりません。今までは定型句な感じでずっとつけるようにしていたのでselfについて調べてみます。 それと今回メソッド内にアラートを書いた事によってアラートを呼び出すことが出来なくなってしまったのですがこの場合やはりメソッド外でアラートを書くべきなのでしょうか?またもし外に書く事になると中のローカル変数のインスタンスを定義出来なくなってしまうのですがこの場合どのようにしたらいいのでしょうか?
ykws

2018/04/28 14:56 編集

self 演算子の説明を追記しました。後半のコメント部分は何に困っているのか読み取りにくいのですが、関数と引数という概念は理解できていますか? それがわかるようになれば、どうしたら良いか見えてくると思います。
退会済みユーザー

退会済みユーザー

2018/04/28 15:06

説明が分かりにくくてすいません。関数についてはC言語の講義で学びました。なので多少は理解しています。ですがswiftでは関数を使ったことがなく、今回の場合も関数を使えばいいのではないかと考えたのですがどう書けばいいか分からなくて他の手段を検討していました。 自信はないですけど今回の場合、func alert()を関数として引数をaddLabelに渡し、addLabelから返り値を返せばいいのでしょうか?
退会済みユーザー

退会済みユーザー

2018/04/28 15:12

func alert(n: Int) これを関数とし、引数を1としたのですが間違っていますか?
ykws

2018/04/28 15:14

イメージつかめていますね。細かいところは試してみて最適な方法を探るのが良いと思います。
退会済みユーザー

退会済みユーザー

2018/04/28 15:32

色々今考えながら試しているのですがなかなか上手くいきません。 なのでお聞きしたいのですが後はこの引数をaddLabelに渡せばいいのでしょうか?
ykws

2018/04/28 15:55

色々試した内容を整理して列挙できますか? また質問できる内容まで落とし込めたならば、まずは試してみるのが良いと思います。
退会済みユーザー

退会済みユーザー

2018/04/29 02:11 編集

Cで勉強した関数の引数のやり方ではswiftに当てはめることが出来なかったのでこうして見たのですが案の定出来ませんでした。 それで調べて見たのですがswiftだとタプルって呼ばれているらしくqitaで何回も読んで見たのですがどうしてもそのやり方を私のコードに当てはめる事が出来ませんでした。 なのでもしよろしければ少しヒントを頂けないでしょうか? @IBAction func addlabel(_ sender: Any) { alert(n: Int) } 上記の他に自分なりの理解で関数の引数について質問欄にコードを追記しました。 引数を渡す事とはこういうことであってるでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問