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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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回答

1557閲覧

tableViewを利用したlabelの表示について

退会済みユーザー

退会済みユーザー

総合スコア0

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/02 06:34

編集2018/04/03 05:39

swift4.1

swift

1import UIKit 2 3class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate{ 4 5 @IBOutlet weak var mytableView: UITableView! 6 var add = UILabel() 7 var item = [String]() 8 9 10 //+ボタン 11 @IBAction func addlabel(_ sender: Any) { 12 alert() 13 } 14 15 //ラベルについて 16 func label(){ 17 add = UILabel(frame: CGRect(x: 130, y:250, width: 100, height:20)) 18 //ラベルの大きさ、座標指定 19 //add.text = "labelです" 20 //文字を変更 21 22 add.backgroundColor = UIColor.lightGray 23 24 add.font = UIFont.systemFont(ofSize: 30) 25 //文字の大きさ 26 27 add.textColor = UIColor.black 28 //文字カラー 29 30 add.sizeToFit() 31 //文字数にあわせてlabelの大きさを変更(サイズが文字にフィットする) 32 33 self.view.addSubview(add) 34 //実際にviewに見える形でlabelが出現する 35 } 36 37 func alert(){ 38 // テキストフィールド付きアラート表示 39 40 let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert) 41 42 // OKボタンの設定 43 let okAction = UIAlertAction(title: "OK", style: .default, handler: { 44 (action:UIAlertAction!) -> Void in 45 46 // OKを押した時入力されていたテキストを表示 47 if let textFields = alert.textFields { 48 49 // アラートに含まれるすべてのテキストフィールドを調べる 50 for textField in textFields { 51 self.label() 52 self.item.insert(textField.text!, at: 0) 53 self.mytableView.insertRows(at: [IndexPath(row: 0, section: 0)],with: UITableViewRowAnimation.automatic) 54 self.add.text = textField.text! 55 self.add.sizeToFit() 56 print(textField.text!) 57 self.Gesture() 58 self.doubleclic() 59 } 60 } 61 }) 62 alert.addAction(okAction) 63 64 // キャンセルボタンの設定 65 let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 66 alert.addAction(cancelAction) 67 68 // テキストフィールドを追加 69 alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in 70 textField.placeholder = "テキスト" 71 }) 72 73 alert.view.setNeedsLayout() // シミュレータの種類によっては、これがないと警告が発生 74 75 // アラートを画面に表示 76 self.present(alert, animated: true, completion: nil) 77 78 } 79 80 func deletealert() { 81 let alert = UIAlertController(title:"you realy want to delete?", message: "メッセージ", preferredStyle: .alert) 82 83 let okAction = UIAlertAction(title: "YES", style: .default, handler: { 84 (action:UIAlertAction!) -> Void in 85 86 //labelの削除について 87 self.add.tag = 1 88 89 self.view.subviews.forEach { 90 if $0.tag == 1{ 91 $0.removeFromSuperview() 92 93 } 94 } 95 }) 96 alert.addAction(okAction) 97 98 // キャンセルボタンの設定 99 let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 100 alert.addAction(cancelAction) 101 102 alert.view.setNeedsLayout() // シミュレータの種類によっては、これがないと警告が発生 103 // アラートを画面に表示 104 self.present(alert, animated: true, completion: nil) 105 106 } 107 108 109 @objc func longpress(sender: UILongPressGestureRecognizer){ 110 111 // 長押し開始〜 112 if(sender.state == UIGestureRecognizerState.began) 113 { 114 115 } else if (sender.state == UIGestureRecognizerState.ended) 116 { 117 //labelの削除について 118 self.add.tag = 1 119 120 self.view.subviews.forEach { 121 if $0.tag == 1{ 122 $0.removeFromSuperview() 123 124 } 125 } 126 alert() 127 print("ロングタップされたよ。") 128 } 129 130 } 131 132 func Gesture() { 133 134 // UILongPressGestureRecognizerインスタンス作成 135 let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.longpress(sender:))) 136 // 時間(デフォルト0.5秒) 137 longPressGesture.minimumPressDuration = 0.5 138 self.add.isUserInteractionEnabled = true 139 self.add.addGestureRecognizer(longPressGesture) 140 141 142 143 } 144 145 func doubleclic(){ 146 // ダブルタップ 147 let doubeltapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.doubletap(sender:))) 148 doubeltapGesture.numberOfTapsRequired = 2 149 self.add.isUserInteractionEnabled = true 150 self.add.addGestureRecognizer(doubeltapGesture) 151 } 152 153 @objc func doubletap(sender: UITapGestureRecognizer){ 154 if(sender.state == UIGestureRecognizerState.began) 155 { 156 }else if(sender.state == UIGestureRecognizerState.ended) 157 { 158 deletealert() 159 print("tapされたよ") 160 } 161 162 } 163 164 165 166 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 167 return item.count 168 } 169 170 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 171 let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 172 //cell.textLabel?.text = add.text 173 let todoLabel = item[indexPath.row] 174 cell.textLabel?.text = todoLabel 175 return cell 176 } 177 178 179 override func viewDidLoad() { 180 super.viewDidLoad() 181 mytableView.dataSource = self 182 mytableView.delegate = self 183 } 184 185 186 187 override func didReceiveMemoryWarning() { 188 super.didReceiveMemoryWarning() 189 // Dispose of any resources that can be recreated. 190 } 191 192 193} 194 195

やりたいこと
tabelviewのcell内にlabelを挿入したい

困っていること
labelをコードから作っているためcell内に挿入する方法が分からない
エラーは起きないがcellの中に挿入できずにいる。コンソールには入力した文字は表示されるので下記のコードが良くないのかなと推測できるがどうすればいいの分からずいに困っています。
//ラベルについて

func label(){ add = UILabel (frame: CGRect()) ... ... }

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえずハードコードなitemを展開するためのコードです。
これで挙動が確認できたらitemのデータ操作をしかるべきものにすればよいかと。
itemのデータ操作をしたら、テーブルビューのインスタンスメソッド、reloadData()にて再描画するのも忘れずに。

Swift

1import UIKit 2 3class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate{ 4 5 @IBOutlet weak var mytableView: UITableView! 6 var add = UILabel() 7 var item = ["kei","hoge","fuga"] // test 8 9 @IBAction func addlabel(_ sender: Any) { 10 11 alert() 12 } 13 14 //ラベルについて 15 func label(){ 16 add = UILabel (frame: CGRect()) 17 //ラベルの大きさ、座標指定 18 //add.text = "labelです" 19 //文字を変更 20 21 add.backgroundColor = UIColor.lightGray 22 23 add.font = UIFont.systemFont(ofSize: 30) 24 //文字の大きさ 25 26 add.textColor = UIColor.black 27 //文字カラー 28 29 add.sizeToFit() 30 //文字数にあわせてlabelの大きさを変更(サイズが文字にフィットする) 31 32 self.view.addSubview(add) 33 //実際にviewに見える形でlabelが出現する 34 } 35 36 func alert(){ 37 // テキストフィールド付きアラート表示 38 39 let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert) 40 41 // OKボタンの設定 42 let okAction = UIAlertAction(title: "OK", style: .default, handler: { 43 (action:UIAlertAction!) -> Void in 44 45 // OKを押した時入力されていたテキストを表示 46 if let textFields = alert.textFields { 47 48 // アラートに含まれるすべてのテキストフィールドを調べる 49 for textField in textFields { 50 self.label() 51 self.add.text = textField.text! 52 self.add.sizeToFit() 53 print(textField.text!) 54 self.Gesture() 55 self.doubleclic() 56 } 57 } 58 }) 59 alert.addAction(okAction) 60 61 // キャンセルボタンの設定 62 let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 63 alert.addAction(cancelAction) 64 65 // テキストフィールドを追加 66 alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in 67 textField.placeholder = "テキスト" 68 }) 69 70 alert.view.setNeedsLayout() // シミュレータの種類によっては、これがないと警告が発生 71 72 // アラートを画面に表示 73 self.present(alert, animated: true, completion: nil) 74 75 } 76 77 func deletealert() { 78 let alert = UIAlertController(title:"you realy want to delete?", message: "メッセージ", preferredStyle: .alert) 79 80 let okAction = UIAlertAction(title: "YES", style: .default, handler: { 81 (action:UIAlertAction!) -> Void in 82 83 //labelの削除について 84 self.add.tag = 1 85 86 self.view.subviews.forEach { 87 if $0.tag == 1{ 88 $0.removeFromSuperview() 89 90 } 91 } 92 }) 93 alert.addAction(okAction) 94 95 // キャンセルボタンの設定 96 let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 97 alert.addAction(cancelAction) 98 99 alert.view.setNeedsLayout() // シミュレータの種類によっては、これがないと警告が発生 100 // アラートを画面に表示 101 self.present(alert, animated: true, completion: nil) 102 103 } 104 105 106 @objc func longpress(sender: UILongPressGestureRecognizer){ 107 108 // 長押し開始〜 109 if(sender.state == UIGestureRecognizerState.began) 110 { 111 112 } else if (sender.state == UIGestureRecognizerState.ended) 113 { 114 //labelの削除について 115 self.add.tag = 1 116 117 self.view.subviews.forEach { 118 if $0.tag == 1{ 119 $0.removeFromSuperview() 120 121 } 122 } 123 alert() 124 print("ロングタップされたよ。") 125 } 126 127 } 128 129 func Gesture() { 130 131 // UILongPressGestureRecognizerインスタンス作成 132 let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.longpress(sender:))) 133 // 時間(デフォルト0.5秒) 134 longPressGesture.minimumPressDuration = 0.5 135 self.add.isUserInteractionEnabled = true 136 self.add.addGestureRecognizer(longPressGesture) 137 138 } 139 140 func doubleclic(){ 141 // ダブルタップ 142 let doubeltapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.doubletap(sender:))) 143 doubeltapGesture.numberOfTapsRequired = 2 144 self.add.isUserInteractionEnabled = true 145 self.add.addGestureRecognizer(doubeltapGesture) 146 } 147 148 @objc func doubletap(sender: UITapGestureRecognizer){ 149 if(sender.state == UIGestureRecognizerState.began) 150 { 151 }else if(sender.state == UIGestureRecognizerState.ended) 152 { 153 deletealert() 154 print("tapされたよ") 155 } 156 157 } 158 159 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 160 return item.count 161 } 162 163 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 164 165 let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 166 167 //cell.textLabel?.text = add.text 168 cell.textLabel?.text = item[indexPath.row] // itemセット 169 170 return cell 171 } 172 173 174 override func viewDidLoad() { 175 super.viewDidLoad() 176 177 mytableView.dataSource = self // これがないとデータ展開のためのデリゲートメソッドが呼ばれない 178 //mytableView.delegate = self セルタップ等のハンドルするならこれも必要 179 180 } 181 182 override func didReceiveMemoryWarning() { 183 super.didReceiveMemoryWarning() 184 // Dispose of any resources that can be recreated. 185 } 186 187 188} 189

投稿2018/04/02 07:29

fromageblanc

総合スコア2724

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

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

退会済みユーザー

退会済みユーザー

2018/04/02 18:15

itemを利用したtableViewの挿入の仕方は理解出来ました。 var add = UILabel()の部分のlabelをtableViewの挿入するにはどうしたらいいのでしょうか? tagを利用したやり方は以前教えていただいたのですがコード上でlabelを生成したためtagを利用した方法はできないのかなと思います。
退会済みユーザー

退会済みユーザー

2018/04/03 04:43

labelを挿入するにあたり、alertの下記の部分を書き換える必要ありますか? self.add.text = textField.text! self.add.sizeToFit() またframe(cgrect)の部分のせいでcellに挿入できないと思うんですけど関係ありませんか?
fromageblanc

2018/04/03 04:50

提示のコードでは、dataSource = selfがないため、cellにデータをセットするデリゲートメソッドが動いてません。テーブルビューにデータがセットされる仕組みをまずは学習してください
退会済みユーザー

退会済みユーザー

2018/04/03 05:44

コードを編集したので見て欲しいです。 今の状態ですとalertで入力したものがcellに挿入されるのとlabelと入力内容が画面上に表示されるようになりました。 ここからなんですがself.item.insert(textField.text!, at: 0)のitemの部分をaddを加えるとエラーが出てしまいます。 この部分にaddを入れれないとおそらくcellには挿入できないと思うのですがちがうのでしょうか?
fromageblanc

2018/04/03 06:58

意味がよくわからないのですが、addそのものをcellに置きたいということですか?であれば、cellにaddSubview()すればよいかと。
退会済みユーザー

退会済みユーザー

2018/04/05 02:24

add = UILabel(frame: CGRect(x: 130, y:250, width: 100, height:20)) この部分の座標指定の指定をなくせばlabelがcell内に挿入出来るようになると思うので座標指定をなくして横幅と縦幅だけしてする方法はありますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問