gpt4 book ai didi

ios - 如何连接到 tableview 容器?

转载 作者:行者123 更新时间:2023-11-28 14:54:27 25 4
gpt4 key购买 nike

我是 Xcode 和 Swift 的初学者,我目前正在创建一个应用程序,用户可以在该应用程序中添加一个人,然后它会计算出他们欠那个人或那个人欠他/她的钱数。

注意:我已经使用核心数据来存储所有的值

我有一个名为 PeopleTableViewController 的 ViewController,用户可以在其中添加欠款人的姓名。然后我有 PersonDetailTableViewController,它显示用户欠在 PeopleTableViewController 中选择的特定人的详细信息列表。我面临的问题是,如果我在 PeopleTableViewController 中添加三个人,并且当我选择其中任何一个人时,我将被定向到 PersonDetailTableViewController 中的同一个 TableView ,但我希望用户在 PeopleTableViewController 中选择的不同人有不同的 TableView 。

PersonDetailTableViewController:

import UIKit

class PersonDetailTableViewController: UITableViewController {

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext


var totalLabel: UILabel?
var person: People?
var owe: Owe?

@IBOutlet var personTable: UITableView!

var dataInfo: [Owe] = []
var selectedObject: [Owe] = []
var balanceAmount = "Balance: "

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return (dataInfo.count)
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = personTable
.dequeueReusableCell(withIdentifier: "detailsCell", for: indexPath)
cell.textLabel?.text = dataInfo[indexPath.row].name
cell.detailTextLabel?.text = "₹ \(dataInfo[indexPath.row].amount)"
// if dataInfo[indexPath.row].amount < 0 {
// cell.detailTextLabel?.textColor = UIColor.red
// } else {
// cell.detailTextLabel?.textColor = UIColor.green
// }
return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedObject = [dataInfo[indexPath.row]]
performSegue(withIdentifier: "addOweDetails", sender: nil)
tableView.deselectRow(at: indexPath, animated: true)
}

override func viewDidLoad() {
super.viewDidLoad()

getData()
personTable.dataSource = self
addTotalToNav()
print(dataInfo as Any)
}



// MARK: - Table view data source

func addTotalToNav() -> Void {
if let navigationBar = self.navigationController?.navigationBar {
let totalFrame = CGRect(x: 10, y: 0, width: navigationBar.frame.width/2, height: navigationBar.frame.height)

totalLabel = UILabel(frame: totalFrame)
totalLabel?.text = balanceAmount
totalLabel?.tag = 1
totalLabel?.font = UIFont.boldSystemFont(ofSize: 14)
totalLabel?.textColor = UIColor.red
// navigationBar.large = totalLabel?.text
self.title = totalLabel?.text

}
}


func getData() -> Void {
do{
dataInfo = try context.fetch(Owe.fetchRequest())
var total:Double = 0.00
for i in 0 ..< dataInfo.count {
total += dataInfo[i].amount as! Double
}
balanceAmount = "Balance: ₹" + (NSString(format: "%.2f", total as CVarArg) as String)
}
catch{
print("Fetching Failed")
}
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let vc = segue.destination as! NewOweTableViewController
vc.dataInfo = selectedObject
selectedObject.removeAll()

}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
getData()
personTable.reloadData()
if (self.navigationController?.navigationBar.viewWithTag(1)?.isHidden == true){
self.navigationController?.navigationBar.viewWithTag(1)?.removeFromSuperview()
addTotalToNav()
}
}

}

人物 TableView Controller :

import UIKit
import CoreData

class PeopleTableViewController: UITableViewController {

@IBOutlet weak var peopleTableView: UITableView!

var people: [People] = []

override func viewDidLoad() {
super.viewDidLoad()

peopleTableView.separatorStyle = .none

// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false

// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem
}

//ViewWillAppear allows us to fetch all the data in the backend and help us display to the user
override func viewWillAppear(_ animated: Bool) {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
return
}

let managedContext = appDelegate.persistentContainer.viewContext

let fetchRequest: NSFetchRequest<People> = People.fetchRequest()

do {
people = try managedContext.fetch(fetchRequest)

peopleTableView.reloadData()
} catch {
print("Could not fetch")
}
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}


@IBAction func addButtonPressed(_ sender: UIBarButtonItem) {
}

//Following function is called right before the user segues from one viewcontroller to another viewcontroller

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let destination = segue.destination as? PersonDetailTableViewController,
let selectedRow = self.peopleTableView.indexPathForSelectedRow?.row else {
return
}

destination.person = people[selectedRow]
// destination.owe = people[selectedRow]

}

func deletePerson(at indexPath: IndexPath) {
let person = people[indexPath.row]

guard let managedContext = person.managedObjectContext else {
return
}

managedContext.delete(person)

do {
try managedContext.save()

people.remove(at: indexPath.row)

peopleTableView.deleteRows(at: [indexPath], with: .automatic)
} catch {
print("Could not delete")

peopleTableView.reloadRows(at: [indexPath], with: .automatic)
}
}
}

extension PeopleTableViewController{

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return people.count
}

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

let cell = peopleTableView.dequeueReusableCell(withIdentifier: "peopleCell", for: indexPath)

let person = people[indexPath.row]

cell.textLabel?.text = person.title

return cell
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
deletePerson(at: indexPath)
}
}
}

下图显示了我的确切要求:

人物 TableView Controller

PeopleTableViewController

单击 Mike,我得到以下信息:

PersonDetailTableViewController

单击 John,我得到以下信息:

PersonDetailTableViewController

我希望 Mike 和 John 的记录应该与 PersonDetailTableViewController 上的记录不同。

最佳答案

你可以尝试(都在 PeopleTableViewController 中),创建一个名为 shoePersonDetails 的 segue 从 PeopleTableViewControllerPersonDetailTableViewController

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let person = people[indexPath.row]
performSegue(withIdentifier: "shoePersonDetails", sender: person)
tableView.deselectRow(at: indexPath, animated: true)
}

//

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let vc = segue.destination as! PersonDetailTableViewController
vc.dataInfo = sender as! People

}

关于ios - 如何连接到 tableview 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49506674/

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