在运行时从其他 Class 获取 UITextFields(1st Class) 和 Switches (2nd Class) 值
Get UITextFields(1st Class) and Switches (2nd Class) values from other Class at runtime
我想从 PropertiesViewController.swift 获取 5 个 UITextField 的值,从 ConditionsViewController 获取 8 个开关(两个 classes 都是 TabController 的一部分)。我想在用户单击 saveMeter() 后将用户输入的值插入到 CoreData 中。我的问题是当我尝试从另一个 Class 访问两个视图时,我在其中进行了所有 CRUD 操作。当我点击 Properties 或 ConditionsViewController 上的保存按钮时,文本和开关值 return nil 即使我只是输入了一个值。
class 被命名为 CRUDController,这里是必须重要的代码:
class CRUDController: UIViewController {
可变条件:ConditionsViewController
var 属性:PropertiesViewController
init(){
//我在下面理解我正在创建一个新实例而不是原始实例
//但是 swift 强迫我初始化它们,我不知道其他方法。
// 我也试过这样引用它们:
//var 条件:ConditionsViewController var 属性:PropertiesViewController
//来自函数 saveMeter 但来自文本的值仍然为空。
conditions = ConditionsViewController()
properties = PropertiesViewController()
super.init(nibName: nil, bundle:nil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func saveMeter() {
//conditions.setConditions()
//properties.setProperties()
//creating empty meter
let m1 = Meter(context: MOC)
//这是我在 Coredata 中设置 Meter 对象的值
//conditions values
m1.newMeterCond1 = conditions.newMeterCond1Val
m1.newMeterCond2 = conditions.newMeterCond2Val
m1.newMeterCond3 = conditions.newMeterCond3Val
m1.oldMeterCond1 = conditions.oldMeterCond1Val
m1.oldMeterCond2 = conditions.oldMeterCond2Val
m1.oldMeterCond3 = conditions.oldMeterCond3Val
m1.oldMeterCond4 = conditions.oldMeterCond4Val
m1.oldMeterCond5 = conditions.oldMeterCond5Val
m1.cnc = conditions.CNCVal
//properties values
m1.outKW = properties.OutKWFromTextField
m1.outKWH = properties.OutKWHFromTextField
m1.outKVARH = properties.OutKVARHFromTextField
m1.multiplier = properties.multiplierFromTextField
m1.newMeterNumber = properties.newMeterNumberFromTextField
APPD.saveContext()
}
}
这是我正在获取文本字段和开关的 classes:
class ConditionsViewController: UIViewController {
//variables to set
var newMeterCond1Val = Bool()
var newMeterCond2Val = Bool()
var newMeterCond3Val = Bool()
var oldMeterCond1Val = Bool()
var oldMeterCond2Val = Bool()
var oldMeterCond3Val = Bool()
var oldMeterCond4Val = Bool()
var oldMeterCond5Val = Bool()
var CNCVal = Bool()
@IBOutlet weak var oldMeterNumber: UILabel!
@IBOutlet weak var newMeterNumber: UILabel!
var oldMeterFromCell = String()
var newMeterFromTabChild = String()
//old meter conditions
@IBOutlet weak var oldMeterCond1: UISwitch!
@IBOutlet weak var oldMeterCond2: UISwitch!
@IBOutlet weak var oldMeterCond3: UISwitch!
@IBOutlet weak var oldMeterCond4: UISwitch!
@IBOutlet weak var oldMeterCond5: UISwitch!
//new meter conditions
@IBOutlet weak var newMeterCond1: UISwitch!
@IBOutlet weak var newMeterCond2: UISwitch!
@IBOutlet weak var newMeterCond3: UISwitch!
@IBOutlet weak var CNC: UISwitch!
@IBAction func saveMeter(_ sender: AnyObject) {
//this is where I am calling the function from CRUDController
CRUD.saveMeter()
}
}
class PropertiesViewController: UIViewController, UITextFieldDelegate {
var oldMeterFromCell = String()
//variables to set
var OutKWHFromTextField = Float()
var OutKWFromTextField = Float()
var OutKVARHFromTextField = Float()
var newMeterNumberFromTextField = String()
var multiplierFromTextField = Float()
@IBOutlet weak var OldMeterLabel: UILabel!
//new meter properties
@IBOutlet weak var OutKWH: UITextField!
@IBOutlet weak var OutKW: UITextField!
@IBOutlet weak var OutKVARH: UITextField!
@IBOutlet weak var newMeterNumber: UITextField!
@IBOutlet weak var multiplier: UITextField!
}
我已经尝试使用 init() 和必需的 init() 从它们的每个 class 中初始化 UITextField 和开关,我也尝试使用便利的 init(),我也用初始化它们自定义设置函数。我还在 The CRUDController Class 上为两个 classes 创建了一个实例,但是当我点击保存按钮时,文本值仍然返回 nil。我不能使用 segue,因为我有 2 个视图,即使可以我也不想。我需要从 CRUDController class 访问原始 PropertiesController 和 ConditionsController,但我不知道该怎么做,因为我对委托的概念以及如何使事情正常工作感到非常困惑,所以我需要代码解决了问题,没有概念
我发现可以解决此问题的唯一方法是将 StoryBoard 中不同视图的所有开关、UITextfields、操作等连接到一个可以访问所有元素的 class。这样就不需要实例化一个 Class 来访问另一个。
我想从 PropertiesViewController.swift 获取 5 个 UITextField 的值,从 ConditionsViewController 获取 8 个开关(两个 classes 都是 TabController 的一部分)。我想在用户单击 saveMeter() 后将用户输入的值插入到 CoreData 中。我的问题是当我尝试从另一个 Class 访问两个视图时,我在其中进行了所有 CRUD 操作。当我点击 Properties 或 ConditionsViewController 上的保存按钮时,文本和开关值 return nil 即使我只是输入了一个值。
class 被命名为 CRUDController,这里是必须重要的代码:
class CRUDController: UIViewController {
可变条件:ConditionsViewController
var 属性:PropertiesViewController
init(){
//我在下面理解我正在创建一个新实例而不是原始实例
//但是 swift 强迫我初始化它们,我不知道其他方法。
// 我也试过这样引用它们:
//var 条件:ConditionsViewController var 属性:PropertiesViewController
//来自函数 saveMeter 但来自文本的值仍然为空。
conditions = ConditionsViewController()
properties = PropertiesViewController()
super.init(nibName: nil, bundle:nil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func saveMeter() {
//conditions.setConditions()
//properties.setProperties()
//creating empty meter
let m1 = Meter(context: MOC)
//这是我在 Coredata 中设置 Meter 对象的值
//conditions values
m1.newMeterCond1 = conditions.newMeterCond1Val
m1.newMeterCond2 = conditions.newMeterCond2Val
m1.newMeterCond3 = conditions.newMeterCond3Val
m1.oldMeterCond1 = conditions.oldMeterCond1Val
m1.oldMeterCond2 = conditions.oldMeterCond2Val
m1.oldMeterCond3 = conditions.oldMeterCond3Val
m1.oldMeterCond4 = conditions.oldMeterCond4Val
m1.oldMeterCond5 = conditions.oldMeterCond5Val
m1.cnc = conditions.CNCVal
//properties values
m1.outKW = properties.OutKWFromTextField
m1.outKWH = properties.OutKWHFromTextField
m1.outKVARH = properties.OutKVARHFromTextField
m1.multiplier = properties.multiplierFromTextField
m1.newMeterNumber = properties.newMeterNumberFromTextField
APPD.saveContext()
}
}
这是我正在获取文本字段和开关的 classes:
class ConditionsViewController: UIViewController {
//variables to set
var newMeterCond1Val = Bool()
var newMeterCond2Val = Bool()
var newMeterCond3Val = Bool()
var oldMeterCond1Val = Bool()
var oldMeterCond2Val = Bool()
var oldMeterCond3Val = Bool()
var oldMeterCond4Val = Bool()
var oldMeterCond5Val = Bool()
var CNCVal = Bool()
@IBOutlet weak var oldMeterNumber: UILabel!
@IBOutlet weak var newMeterNumber: UILabel!
var oldMeterFromCell = String()
var newMeterFromTabChild = String()
//old meter conditions
@IBOutlet weak var oldMeterCond1: UISwitch!
@IBOutlet weak var oldMeterCond2: UISwitch!
@IBOutlet weak var oldMeterCond3: UISwitch!
@IBOutlet weak var oldMeterCond4: UISwitch!
@IBOutlet weak var oldMeterCond5: UISwitch!
//new meter conditions
@IBOutlet weak var newMeterCond1: UISwitch!
@IBOutlet weak var newMeterCond2: UISwitch!
@IBOutlet weak var newMeterCond3: UISwitch!
@IBOutlet weak var CNC: UISwitch!
@IBAction func saveMeter(_ sender: AnyObject) {
//this is where I am calling the function from CRUDController
CRUD.saveMeter()
}
}
class PropertiesViewController: UIViewController, UITextFieldDelegate {
var oldMeterFromCell = String()
//variables to set
var OutKWHFromTextField = Float()
var OutKWFromTextField = Float()
var OutKVARHFromTextField = Float()
var newMeterNumberFromTextField = String()
var multiplierFromTextField = Float()
@IBOutlet weak var OldMeterLabel: UILabel!
//new meter properties
@IBOutlet weak var OutKWH: UITextField!
@IBOutlet weak var OutKW: UITextField!
@IBOutlet weak var OutKVARH: UITextField!
@IBOutlet weak var newMeterNumber: UITextField!
@IBOutlet weak var multiplier: UITextField!
}
我已经尝试使用 init() 和必需的 init() 从它们的每个 class 中初始化 UITextField 和开关,我也尝试使用便利的 init(),我也用初始化它们自定义设置函数。我还在 The CRUDController Class 上为两个 classes 创建了一个实例,但是当我点击保存按钮时,文本值仍然返回 nil。我不能使用 segue,因为我有 2 个视图,即使可以我也不想。我需要从 CRUDController class 访问原始 PropertiesController 和 ConditionsController,但我不知道该怎么做,因为我对委托的概念以及如何使事情正常工作感到非常困惑,所以我需要代码解决了问题,没有概念
我发现可以解决此问题的唯一方法是将 StoryBoard 中不同视图的所有开关、UITextfields、操作等连接到一个可以访问所有元素的 class。这样就不需要实例化一个 Class 来访问另一个。