将变量传递到自定义 UITableViewHeaderFooterView

Passing a variable into custom UITableViewHeaderFooterView

提问人:Philipp 提问时间:10/12/2023 最后编辑:Philipp 更新时间:10/12/2023 访问量:37

问:

有一个包含.UIViewControllerUITableView

class ProfileViewController: UIViewController {

    private lazy var profileView: ProfileHeaderView = {
        let profileView = ProfileHeaderView()
        return profileView
    }()
    
    private lazy var feedView: UITableView = {
        let feedView = UITableView().feedView(isHeaderHidden: true)
        feedView.isUserInteractionEnabled = true
        feedView.allowsSelection = true
        return feedView
    }()
...
}

其中有一个自定义标头(自定义类符合协议),它是以这种方式实现的:UITableViewProfileHeaderViewUITableViewHeaderFooterView

extension ProfileViewController: UITableViewDataSource {
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        if section == 0 {
            if let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: "ProfileHeaderView") as? ProfileHeaderView {
                view.isUserInteractionEnabled = true
                return view
            }
        }
        return nil
    }
}    

假设我们有一个变量(例如字符串)。如何将此变量的值从我们的自定义标头传递到我们的自定义标头中?ProfileHeaderViewUIViewController

编辑以下是声明的快速浏览:ProfileHeaderView

class ProfileHeaderView: UITableViewHeaderFooterView {
        
    public var statusText: String?
    
     override init(reuseIdentifier: String?) {
        super.init(reuseIdentifier: reuseIdentifier)
        addSuviews()
        setupConstraints()
        changeBackgroundColor()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        addSuviews()
        setupConstraints()
        changeBackgroundColor()
    }
    
    ...
}
iOS Swift UITableView UIViewController UIKit的

评论

0赞 HangarRash 10/12/2023
您需要一个可以设置的属性。你有这样的房产吗?ProfileHeaderView
0赞 Philipp 10/12/2023
@HangarRash是的,我通过可选的公共 var 将其添加到声明中ProfileHeaderView
0赞 Maziar Saadatfar 10/12/2023
你不能把它设置为: if let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: “ProfileHeaderView”) as?ProfileHeaderView { view. statusText = “你想要的每个状态” ?
0赞 Philipp 10/12/2023
@MaziarSaadatfar我试着这样做。我的代码编译了,但值没有更改为我在其中设置的值。也许我应该更新一些东西(编辑了我的问题并添加了更多代码)UIViewControllerinit()ProfileHeaderView
0赞 Maziar Saadatfar 10/12/2023
如果 statusText 应该设置为标签或您想要的所有内容,您应该为 statusText 设置属性观察者,例如: var statusText: String?{ didSet { yourlabel.text = statusText } }

答:

1赞 HangarRash 10/12/2023 #1

只需为 赋值即可。statusText

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    if section == 0 {
        if let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: "ProfileHeaderView") as? ProfileHeaderView {
            view.isUserInteractionEnabled = true
            view.statusText = "some status text for section 0"
            return view
        }
    }
    return nil
}

但是,您还需要让标题视图在更改时更新标签或其他一些 UI 组件。statusText

class ProfileHeaderView: UITableViewHeaderFooterView {
    public var statusText: String? {
        didSet {
            someLabel.text = statusText // update the UI as needed
        }
    }

评论

0赞 Philipp 10/12/2023
谢谢!!!我没有用那么多,所以没有把它当作一个解决方案!它:)didSet
2赞 DonMag 10/12/2023
@Philipp - 只是一个旁注......这正是我在上一个问题中向您展示的示例中所做的:stackoverflow.com/a/77261827/6257435:)
0赞 Philipp 10/13/2023
@DonMag 对不起,我错过了!再次感谢你:)