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

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

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

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

Swift

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

Q&A

2回答

3930閲覧

【iOS,Swift】CustomCellに配置したUILabelのtextが表示されない

Kesth

総合スコア83

iOS

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

Swift

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

0グッド

0クリップ

投稿2015/10/20 11:04

首記の件ですが、UITableVIew+CustomCellを使って
レイアウトを行っているのですが、CustomCell内に設置した
UILabelのtextが表示されずに困っています。

どこに原因がありますでしょうか?
何卒ご教授のほどよろしくお願いいたします。

Swift

1class ViewController:UIViewController, UITableViewDataSource, UITableViewDelegate{ 2 3 var tableView : UITableView! 4 //customCellのUILabelのtext用Array 5 let titleArray = [ 6 "テストテストテスト・テストテスト", 7 "テストテストテスト・テストテスト", 8 "テストテストテスト・テストテスト", 9 "テストテストテストテストテストテスト", 10 "テスト", 11 "テスト" 12 ] 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 17 tableView = UITableView() 18 tableView = UITableView(frame: CGRect(x: 0, y: 0, width: self.view.layer.bounds.width, height: self.view.layer.bounds.height)) 19 tableView.registerClass(CustomCell.self, forCellReuseIdentifier: "customCell") 20 tableView.delegate = self 21 tableView.dataSource = self 22 self.view.addSubview(tableView) 23 } 24 25 func numberOfSectionsInTableView(tableView: UITableView) -> Int { 26 return 1 27 } 28 29 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 30 return titleArray.count 31 } 32 33 func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 34 return 100 35 } 36 37 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath:NSIndexPath) -> UITableViewCell { 38 39 //cell deque 40 let cell: customCell = tableView.dequeueReusableCellWithIdentifier("customCell") as! CustomCell 41 42 //セルの中身を表示 43 cell.setupContents( 44 titleArray[indexPath.row] 45 ) 46 47 return cell 48 } 49 50}

↓Custom Cell

Swift

1class CustomCell:UITableViewCell{ 2 3 var titles = UILabel() 4 5 required init?(coder aDecoder: NSCoder) { 6 super.init(coder: aDecoder) 7 } 8 9 override func awakeFromNib() { 10 super.awakeFromNib() 11 } 12 13 override init(style: UITableViewCellStyle, reuseIdentifier: String!) { 14 super.init(style: style, reuseIdentifier: reuseIdentifier) 15 16 setupView() 17 18 } 19 20 // ビューの作成と設定 21 func setupView(){ 22 23 let screenWidth:CGFloat = self.bounds.width 24 let titleWidth:CGFloat = screenWidth - 20 25 26 titles.frame = CGRectMake((screenWidth - titleWidth)/2, 10, titleWidth, 0) 27 titles.font = UIFont(name: "Helvetica Neue", size: 14) 28 titles.numberOfLines = 0 29 titles.lineBreakMode = NSLineBreakMode.ByCharWrapping 30 titles.sizeToFit() 31 let titleHeight:CGFloat = self.titles.frame.size.height 32 titles.frame = CGRectMake((screenWidth - titleWidth)/2, videoPlayerHeight + spotContainerHeight + 10, titleWidth, titleHeight) 33 self.addSubview(titles) 34 } 35 36 // cell内コンテンツ表示 37 func setupContents(title:String){ 38 titles.text = title 39 } 40 41}

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

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

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

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

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

guest

回答2

0

tableView.dequeueReusableCellWithIdentifier("customCell")でTableViewCellのインスタンスを取得をした場合、init?(coder:)は呼ばれますが、init(style:reuseIdentifier:)は呼ばれません。
そのためsetupView()そのものが呼ばれていないのではないでしょうか?

思った通りの挙動にならなかったら、まずはBreakPointやprint()でログを仕込んだりして自分の想定通りにメソッドが呼び出されているか確認するようにすると、効率的に問題を探しやすくなりますよ。

投稿2015/10/21 01:25

編集2015/10/21 01:34
TakutoNagano

総合スコア150

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

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

Kesth

2015/10/22 06:55

コメントありがとうございます。 現状setupView()中にはUILabel(高さ可変)のtitlesしか組み込んでいませんが ためしにUIImageViewやUILabel(高さ固定)のプロパティも組み込んだ上で setupContents()でtitlesと同様に表示を試してみたところ、正常に表示されました。 なので、恐らくtitlesに何かしらの問題があるのかと思いますので ご指示いただいた方法で問題を探してみたいと思います。
TakutoNagano

2015/10/23 01:03

```Swift titles.sizeToFit() let titleHeight:CGFloat = self.titles.frame.size.height titles.frame = CGRectMake((screenWidth - titleWidth)/2, videoPlayerHeight + spotContainerHeight + 10, titleWidth, titleHeight) ``` となると、原因は抜粋したコードですね。 まずsetupView()の中でtitles.textが設定されていないので、その時点でsizeToFit()を呼び出すと表示する文字がないラベルとなるのでtitles.frame.size.heightは0になります。 次のコードでその0をHeightに設定してtitles.frameを更新しているので当然heightは0になっています。 sizeToFit()は、"呼び出した時点"において表示するのに最適なサイズにしてくれるメソッドです。 ですので、呼び出すべき場所は以下の場所になります。 // cell内コンテンツ表示 func setupContents(title:String){ titles.text = title titles.sizeToFit() }
Kesth

2015/11/03 14:36

お返事が遅くなってしまい申し訳ありません。 コメントありがとうございます、sizeToFit()の使い方が間違っていたので とても勉強になりました! 教えていただいたコードを試した所、無事titlesのテキストが表示されました! が、 let titleHeight:CGFloat = self.titles.frame.size.height で高さが取得されていないのか、titlesの下に来る要素に 重なって表示されてしまいます。 (titlesの下にUIImageが来るのですが、titlesのtextが長くなると はみ出してUIImageに重なってしまいました) let titleHeightの宣言する場所が誤っているのでしょうか? もし宣言する場所が誤っていなければ、ここで掲載していない 他の場所に問題がある可能性がありますので、見なおしてみます。
TakutoNagano

2015/11/04 01:30

> let titleHeight:CGFloat = self.titles.frame.size.height > で高さが取得されていないのか、titlesの下に来る要素に > 重なって表示されてしまいます。 こちらは、実際に値が取得できているかログに出力したりBreakPointで確認されましたか? テキストが表示されて下の要素と重なっているのであれば、正常にtitleHeightが取得できていると思います。 「titlesの下に来る要素」のその要素が何なのかで対応が変わってきます。 おそらく以下のどちらかではないでしょうか? 1. 要素が、同じCustomCell内のtitlesの下にある別のViewの場合 別のViewのview.frame.origin.yの値をtitlesのbottomより下に指定する必要があります。 更に下に別のViewがある場合はそれも全て座標を指定しなおしてください。 またはAutoLayoutの利用を検討しましょう。 2. 要素がテーブルで表示されている次のCustomCell自体の場合 tableView.heightForRowAtIndexPathで返している100の固定値を、titlesの内容によって可変させてください。
guest

0

setupViewメソッドでUILabelに文字色を設定してみては?

投稿2015/10/20 11:18

shiolier

総合スコア1156

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

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

Kesth

2015/10/20 12:23

文字数の関係上省いていますが、setupView中で文字色は設定しています。 他に考えられる原因は何か思いつきますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問