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

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

ただいまの
回答率

89.51%

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,665

Kesth

score 81

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

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



class ViewController:UIViewController, UITableViewDataSource, UITableViewDelegate{

    var tableView : UITableView!
    //customCellのUILabelのtext用Array
    let titleArray = [
        "テストテストテスト・テストテスト",
        "テストテストテスト・テストテスト",
        "テストテストテスト・テストテスト",
        "テストテストテストテストテストテスト",
        "テスト",
        "テスト"
    ]

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView = UITableView()
        tableView = UITableView(frame: CGRect(x: 0, y: 0, width: self.view.layer.bounds.width, height: self.view.layer.bounds.height))
        tableView.registerClass(CustomCell.self, forCellReuseIdentifier: "customCell")
        tableView.delegate = self
        tableView.dataSource = self
        self.view.addSubview(tableView)
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return titleArray.count
    }
    
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 100
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath:NSIndexPath) -> UITableViewCell {
        
        //cell deque
        let cell: customCell = tableView.dequeueReusableCellWithIdentifier("customCell") as! CustomCell
        
        //セルの中身を表示
        cell.setupContents(
            titleArray[indexPath.row]
        )

        return cell
   }

}

↓Custom Cell
class CustomCell:UITableViewCell{
    
    var titles = UILabel()

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }
    
    override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        
        setupView()
   
    }

     // ビューの作成と設定
     func setupView(){
        
        let screenWidth:CGFloat = self.bounds.width
        let titleWidth:CGFloat = screenWidth - 20

        titles.frame = CGRectMake((screenWidth - titleWidth)/2, 10, titleWidth, 0)
        titles.font = UIFont(name: "Helvetica Neue", size: 14)
        titles.numberOfLines = 0
        titles.lineBreakMode = NSLineBreakMode.ByCharWrapping
        titles.sizeToFit()
        let titleHeight:CGFloat = self.titles.frame.size.height
        titles.frame = CGRectMake((screenWidth - titleWidth)/2,  videoPlayerHeight + spotContainerHeight + 10, titleWidth, titleHeight)
        self.addSubview(titles)
     }

     // cell内コンテンツ表示
     func setupContents(title:String){
            titles.text = title
    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/20 21:23

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

    キャンセル

0

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/22 15:55

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

    キャンセル

  • 2015/10/23 10: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()
    }

    キャンセル

  • 2015/11/03 23:36

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

    キャンセル

  • 2015/11/04 10: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の内容によって可変させてください。

    キャンセル

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

  • ただいまの回答率 89.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる