无法格式化 UITableView 的部分 Header

Unable to Format the Section Header of UITableView

一个视图控制器,其中包含三个 Table 视图。我正在为 viewForHeaderInSection 的每个 table.My 函数设置格式和设置 header 部分,附在下面

我的目标是实现类似图像的效果。努力为每个 table 视图格式化和设计部分 header。使用附加代码获取 由于未捕获的异常 'CALayerInvalid' 而终止应用程序,原因:'layer <CALayer: 0x12cc80610> is a part of cycle in its layer tree' 错误消息

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
       if(tableView == firstTableView){
        let button = UIButton(frame: CGRect(x: 270, y: 15, width:20 , height: 20))
           button.tag = section
           button.setImage(UIImage(named: "InfoIcon"), for: UIControl.State.normal)
           button.addTarget(self,action:#selector(buttonClicked),for:.touchUpInside)
        let view = UIView(frame: CGRect(x: 20, y: 8, width: tableView.frame.size.width, height: 30))
        view.addSubview(button)
        let label = UILabel(frame: CGRect(x: 12, y: 7, width: tableView.frame.size.width, height: 30))
        label.font = UIFont.systemFont(ofSize: 24)
        label.textColor = .white
        label.text = "Learn More"
        view.addSubview(label)
        view.backgroundColor = UIColor.gray // Set your background color
       }

        else if (tableView == secondTableView) {
            let button = UIButton(frame: CGRect(x: 270, y: 15, width:20 , height: 20))
                     button.tag = section
                     button.setImage(UIImage(named: "InfoIcon"), for: UIControl.State.normal)
                     button.addTarget(self,action:#selector(buttonClickedSecond),for:.touchUpInside)
                  let view = UIView(frame: CGRect(x: 20, y: 8, width: tableView.frame.size.width, height: 30))
                  view.addSubview(button)
                  let label = UILabel(frame: CGRect(x: 12, y: 7, width: tableView.frame.size.width, height: 30))
                  label.font = UIFont.systemFont(ofSize: 24)
                  label.textColor = .white
                  label.text = "Get Support"
                  view.addSubview(label)
                  view.backgroundColor = UIColor.gray
        }
        else if (tableView == thirdTableView)
       {
        let button = UIButton(frame: CGRect(x: 270, y: 15, width:20 , height: 20))
                            button.tag = section
                            button.setImage(UIImage(named: "InfoIcon"), for: UIControl.State.normal)
                            button.addTarget(self,action:#selector(buttonClickedThird),for:.touchUpInside)
                         let view = UIView(frame: CGRect(x: 20, y: 8, width: tableView.frame.size.width, height: 30))
                         view.addSubview(button)
                         let label = UILabel(frame: CGRect(x: 12, y: 7, width: tableView.frame.size.width, height: 30))
                         label.font = UIFont.systemFont(ofSize: 24)
                         label.textColor = .white
                         label.text = "Community"
                         view.addSubview(label)
                         view.backgroundColor = UIColor.gray
        }

        return view
    }

如有任何帮助和帮助,我们将不胜感激。谢谢!

在您的 viewForHeaderInSection 函数中,您正在每个 if 块中创建一个名为 view insideUIView 对象。在每个 if 块的末尾,该对象变为 out-of-scope... 它不再存在。

Xcode 不会在这一行给你警告或错误:

return view

因为 view 是您控制器的现有对象。

这是为正在创建的变量使用“built-in”对象名称是一种不良做法的原因之一。

将函数的顶部更改为:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let view = UIView(frame: CGRect(x: 20, y: 8, width: tableView.frame.size.width, height: 30))

    if(tableView == firstTableView){
        // etc...

并从每个 if 块中删除该行。

更好的是,将其更改为:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let myHeaderView = UIView(frame: CGRect(x: 20, y: 8, width: tableView.frame.size.width, height: 30))

    if(tableView == firstTableView){
        // etc... but change all instances of view. to myHeaderView.

    } // end of last if block

    return myHeaderView
 }