gpt4 book ai didi

ios - 从 Swift 中的另一个 View Controller 访问 TableView 单元格信息

转载 作者:行者123 更新时间:2023-11-28 05:59:19 26 4
gpt4 key购买 nike

我们正在设计一个应用程序,我们有一个 TableView Controller 和一个 View Controller 。在我的选项卡 View Controller 中,它在每个单元格中都有按钮,我们将其拖动以使其与 View Controller 单元格建立连接。如果我们单击不同单元格中的按钮,我们想从核心数据更新 View Controller 中的数据。(每个按钮转到不同的人信息)但问题是我们无法从 View Controller 类访问有关单元格的信息。我们在这里找到了一些例子,但我们做不到。

     //table view controller class
var charArray = ["a","b","c"]
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
let myCharacter = charArray[indexPath.row]
cell.textLabel?.font = UIFont(name: "HoeflerText-Italic", size: 27.0)
cell.textLabel?.text = myCharacter

return cell
}


//view controller class
override func viewDidLoad() {
super.viewDidLoad()
charText.isEditable = false
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext = appDelegate.persistentContainer.viewContext// This one is created to work with Managed Object
let entity = NSEntityDescription.entity(forEntityName: "CHARACTER",in: managedContext)!


if let a = CI.tableView.cellForRow(at: IndexPath.init(row: i, section: i)),a.textLabel?.text == "Iron Man"{
imageChar.image = UIImage(named: "Iron_Man")
btn1.setTitle("Iron Man ", for: .normal)
btn1.showsTouchWhenHighlighted = true
btn2.setTitle("Iron Man 2", for: .normal)
btn2.showsTouchWhenHighlighted = true
btn3.setTitle("Iron Man 3", for: .normal)
btn3.showsTouchWhenHighlighted = true

let person = NSManagedObject(entity: entity,insertInto: managedContext)
person.setValue(CHS[0].species , forKeyPath: "species")
person.setValue(CHS[0].name , forKeyPath: "title")
person.setValue(CHS[0].gender, forKeyPath: "gender")
person.setValue(CHS[0].textInfo, forKey: "information")
person.setValue(CHS[0].age, forKey: "age")

do {// Save into our app's dedicated disk area
try managedContext.save()
people.append(person)
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}

// print(people.first as Any)

let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "CHARACTER")
do{
let request = try managedContext.fetch(fetchRequest)


for data in request{
labelName.text = data.value(forKey: "title") as? String
labelSpecies.text = data.value(forKey: "species") as? String
labelGender.text = data.value(forKey: "gender") as? String
charText.text = data.value(forKey: "information") as? String
labelAge.text = data.value(forKey: "age") as? String
}
}
catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
}



//Another option --------
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

let StoryBoard = UIStoryboard(name: "Main", bundle: nil)
let CIVC = StoryBoard.instantiateViewController(withIdentifier: "CharacterInformationViewController") as! CharacterInformationViewController

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext = appDelegate.persistentContainer.viewContext// This one is created to work with Managed Object
let entity = NSEntityDescription.entity(forEntityName: "CHARACTER",in: managedContext)!
let person = NSManagedObject(entity: entity,insertInto: managedContext)
person.setValue(CHS[indexPath.row].species , forKeyPath: "species")
person.setValue(CHS[indexPath.row].name , forKeyPath: "title")
person.setValue(CHS[indexPath.row].gender, forKeyPath: "gender")
person.setValue(CHS[indexPath.row].textInfo, forKey: "information")
person.setValue(CHS[indexPath.row].age, forKey: "age")

do {// Save into our app's dedicated disk area
try managedContext.save()

people.append(person)
print(person)
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}



let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "CHARACTER")
do{
let request = try managedContext.fetch(fetchRequest)

//Try to get data from table view controller class and make an object of my view controller class
for data in request{
CIVC.getName = (data.value(forKey: "title") as? String)!
CIVC.getSpecies = (data.value(forKey: "species") as? String)!
CIVC.getGender = (data.value(forKey: "gender") as? String)!
CIVC.getText = (data.value(forKey: "information") as? String)!
CIVC.getAge = (data.value(forKey: "age") as? String)!
}
}
catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}


}

最佳答案

假设您的数据集没有变化,这意味着您没有删除行,解决此问题的常见方法是使用单元格内每个按钮的 tag 属性。您可以像这样设置标签:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
let myCharacter = charArray[indexPath.row]
cell.textLabel?.font = UIFont(name: "HoeflerText-Italic", size: 27.0)
cell.textLabel?.text = myCharacter

cell.btn1.tag = indexPath.row // set tag

return cell
}

然后您将使用此标记属性作为数据源的索引:

@objc func didTapButton(sender: UIButton) {
let cellIndex = sender.tag
let info = charArray[cellIndex]
// do something with info
}

另一种方法是在自定义 UITableViewCell 中创建一个委托(delegate),并在每个单元格出列时设置它。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// ...
cell.delegate = self;
// ...
}

每次在单元格内点击按钮时,都会在它的委托(delegate)(UIViewController)中调用一个方法(您在协议(protocol)中定义)。该方法可以包含您想要的任何内容,包括可识别的数据。确保 UIViewController 符合此协议(protocol)。

关于ios - 从 Swift 中的另一个 View Controller 访问 TableView 单元格信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50310527/

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