0

異なるUI要素をプログラムで作成する方法を学習しようとしています。私は、私たちが持っている一方で2つの.swiftファイル、..セクションヘッダーがプログラムによるUITableViewに表示されない

 struct SettingsView { 

     let settingsCustomTable: UITableView = { 

      let aTable = UITableView() 
       aTable.sectionHeaderHeight = 42 
       aTable.tableFooterView = UITableViewHeaderFooterView(frame:CGRect(x:0, 
                        y:0, 
                        width:aTable.frame.width, 
                        height:0)) 

       aTable.register(SettingsCustomHeader.self, forHeaderFooterViewReuseIdentifier:"customHeader") 
       aTable.register(SettingsCustomCell.self, forCellReuseIdentifier:"customCell") 

      return aTable 
     }() 

    } 


    //////////////////////////////// 
    // custom cell class below // 
    //////////////////////////////// 

    private class SettingsCustomCell: UITableViewCell { 

     override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
      super.init(style: style, reuseIdentifier: reuseIdentifier) 

      contentView.addSubview(customCellLabel) 
      customCellLabel.frame = CGRect(x:16, 
              y:0, 
              width: self.frame.width, 
              height:self.frame.height) 
     } 

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

     private let customCellLabel: UILabel = { 

      let aLabel = UILabel() 
       aLabel.text = "custom label" 
       aLabel.textColor = appGreenColor(alphaIs: 1) 

      return aLabel 
     }() 
    } 


    ////////////////////////////////// 
    // custom header class below // 
    ////////////////////////////////// 

    private class SettingsCustomHeader: UITableViewHeaderFooterView { 

     override init(reuseIdentifier: String?) { 
      super.init(reuseIdentifier: reuseIdentifier) 

      contentView.addSubview(customHeaderLabel) 
      customHeaderLabel.frame = CGRect(x:0, 
              y:0, 
              width: self.frame.width, 
              height:self.frame.height) 
     } 

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

     private let customHeaderLabel: UILabel = { 

      let aLabel = UILabel() 
      aLabel.text = "custom header" 
      aLabel.textColor = UIColor.white 
      aLabel.backgroundColor = UIColor.red 

      return aLabel 
     }() 

    } 

およびその他の.swiftファイル上を持っている...

を私のUITableViewと次のような問題に直面しています私は、コントローラを持っています

class SettingsVC: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    private let instanceOfSettingsView = SettingsView() 

    override func loadView() { 
     super.loadView() 

     instanceOfSettingsView.settingsCustomTable.delegate = self 
     instanceOfSettingsView.settingsCustomTable.dataSource = self 

     view.addSubview(instanceOfSettingsView.settingsCustomTable) 
     instanceOfSettingsView.settingsCustomTable.frame = CGRect(x: 0, 
                    y: 0, 
                    width: self.view.frame.width, 
                    height: self.view.frame.height) 

    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 2 
    } 

    func numberOfSections(in tableView: UITableView) -> Int { 
     return 2 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     return tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) 
    } 

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
     return tableView.dequeueReusableHeaderFooterView(withIdentifier: "customHeader") 
    } 

ご覧のとおり、私はセルとヘッダーセクションの両方に全く同じアプローチを使用しています。しかし、何らかの奇妙な理由で、私は以下の出力を得る(このポストの最後のスクリーンショットを確認してください) ..

私は何が紛失しているとアドバイスできますか?私は自分のビューを私のコントローラとは別に置いてみようとしていますが、それはその小さな部分を除いて成功しています。

ご協力いただきありがとうございます。

enter image description here

+0

'tableView.dequeueReusableHeaderFooterView'ので

は、ビジュアルフォーマット言語を使用して、この答えは...

を "記入" します間違いなくnullを返す – zombie

+1

@Gamal Elsayedはあなたの質問に関連していませんが、フレームの使用は避けてください。 –

+0

@ TusharSharma、ありがとう、あなたのコメントは、ソリューションの方向性の一歩でした。 –

答えて

1

カスタムヘッダーのinit FUNCに行を追加します。あなたはこの時点では、フレームが設定されていない、ということでしょう

override init(reuseIdentifier: String?) { 
     super.init(reuseIdentifier: reuseIdentifier) 

     contentView.addSubview(customHeaderLabel) 
     customHeaderLabel.frame = CGRect(x:0, 
             y:0, 
             width: self.frame.width, 
             height:self.frame.height) 

     // add this line 
     print("w:", self.frame.width, "h:", self.frame.height) 
    } 

。あなたのデバッグコンソール出力は次のようになります。

w: 0.0 h: 0.0 
w: 0.0 h: 0.0 

あなたがcustomHeaderLabelの代わりに、その枠の設定に関する制約を設定した場合は、ラベルが表示されるはずです。 (背景色を設定して、何が何であるかを確認することもできます)。

override init(reuseIdentifier: String?) { 
    super.init(reuseIdentifier: reuseIdentifier) 

    contentView.addSubview(customHeaderLabel) 

    customHeaderLabel.translatesAutoresizingMaskIntoConstraints = false 

    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-8-[chl]|", options: [], metrics:[:], views:["chl":customHeaderLabel])) 
    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "V:|[chl]|", options: [], metrics:[:], views:["chl":customHeaderLabel])) 

} 

または使用してアンカーと.constraint形式:

override init(reuseIdentifier: String?) { 
    super.init(reuseIdentifier: reuseIdentifier) 

    contentView.addSubview(customHeaderLabel) 

    customHeaderLabel.translatesAutoresizingMaskIntoConstraints = false 

    customHeaderLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 8.0).isActive = true 
    customHeaderLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0.0).isActive = true 
    customHeaderLabel.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 0.0).isActive = true 
    customHeaderLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0.0).isActive = true 

} 
+0

ありがとうございます。 ** SettingsCustomHeader **クラスの中に以下を追加すると解決しました。 _NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:| -8- [chl] |"オプション、[]、メトリック:[:]) 、ビュー:["chl":customHeaderLabel]))_次に別の行に追加します _NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "V:| [chl] |"、オプション:[]、メトリック:[:]、ビュー:["chl":customHeaderLabel]))_ –

+1

うまくいけばうれしいです...私はあなたのノートで私の答えを更新しました。 – DonMag

関連する問題