我在Swift代码中有一个int的选择器视图。它在一个名为数字的数组中有数字1-7。当我要求在didSelectRow
函数内打印viewWillAppear
时,它会打印正确的数字。但在我提交的tapped函数中,它只打印0.它也在let numbers = [1,2,3,4,5,6,7]
var days = Int()
override func viewDidLoad() {
super.viewDidLoad()
self.pickerView.delegate = self
self.pickerView.dataSource = self
}
override func viewWillAppear(_ animated: Bool) {
print(days)
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return String(numbers[row])
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return numbers.count
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
var days = numbers[row]
print(days)
}
@IBAction func submitTapped(_ sender: Any) {
databaseRef.child("numbers").child(self.TextField.text!).setValue(["thename" : UserDefaults.standard.value(forKey: "nametext")])
print(days)
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(days) , execute: {
databaseRef.child("numbers/\(self.TextField.text!)").removeValue()
})
中执行了此操作。
我基本上希望该行是一个变量,我可以将其用作int来延迟一些代码。
{{1}}
有人知道为什么它总是在提交的tapped函数中返回零?
答案 0 :(得分:1)
简单地替换
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
var days = numbers[row]
print(days)
与
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
days = numbers[row]
print(days)
您的代码无法正常工作,因为您正在创建新变量并且您没有引用您的实例变量。
答案 1 :(得分:0)
您正在使用days
构造函数初始化Int()
,0
构造函数始终为viewWillAppear(_:)
。因此,在您的0
方法中,days
会被打印出来,因为pickerView(_:didSelectRow:inComponent:)
初始化为{1}}。但是,在var
方法中,您使用days
关键字创建一个名为pickerView(_:didSelectRow:inComponent:)
的新变量,该变量位于本地days
方法,全局0
变量永远不会更改,并且始终等于submitTapped(_:)
。因此,稍后在您的days
方法中,全局0
仍为days
。
我假设您要将pickerView(_:didSelectRow:inComponent:)
方法中的全局numbers[row]
变量设置为var
。为此,您必须删除days
内pickerView(_:didSelectRow:inComponent:)
旁边的days
关键字。在该方法中,您可以将其引用为self.days
或var
,只要您不使用let
或days
关键字重新声明{{1在那个方法里面