Ios 访问UITableView标题视图

Ios 访问UITableView标题视图,ios,swift,uitableview,Ios,Swift,Uitableview,我有一个UITableView,其中节头视图包含用户可以输入值的UITextField。当我想保存用户输入的值时,我需要访问表节标题 我尝试使用方法HeaderServiceWforSection:,并将HeaderServiceWforSection:0!作为确保节头确实存在的测试,但每次运行程序时,方法所在的行在展开可选值时返回意外发现的错误nil 我还尝试标记UITextField,但当我尝试使用certainTableView.viewWithTag uTag:访问节标题,并将结果UIV

我有一个UITableView,其中节头视图包含用户可以输入值的UITextField。当我想保存用户输入的值时,我需要访问表节标题

我尝试使用方法HeaderServiceWforSection:,并将HeaderServiceWforSection:0!作为确保节头确实存在的测试,但每次运行程序时,方法所在的行在展开可选值时返回意外发现的错误nil

我还尝试标记UITextField,但当我尝试使用certainTableView.viewWithTag uTag:访问节标题,并将结果UIView强制转换为UITextField时,在转换发生的行中抛出一个错误,称无法将“UITableView”类型的值强制转换为“UITextField”

这两个错误在我看来都很奇怪。在第一种情况下,我确保节头存在,但该方法返回nil。在第二种情况下,返回的标记视图应为UITableViewHeaderFooterView类型,但类型为UITableView。有人能提出任何可能的原因吗?如何纠正

或者,是否有更好的方法访问节标题视图,以便我可以保存在UITextField中键入的文本

下面是我在第一个案例中使用的细节

在func tableView\utableview:UITableView,viewForHeaderInSection:Int->UIView?中,我返回了一个包含UITextField的UIView。在我需要保存键入的用户数据的表视图中,我有一个按钮,当用户点击它时,数据被保存。在该选择器中,我有以下内容:

//save item
    let a = addItemTableView.headerView(forSection: 0)!
    let b = a.subviews[0] as! UITextField
    let c = b.text ?? ""
    someNSManagedObject.text = c
我上面提到的错误出现在第一行。

在您的方法中

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

当您返回包含UITextField的自定义标题时,将其委托给控制器,这样您将在UITextFieldDelegate函数下按用户获得所有键控值

首先向模型textFieldData添加一个属性以将textField数据保存在中

然后在HeadServiceW类中添加一个闭包var textFieldDidChange:String->Void

在viewController类中

func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    let footerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: PlaceOrderFooterView.id) as! PlaceOrderFooterView
    footerView.fill(with: models[section])

    footerView.textFieldDidChange = { [unowned self] text in
        self.models[section].textFieldData = text
    }

    return footerView
}
现在,无论何时更改任何textField数据,您的模型对象都具有更新的值。

在读入帖子后,我得到了一个提示,并发现在func tableView\utableview:UITableView中,viewForHeaderInSection:Int->UIView?方法,我应该返回UITableViewHeaderFooterView,而不是以前的UIView。当我将返回对象的类型更改为UITableViewHeaderFooterView时,其他所有内容都保持不变,即向UITableViewHeaderFooterView添加UITextField,我通过HeadServiceWForSection:方法访问UITableViewHeaderFooterView中的UITextField

更清楚的是,在apple的文档中,函数声明为func-headerViewforSection:Int->UITableViewHeaderFooterView?,显示返回值为UITableViewHeaderFooterView,为了使用该方法访问标题视图,从func-tableView\utableview:UITableView返回值,标题部分的视图:Int->ui视图?应该是UITableViewHeaderFooterView,而不是任何其他通用UIView或UIView子类


希望这能有所帮助。

请发帖code@qsmy您需要一种将textField.text保存到模型中的方法,请查看我的答案以了解详细信息。我发现您的方法是每当用户在文本字段中编辑时更新它。但是,是否有一种方法可以在用户完成编辑并点击按钮后保存所有内容,正如我在更新的问题中提到的那样?如果您不在模型上保存textField.text,它可能会由于单元格重复使用而丢失,因此您需要跟踪它。我认为直接从tableUI获取数据而不是使用他们的模型是不好的做法。我不重用单元格,因为我知道不同的节头可能有不同的输入。另外,我想你说的是MVVM,视图模型层,但我目前使用的是MVC。我想先解决数据保存的问题,然后开始在代码中添加更多的抽象层。
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    let footerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: PlaceOrderFooterView.id) as! PlaceOrderFooterView
    footerView.fill(with: models[section])

    footerView.textFieldDidChange = { [unowned self] text in
        self.models[section].textFieldData = text
    }

    return footerView
}