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

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

ただいまの
回答率

90.53%

  • Swift

    8581questions

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

  • Xcode

    4831questions

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

  • iOS

    4592questions

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

UITableViewのセクションヘッダー背景/文字色を変更したい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,570

Aki_1988

score 32

前提・実現したいこと

現在swiftを勉強中です。UITableViewでセクション分けとセクション部分のカスタマイズを行いたいのですが、具体的なやり方がわからず困っております。
具体的には、セクションの背景色と文字色を変更できればと考えております。
初歩的な質問かと思いますが、よろしくお願い致します。

イメージ説明

試したこと

①セクションにlabelを設定して、それの背景色を設定する、を試しましたがこの関数では、Stringしか返せず。
返り値をUIViewにすると「objective-C method~」のようなエラー表示。

    func tableView(tableView:UITableView, titleForHeaderInSection section:Int) -> String?{
        let label = UILabel(frame: CGRect(x:0, y:0, width: tableView.bounds.width, height: 50))
        label.text = taskSections[section]
        label.backgroundColor = UIColor.redColor()
        return label.text
    }

② @IBOutlet weak var taskList: UITableView!を行ったUITableViewのtableHeaderViewを設定しようとしたが、「EXC_BAD_INSTRUCTION」のエラーが発生。

let headerView = self.taskList.tableHeaderView as UIView!
headerView.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 500)
self.taskList.tableHeaderView = headerView

ソース

回答頂いたものをもとに更新しております。

import UIKit

class TaskListUITableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.titleView = UIImageView(image:UIImage(named:"text_nav_title_today"))
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //ストーリーボード連携

    @IBOutlet weak var taskList: UITableView!

    //データ
    var taskTitles = [["task01","task02"],["task03"]]
    var taskSubTitles = [["subtask01","subtask02"],["subtask03"]]
    var taskSections:[String] = ["projectA","projectB"]


    //テーブル定義

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return taskTitles[section].count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("TaskCell") as! TaskListTableCell
        var title = taskTitles[indexPath.section]
        var subtitle = taskSubTitles[indexPath.section]
        cell.setCell(title[indexPath.row], subTitle: subtitle[indexPath.row])
        return cell
    }

    //section
    func tableView(tableView:UITableView, titleForHeaderInSection section:Int) -> String?{
        return taskSections[section]
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return taskSections.count
    }


    // Section Header View
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        // HeaderのViewを作成してViewを返す
        let headerView = UIView()
        let label = UILabel()
        label.text = "セクション"
        label.textColor = UIColor.whiteColor()
        headerView.backgroundColor = UIColor.redColor()
        // いろいろ・・・

        headerView.addSubview(label)
        return view
    }

    // Section Header Height
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        // ヘッダーViewの高さを返す
        return 40
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

以下2つのUITableViewDelegateのメソッドを書きセクションヘッダーのViewを作成して返してください。
※ ラベルを載せて色を変える

// Section Header View
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    // HeaderのViewを作成してViewを返す
    let headerView = UIView() 
    let label = UILabel()
    // いろいろ・・・

    headerView.addSubview(label)
    return view
}

// Section Header Height
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    // ヘッダーViewの高さを返す
    return 40
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/12 19:12 編集

    回答ありがとうございます!
    ご指示いただいたやり方でやってみたのですが、上手くできず。先ほどのキャプと同じ画面が表示されております。(エラーは発生していないようです)

    おそらくどこかに誤りがまだあるのかと思います。大変恐縮ですが、再度ご教示いただけますでしょうか?
    質問文のソースを更新しておりますので、ご確認お願い致します。

    キャンセル

  • 2017/02/12 19:17

    titleForHeaderInSectionのメソッドは消して大丈夫です。

    今回追加したメソッドは呼ばれているでしょうか?
    tableView.delegate = self
    は設定していますか?

    キャンセル

  • 2017/02/12 19:35

    すいません、デリゲート抜けておりました。
    しかし、デリゲートを追加したところ、「thread 1:signal SIGABRT」のエラーが発生してしまいました。。

    デリゲートは以下を追加
    ```
    override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.titleView = UIImageView(image:UIImage(named:"text_nav_title_today"))
    taskList.delegate = self
    }
    ```

    キャンセル

  • 2017/02/12 19:42

    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    ViewControllerにプロトロルに準拠する記述はありますか?

    キャンセル

  • 2017/02/12 19:45

    記載しております。
    関係ないかもしれませんが、swiftはVer2.2になっていました。そのあたり関係ありそうでしょうか?

    キャンセル

  • 2017/02/12 19:52

    それは関係ないと思います、コンソールにエラーメッセージがでていませんか?
    出ている場合そちらを載せてください。

    キャンセル

  • 2017/02/12 20:07

    2017-02-12 19:59:51.396 bright[29783:305982] *** Terminating app due to uncaught exception 'CALayerInvalid', reason: 'layer <CALayer: 0x7fa8a9e9fc60> is a part of cycle in its layer tree'
    *** First throw call stack:
    (
    0 CoreFoundation 0x000000010c2e7d85 __exceptionPreprocess + 165
    1 libobjc.A.dylib 0x000000010e757deb objc_exception_throw + 48
    2 CoreFoundation 0x000000010c2e7cbd +[NSException raise:format:] + 205
    3 QuartzCore 0x00000001137ed886 _ZN2CA5Layer30ensure_transaction_recursivelyEPNS_11TransactionE + 102
    4 QuartzCore 0x00000001137ed8d1 _ZN2CA5Layer30ensure_transaction_recursivelyEPNS_11TransactionE + 177
    5 QuartzCore 0x00000001137ed8d1 _ZN2CA5Layer30ensure_transaction_recursivelyEPNS_11TransactionE + 177
    6 QuartzCore 0x00000001137f5891 _ZN2CA5Layer15insert_sublayerEPNS_11TransactionEP7CALayerm + 389
    7 QuartzCore 0x00000001137f5db6 -[CALayer insertSublayer:below:] + 260
    8 UIKit 0x000000010d292088 -[UIView(Internal) _addSubview:positioned:relativeTo:] + 1483
    9 UIKit 0x000000010d303997 -[UITableView _addSubview:positioned:relativeTo:] + 76
    10 UIKit 0x000000010d2ba87f -[UIScrollView(UIScrollViewInternal) _addContentSubview:atBack:] + 376
    11 UIKit 0x000000010d30e453 -[UITableView _addContentSubview:atBack:] + 273
    12 UIKit 0x000000010d30bb7b -[UITableView _updateVisibleHeadersAndFootersNow:] + 3143
    13 UIKit 0x000000010d30d1d4 -[UITableView _updateVisibleCellsNow:isRecursive:] + 4153
    14 UIKit 0x000000010d341686 -[UITableView _performWithCachedTraitCollection:] + 92
    15 UIKit 0x000000010d328344 -[UITableView layoutSubviews] + 224
    16 UIKit 0x000000010d295980 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703
    17 QuartzCore 0x00000001137fbc00 -[CALayer layoutSublayers] + 146
    18 QuartzCore 0x00000001137f008e _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
    19 QuartzCore 0x00000001137eff0c _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
    20 QuartzCore 0x00000001137e43c9 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277
    21 QuartzCore 0x0000000113812086 _ZN2CA11Transaction6commitEv + 486
    22 QuartzCore 0x00000001138127f8 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92
    23 CoreFoundation 0x000000010c20cc37 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    24 CoreFoundation 0x000000010c20cba7 __CFRunLoopDoObservers + 391
    25 CoreFoundation 0x000000010c20211c CFRunLoopRunSpecific + 524
    26 UIKit 0x000000010d1d5f21 -[UIApplication _run] + 402
    27 UIKit 0x000000010d1daf09 UIApplicationMain + 171
    28 bright 0x000000010b68a0c2 main + 114
    29 libdyld.dylib 0x000000010f3e792d start + 1
    30 ??? 0x0000000000000001 0x0 + 1
    )
    libc++abi.dylib: terminating with uncaught exception of type NSException
    (lldb)

    キャンセル

  • 2017/02/12 20:08

    こちらでよろしいでしょうか?

    キャンセル

  • 2017/02/12 20:20 編集

    すいません!上記ログ誤っておりました。再度アップ致します。お手数おかけしてすいません。

    キャンセル

  • 2017/02/12 20:23

    2017-02-12 20:18:36.204 bright[31926:320587] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want.
    Try this:
    (1) look at each constraint and try to figure out which you don't expect;
    (2) find the code that added the unwanted constraint or constraints and fix it.
    (
    "<_UILayoutSupportConstraint:0x7fef60e204d0 V:[_UILayoutGuide:0x7fef60e8d130(0)]>",
    "<_UILayoutSupportConstraint:0x7fef60e1f7b0 V:|-(0)-[_UILayoutGuide:0x7fef60e8d130] (Names: '|':UIView:0x7fef60e87800 )>",
    "<_UILayoutSupportConstraint:0x7fef60e7dcc0 V:[_UILayoutGuide:0x7fef60e8dc10(0)]>",
    "<_UILayoutSupportConstraint:0x7fef60e87180 _UILayoutGuide:0x7fef60e8dc10.bottom == UIView:0x7fef60e87800.bottom>",
    "<NSLayoutConstraint:0x7fef60e8cd40 V:[UIView:0x7fef60e87c30(44)]>",
    "<NSLayoutConstraint:0x7fef60e8e6b0 V:[_UILayoutGuide:0x7fef60e8d130]-(0)-[UIImageView:0x7fef60e87990]>",
    "<NSLayoutConstraint:0x7fef60e8e890 V:[UIImageView:0x7fef60e87990]-(0)-[UIView:0x7fef60e87c30]>",
    "<NSLayoutConstraint:0x7fef60e8e980 V:[UIView:0x7fef60e87c30]-(0)-[_UILayoutGuide:0x7fef60e8dc10]>",
    "<NSLayoutConstraint:0x7fef60e206d0 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7fef60e87800(40)]>"
    )

    Will attempt to recover by breaking constraint
    <NSLayoutConstraint:0x7fef60e8cd40 V:[UIView:0x7fef60e87c30(44)]>

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
    2017-02-12 20:18:36.205 bright[31926:320587] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want.
    Try this:
    (1) look at each constraint and try to figure out which you don't expect;
    (2) find the code that added the unwanted constraint or constraints and fix it.
    (
    "<_UILayoutSupportConstraint:0x7fef60e204d0 V:[_UILayoutGuide:0x7fef60e8d130(0)]>",
    "<_UILayoutSupportConstraint:0x7fef60e1f7b0 V:|-(0)-[_UILayoutGuide:0x7fef60e8d130] (Names: '|':UIView:0x7fef60e87800 )>",
    "<_UILayoutSupportConstraint:0x7fef60e7dcc0 V:[_UILayoutGuide:0x7fef60e8dc10(0)]>",
    "<_UILayoutSupportConstraint:0x7fef60e87180 _UILayoutGuide:0x7fef60e8dc10.bottom == UIView:0x7fef60e87800.bottom>",
    "<NSLayoutConstraint:0x7fef60e8b5c0 V:[UIButton:0x7fef60e8b2b0'Button'(44)]>",
    "<NSLayoutConstraint:0x7fef60e8cf20 V:|-(0)-[UIButton:0x7fef60e8b2b0'Button'] (Names: '|':UIView:0x7fef60e87c30 )>",
    "<NSLayoutConstraint:0x7fef60e8e6b0 V:[_UILayoutGuide:0x7fef60e8d130]-(0)-[UIImageView:0x7fef60e87990]>",
    "<NSLayoutConstraint:0x7fef60e8e890 V:[UIImageView:0x7fef60e87990]-(0)-[UIView:0x7fef60e87c30]>",
    "<NSLayoutConstraint:0x7fef60e8e980 V:[UIView:0x7fef60e87c30]-(0)-[_UILayoutGuide:0x7fef60e8dc10]>",
    "<NSLayoutConstraint:0x7fef60e8cf70 V:[UIButton:0x7fef60e8b2b0'Button']-(0)-| (Names: '|':UIView:0x7fef60e87c30 )>",
    "<NSLayoutConstraint:0x7fef60e206d0 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7fef60e87800(40)]>"
    )

    Will attempt to recover by breaking constraint
    <NSLayoutConstraint:0x7fef60e8b5c0 V:[UIButton:0x7fef60e8b2b0'Button'(44)]>

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
    2017-02-12 20:18:36.212 bright[31926:320587] *** Terminating app due to uncaught exception 'CALayerInvalid', reason: 'layer <CALayer: 0x7fef60e87970> is a part of cycle in its layer tree'
    *** First throw call stack:
    (
    0 CoreFoundation 0x0000000105da9d85 __exceptionPreprocess + 165
    1 libobjc.A.dylib 0x0000000107b50deb objc_exception_throw + 48
    2 CoreFoundation 0x0000000105da9cbd +[NSException raise:format:] + 205
    3 QuartzCore 0x000000010d2af886 _ZN2CA5Layer30ensure_transaction_recursivelyEPNS_11TransactionE + 102
    4 QuartzCore 0x000000010d2af8d1 _ZN2CA5Layer30ensure_transaction_recursivelyEPNS_11TransactionE + 177
    5 QuartzCore 0x000000010d2af8d1 _ZN2CA5Layer30ensure_transaction_recursivelyEPNS_11TransactionE + 177
    6 QuartzCore 0x000000010d2b7891 _ZN2CA5Layer15insert_sublayerEPNS_11TransactionEP7CALayerm + 389
    7 QuartzCore 0x000000010d2b7db6 -[CALayer insertSublayer:below:] + 260
    8 UIKit 0x000000010668b088 -[UIView(Internal) _addSubview:positioned:relativeTo:] + 1483
    9 UIKit 0x00000001066fc997 -[UITableView _addSubview:positioned:relativeTo:] + 76
    10 UIKit 0x00000001066b387f -[UIScrollView(UIScrollViewInternal) _addContentSubview:atBack:] + 376
    11 UIKit 0x0000000106707453 -[UITableView _addContentSubview:atBack:] + 273
    12 UIKit 0x0000000106704b7b -[UITableView _updateVisibleHeadersAndFootersNow:] + 3143
    13 UIKit 0x00000001067061d4 -[UITableView _updateVisibleCellsNow:isRecursive:] + 4153
    14 UIKit 0x000000010673a686 -[UITableView _performWithCachedTraitCollection:] + 92
    15 UIKit 0x0000000106721344 -[UITableView layoutSubviews] + 224
    16 UIKit 0x000000010668e980 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703
    17 QuartzCore 0x000000010d2bdc00 -[CALayer layoutSublayers] + 146
    18 QuartzCore 0x000000010d2b208e _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
    19 UIKit 0x000000010667e205 -[UIView(Hierarchy) layoutBelowIfNeeded] + 1129
    20 UIKit 0x00000001067b35c5 -[UINavigationController _layoutViewController:] + 1613
    21 UIKit 0x00000001067b23b4 -[UINavigationController _layoutTopViewController] + 268
    22 UIKit 0x00000001067af6bd -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] + 856
    23 UIKit 0x0000000106a59c2c -[UINavigationTransitionView _notifyDelegateTransitionDidStopWithContext:] + 422
    24 UIKit 0x0000000106a59fa2 -[UINavigationTransitionView _cleanupTransition] + 788
    25 UIKit 0x00000001066617ff -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 241
    26 UIKit 0x000000010665e706 +[UIViewAnimationState popAnimationState] + 314
    27 UIKit 0x0000000106a598dd -[UINavigationTransitionView transition:fromView:toView:] + 2640
    28 UIKit 0x00000001067b4651 -[UINavigationController _startTransition:fromViewController:toViewController:] + 3291
    29 UIKit 0x00000001067b4c4d -[UINavigationController _startDeferredTransitionIfNeeded:] + 890
    30 UIKit 0x00000001067b5d0b -[UINavigationController __viewWillLayoutSubviews] + 57
    31 UIKit 0x0000000106964503 -[UILayoutContainerView layoutSubviews] + 248
    32 UIKit 0x000000010668e980 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703
    33 QuartzCore 0x000000010d2bdc00 -[CALayer layoutSublayers] + 146
    34 QuartzCore 0x000000010d2b208e _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
    35 QuartzCore 0x000000010d2b1f0c _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
    36 QuartzCore 0x000000010d2a63c9 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277
    37 QuartzCore 0x000000010d2d4086 _ZN2CA11Transaction6commitEv + 486
    38 QuartzCore 0x000000010d2d47f8 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92
    39 CoreFoundation 0x0000000105ccec37 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    40 CoreFoundation 0x0000000105cceba7 __CFRunLoopDoObservers + 391
    41 CoreFoundation 0x0000000105cc411c CFRunLoopRunSpecific + 524
    42 UIKit 0x00000001065cef21 -[UIApplication _run] + 402
    43 UIKit 0x00000001065d3f09 UIApplicationMain + 171
    44 bright 0x00000001051522e2 main + 114
    45 libdyld.dylib 0x00000001087e092d start + 1
    46 ??? 0x0000000000000001 0x0 + 1
    )
    libc++abi.dylib: terminating with uncaught exception of type NSException
    (lldb)

    キャンセル

  • 2017/02/12 21:43

    Swift2.2ということで一つ変わっている点がありました。回答を編集しましたが_アンダーバーがなくなっています。

    そちらで試してみてください。

    キャンセル

  • 2017/02/12 22:01

    実際に同じようにプロジェクトを作ってみて原因が分かりました。

    headerView.addSubview(label)
    return view

    セクションヘッダーのViewを返す部分でreturnしているのがself.viewになっています。

    return headerView
    にしてください、こちらではこれで表示されました。

    キャンセル

  • 2017/02/12 22:08

    わー、すいません!できました!
    何度もご確認いただきありがとうございました!
    本当に助かりました!!

    キャンセル

同じタグがついた質問を見る

  • Swift

    8581questions

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

  • Xcode

    4831questions

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

  • iOS

    4592questions

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