【问题标题】:Access components of custom header view访问自定义标题视图的组件
【发布时间】:2020-02-03 14:03:39
【问题描述】:

为header创建了一个自定义的header类,使用xib查看。试图从该标头类中获取 UITextField 的值。下面是代码:

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

    let customHeaderView = Bundle.main.loadNibNamed("AddHeaderTableViewCell", owner: self, options: nil)?.last as! AddHeaderTableViewCell

customHeaderView.txtFieldAdd.placeholder = ""
return customHeaderView
}

当试图从下面的文本字段中获取价值时:

 @objc func addMoreToMytask(sender: UIButton!) {

   isAddStep = false

    let header = tblAddedTasks.headerView(forSection: 0) as? AddHeaderTableViewCell
    let sectionTitle = header?.textLabel?.text

    arrAdded.append((header?.txtFieldAdd.text!)!)
    tblAddedTasks.reloadData()
}

这行报错

let header = tblAddedTasks.headerView(forSection: 0) as? AddHeaderTableViewCell

运行时给出警告和崩溃

Cast from 'UITableViewHeaderFooterView?' to unrelated type 'AddHeaderTableViewCell' always fails

请同样指导。

【问题讨论】:

  • 快速修复可以是不要投射到您的 AddHeaderTableViewCell,并使用 viewWithTag 方法访问您的 textField。

标签: ios swift uitableview header headerfooter


【解决方案1】:

您可以尝试使用 header 对象作为成员。

var customHeaderView : AddHeaderTableViewCell = nil
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
  customHeaderView = Bundle.main.loadNibNamed("AddHeaderTableViewCell", owner: self, options: nil)?.last as! AddHeaderTableViewCell
  customHeaderView.txtFieldAdd.placeholder = ""
  return customHeaderView
}

然后就可以使用成员对象了;

@objc func addMoreToMytask(sender: UIButton!) {

    isAddStep = false

    // let header = tblAddedTasks.headerView(forSection: 0) as? AddHeaderTableViewCell
    // let sectionTitle = header?.textLabel?.text
    let sectionTitle = customHeaderView.textLabel?.text 

    arrAdded.append((customHeaderView.txtFieldAdd.text!)!)
    tblAddedTasks.reloadData()
}

我不确定,但原因可能是可选值。 Tableview 仅在屏幕上呈现视图,您可能会得到 nil。 函数的签名是;

func headerView(forSection section: Int) -> UITableViewHeaderFooterView?

它返回一个可选变量。 您试图强制转换一个可选变量。 XCode 可能无法完美地转换可选变量,因此它无法向您提供足够的信息。

你可以试试;

tblAddedTasks.headerView(forSection: 0) as! AddHeaderTableViewCell

tblAddedTasks.headerView(forSection: 0)! as?  AddHeaderTableViewCell

可能会崩溃,但至少您会看到崩溃的真正原因。

【讨论】:

  • 它有效,但不是问题的解决方案。
  • 我更新了答案,请检查并通知您是否可以摆脱当前的崩溃。
  • 如果对你有用,请标记为答案,这样每个人都会知道答案。谢谢。
猜你喜欢
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 2011-08-23
  • 2011-11-14
相关资源
最近更新 更多