gpt4 book ai didi

swift - FRC 填充 TableView 但 FetchedResultsController 委托(delegate)方法不起作用

转载 作者:行者123 更新时间:2023-11-30 12:16:21 25 4
gpt4 key购买 nike

我有一个 View Controller ,名为 ScorecardViewController ,其中包含 UITableView ,称为 HolesTable ,它由 FetchedResultsController 正确填充.

但是,当用户编辑任何数据时,FRC delegate 都不会出现。方法被调用 - 即我在每个 FRC delegate 上设置了断点方法,但没有被触发。

ScorecardViewController HolesTable 的代表 并实现其工作所需的一组方法。另外, HolesTable ,有它的数据源和 delegate在 IB 中设置为 ScorecardViewController

对于上下文,在应用程序的其他地方,我有一个几乎相同的设置,工作正常。我有一个 View Controller , CourseViewController ,其中托管 UITableViewScorecardTable ,它有一个链接到它的 FRC。

ScorecardTable 从 FRC 和所有 FRC delegate 正确填充方法按预期触发。

经过对我的代码进行广泛审查并在线研究后,我得出结论,我错过了连接 HoleTable 的某个步骤。 FRC delegate ,但我无法弄清楚这种情况发生在哪里,因为我对两个 VC 的检查没有显示任何明显的东西。

还有什么我可能会错过的吗?我可以发布什么代码来帮助确定问题出在哪里?

谢谢!

--更新1

FRC 的定义如下:

fileprivate lazy var fetchedResultsController: NSFetchedResultsController<Hole> = {
// Create Fetch Request
let fetchRequest: NSFetchRequest<Hole> = Hole.fetchRequest()

// Configure Fetch Request
self.teeColourString = self.scorecard?.value(forKey: "teeColour") as! String?
fetchRequest.predicate = NSPredicate(format: "%K == %@ AND %K == %@", "appearsOn.offeredAt.name", self.courseName!, "appearsOn.teeColour", self.teeColourString!)

fetchRequest.sortDescriptors = [NSSortDescriptor(key: "holeNumber", ascending: true)]

// Create Fetched Results Controller
let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.coreDataManager.mainManagedObjectContext, sectionNameKeyPath: nil, cacheName: nil)

// Configure Fetched Results Controller
fetchedResultsController.delegate = self

return fetchedResultsController

}()

FRC 运行良好,并且填充了连接的 tableView对象,HoleTable .

Hole表包含三个整数列 HoleNum , ParStrokeIndex 。我有一个自定义单元格,HoleTableViewCell这些值显示在 HoleTable 内.

ParStrokeIndex可以通过HoleTable的实例进行更新用户直接编辑单元格。 `HoleTableViewCell' 的代码是:

class HoleTableViewCell: UITableViewCell, UITextFieldDelegate {

@IBOutlet weak var holeNumLabel: UILabel!
@IBOutlet weak var SIField: UITextField!
@IBOutlet weak var parField: UITextField!

static let reuseIdentifier = "HoleTableViewCell"

func textFieldDidBeginEditing(_ textField: UITextField) {
print("Editing started")
}

func textFieldDidEndEditing(_ textField: UITextField) {
if textField.tag == 4 {
//ParField has been edited
print("Par is now " + textField.text!)
} else if textField.tag == 5 {
// SIField has been edited
print("SI is now " + textField.text!)
}
}
override func awakeFromNib() {
super.awakeFromNib()

// Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)

// Configure the view for the selected state
SIField.delegate = self
SIField.tag = 4
parField.delegate = self
parField.tag = 5
}
}

在运行时,编辑文本字段 SIFieldparField触发器textFieldDidBeginEditingtextFieldDidEndEditing正如我所期望的。

不会触发 FRC 委托(delegate)方法。这些是在 UITableView 的类中定义的,ScorecardViewController其中FetchedResultsControllerDelegate协议(protocol)方法已设置。

--更新2

经过进一步调查,我认为 FRC 委托(delegate)方法未触发的原因是 FRC 后面的托管对象上下文没有发生更新。

我将进一步研究这个问题,看看是否有一种简单的方法可以实现这一点。

最佳答案

事实证明,这个问题的解决方案很简单,但需要一些脑细胞才能弄清楚。

缺少的部分是我需要将对对象的引用从 HolesTable TableView 传递到“HoleTableViewCell”单元格,以便我在单元格方法中进行的编辑触发 FRC 委托(delegate)方法。

新类“HoleTableViewCell”定义如下所示:

import UIKit
import CoreData

class HoleTableViewCell: UITableViewCell, UITextFieldDelegate {

@IBOutlet weak var holeNumLabel: UILabel!
@IBOutlet weak var SIField: UITextField!
@IBOutlet weak var parField: UITextField!

var hole: Hole?

static let reuseIdentifier = "HoleTableViewCell"

func textFieldDidBeginEditing(_ textField: UITextField) {
print("Editing started")
}

// This will need beefing up to enforce rules for Par and SI
func textFieldDidEndEditing(_ textField: UITextField) {
if textField.tag == 4 || textField.tag == 5 {
//ParField has been edited

//Prepare the Hole record for sending back to calling controller
hole?.setValue(Int(parField.text!), forKeyPath: "par")
hole?.setValue(Int(SIField.text!), forKey: "strokeIndex")
}
}

override func awakeFromNib() {
super.awakeFromNib()

// Initialization code
}

override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)

// Configure the view for the selected state
SIField.delegate = self
SIField.tag = 4
parField.delegate = self
parField.tag = 5
}
}

并且,在保存单元格的 UITableView 的类定义中,需要以下内容:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

guard let cell = tableView.dequeueReusableCell(withIdentifier: HoleTableViewCell.reuseIdentifier, for: indexPath) as? HoleTableViewCell else {
fatalError("Unexpected Index Path")
}

// Fetch Holes
let hole = fetchedResultsController.object(at: indexPath)


// Pass the hole to the cell instance so edits in situ will trigger FRC delegate methods
cell.hole = hole

return cell

}

关于swift - FRC 填充 TableView 但 FetchedResultsController 委托(delegate)方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45398240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com