2017-11-02 23 views
0

に型のUIViewの値をキャストできませんでした私は、として宣言されたテーブルビューのクラスがあります。このクラスではSWIFT 4はUITableViewHeaderFooterView

class boatsVC: UIViewController, UITableViewDelegate, UITableViewDataSource { 

を、私は、背景色やセクションのためのテキストの色を変更したいです。この目的を達成するために、私は、次の2つのクラスを実装している:willDispayHeaderView機能の

let header = view as! UITableViewHeaderFooterView 

線の信号SIGABRT:私は、コードを実行すると

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    let view = UIView() 
    view.backgroundColor = Constants.ppsBlue 
    return view 
} 

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { 
    let header = view as! UITableViewHeaderFooterView 
    header.textLabel?.textColor = UIColor.white 
} 

は、私がスレッド1を取得します。これらの関数の両方ですべてのコードをコメントアウトすると、アプリは必要に応じて実行され、セクションタイトルが正しく表示されます。しかし、それは私が使用したい色ではありません。私がしようとしているのは、セクションの背景色を変更し、テキストの色を変更することだけです。私がwillDisplayHeaderView関数のコードをコメントアウトすると、アプリケーションが動作し、セクションの背景色が私が望む色になりますが、セクションのタイトルは表示されません。

アイデア?

+1

'UIView()'を作成しています。これは 'UITableViewHeaderFooterView'とは異なるクラスです。 'UITableViewHeaderFooterView'を初期化して使用するか、単に' UIView'として使用してください。 – Connor

+0

私は、ログにエラーがあることを追加する必要があります: 'UIView'(0x1b363d9c8)の値を 'UITableViewHeaderFooterView'にキャストできません。 – CMan

+0

Connorは言うように、最初の関数でUIViewを作成していて、 UITableViewHeaderFooterViewに強制的にダウンキャストします。これは、UIViewがUITableViewHeaderFooterViewではないため動作しません。最初の関数で別のオブジェクトを返す必要があります。何らかのテキストを表示したい場合はUILabelを使うことができますが、UIlabelもUITableViewHeaderFooterView – Paulw11

答えて

0

これは私がこの問題を解決するために行ったことです。私は削除)私はtoggleSection
3を作成した)私はクラス定義
2にBoatHeaderViewDelegateを追加
1):私のboatsVCクラスで、その後

protocol BoatHeaderViewDelegate { 
func toggleSection(header: BoatHeaderView, section: Int) 
} 

class BoatHeaderView: UITableViewHeaderFooterView { 

    var delegate: BoatHeaderViewDelegate? 
    var section: Int! 

    override init(reuseIdentifier: String?) { 
     super.init(reuseIdentifier: reuseIdentifier) 
     self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(selectHeaderAction))) 
    } 


    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 


    @objc func selectHeaderAction(gestureRecognizer: UITapGestureRecognizer) { 
     let cell = gestureRecognizer.view as! BoatHeaderView 
     delegate?.toggleSection(header: self, section: cell.section) 
    } 

    func customInit(title: String, section: Int, delegate: BoatHeaderViewDelegate) { 
     self.textLabel?.text = title 
     self.section = section 
     self.delegate = delegate 
    } 


    override func layoutSubviews() { 
     super.layoutSubviews() 
     self.textLabel?.textColor = UIColor.white 
     self.contentView.backgroundColor = Constants.ppsBlue 
    } 
} 

:私はタイプUITableViewHeaderFooterViewの新しいクラスを作成しました

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    let header = BoatHeaderView() 
    header.customInit(title: thisRaceName, section: 1, delegate: self) 
    return header 
} 

を今、私はアプリケーションを実行し、背景色とTを次のようwillDisplayHeaderView機能
4)は、私がviewForHeaderInSectionを変更しましたセクションのテキストの色は私が必要なものです。