我有两个Core Data entities
,其中一个UITableView
包含2个部分,每个部分一个实体。当用户点击表行时,他们将被定向到另一个视图,该行的数据被发送到该视图。当前是这样实现的:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "editValue") {
let secondViewController = segue.destination as! EditValuesViewController
if send_array_inc.isEmpty {
secondViewController.send_array_exp = send_array_exp
} else if send_array_exp.isEmpty {
secondViewController.send_array_inc = send_array_inc
}
}
}
问题:
由于有两个实体,因此有两种可能的类型(Income
和Expenses
)将数据发送到下一个视图。如何在一个变量的下一个视图中使用该数据?我正在ViewDidLoad
中进行以下操作,但send_array
的范围仍在该函数内。如何使send_array
在外部可用?
if send_array_inc.isEmpty {
var send_array = [Expenses]()
send_array = send_array_exp
} else if send_array_exp.isEmpty {
var send_array = [Income]()
send_array = send_array_inc
}
理想情况下,我希望这样做而不为每个实体创建单独的视图,但是如果其他解决方案更好,更现实,我愿意重构。谢谢
答案 0 :(得分:1)
使两种类型的数据对象符合共享协议。使目标视图控制器的send_array
成为符合该协议的对象。
在EditValuesViewController的代码中,询问send_array
以确定传入的数据对象类型。
定义协议
@protocol dataArrayProtocol {
var dataArray: Array
}
定义2个符合该协议的结构
struct ExpensesArrayStruct: dataArrayProtocol {
var dataArray: [Expenses]
}
struct IncomeArrayStruct: dataArrayProtocol {
var dataArray: [Income]
}
给您的EditValuesViewController
一个符合该协议的属性
class EditValuesViewController:UIViewController {
var dataArrayStruct:dataArrayProtocol
}
还有您的prepare(for:sender)
方法
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "editValue") {
let secondViewController = segue.destination as! EditValuesViewController
if send_array_inc.isEmpty {
secondViewController.dataArrayStruct = ExpensesArrayStruct(dataArray: send_array_exp)
} else if send_array_exp.isEmpty {
secondViewController.dataArrayStruct = IncomeArrayStruct(dataArray: send_array_inc)
}
}
}
处理数据:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let expensesStruct = dataArrayStruct as? ExpensesArrayStruct {
//deal with expenses array
} else if let incomeStruct = dataArrayStruct as? IncomeArrayStruct {
//deal with income array
}
}
请注意,我在SO编辑器中敲出了这段代码,但尚未尝试对其进行编译。我可能犯了一些小错误。它应该会给你这个主意。