gpt4 book ai didi

ios - Swift 将计算出的数据传递回之前的 View Controller

转载 作者:搜寻专家 更新时间:2023-10-30 22:23:54 24 4
gpt4 key购买 nike

我正在创建我的第一个简单的预算应用程序。基本上,我需要一些用户输入,比如月收入和储蓄目标。然后他们点击“开始”,应用程序会计算他们的每日预算等内容。

我遇到麻烦了。在所有计算之后,我显示“你每天可以花多少钱”(例如每天 20 美元),我将其从原始屏幕上的原始输入通过 segues 向前传递。

现在,在这个 VC (UserInfoVC) 中,我创建了一个按钮,让他们添加他们今天花了多少钱。因此,当他们点击这个“添加花费的钱”按钮时,我会打开一个新的 VC (AddSubtractMoney),我会在其中显示一个计算器,他们可以在其中输入他们今天花费了多少(即 12 美元),然后点击提交。

我将他们的输入与他们的每日预算进行比较以获得新的每日预算。

现在,我无法向后传递这个更新后的数字,无法将其显示在标签“dailySpendingLimitLabel”上的前一个 VC 上。我知道 segues 不是向后传递数据的最佳方式。

我尝试过闭包,但最终迷失在语法、协议(protocol)和委托(delegate)中(这是我第 2 个月的编码)。

有没有一种简单的方法可以将这些数据传递回之前的 VC 并将数据填充到之前的显示标签中?

下面是代码。

第一个片段来自 UserInfoVC,我在其中显示了他们最初输入的数据,这些数据是我搜索过的。第二个片段来自 AddSubtractMoney 类,我在其中放置了计算器并在一个函数内创建了一个对象“newestUpdate”,该函数允许我计算他们在计算器上输入的数字减去他们原来的每日预算。为了达到新的预算,我想向后呈现给 UserInfoVC

class UserInfoViewController : ViewController {

var userNamePassedOver : String?
var userDailyBudgetPassedOver : Double = 99.0
var userDailySavingsPassedOver : Double = 778.00
var userMonthlyEarningsPassedOver : Double?
var userDesiredSavingsPassedOver : Double?
var newAmountPassedBack : Double = 0.0


@IBOutlet weak var dailySavingsNumberLabel: UILabel!
@IBOutlet weak var userNameLabel: UILabel!
@IBOutlet weak var dailySpendingLimitLabel: UILabel!



override func viewDidLoad() {
super.viewDidLoad()

userNameLabel.text = userNamePassedOver
dailySpendingLimitLabel.text = String(format: "%.2f", userDailyBudgetPassedOver)
dailySavingsNumberLabel.text = String(format: "%.2f", userDailySavingsPassedOver)

}


@IBAction func addSubtractMoneyPressed(_ sender: UIButton) {

performSegue(withIdentifier: "addOrSubtractMoney", sender: self)


}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

if segue.identifier == "addOrSubtractMoney"{

let addOrSubtractMoneyVC = segue.destination as! AddSubtractMoney

addOrSubtractMoneyVC.dailyBudgetPassedThrough = userDailyBudgetPassedOver
}
}

}

extension UserInfoViewController: AddSubtractMoneyDelegate {

func calculatedValue(value: Double) {

dailySpendingLimitLabel.text = String(userDailyBudgetPassedOver - value)

}

}

import UIKit

protocol AddSubtractMoneyDelegate {
func calculatedValue(value: Double)
}

class AddSubtractMoney: UIViewController {

@IBOutlet weak var outputLabel: UILabel!

var runningNumber = ""
var finalNumberPassedOver : Double?
var amountPassedBackToUserInfo : Double = 0.0
var dailyBudgetPassedThrough : Double = 0.0

var delegate: AddSubtractMoneyDelegate?

override func viewDidLoad() {
super.viewDidLoad()

outputLabel.text = "0"


// Do any additional setup after loading the view.
}


@IBAction func buttonPressed(_ sender: UIButton) {
runningNumber += "\(sender.tag)"
outputLabel.text = runningNumber


}

@IBAction func submitNewInfo(_ sender: UIButton) {

// FIX FIX

AddSubtractMoneyController.addToMoneySpentArray(amountISpent: outputLabel.text!)

sendBackUpdatedNumber()

dismiss(animated: true, completion: nil)

}


@IBAction func allClearedPressed(_ sender: UIButton) {
runningNumber = ""
outputLabel.text = "0"
}

// THIS LINE PRODUCES THE CORRECT INPUT IN OUTPUT CONSOLE WHEN I PRINT- BUT I CANT FIGURE HOW TO TRANSFER IT BACK TO PREVIOUS VC

func sendBackUpdatedNumber(){

let newestUpdate = UserInfo(whatYouSpentToday: runningNumber, oldDailyBudgetPassed: dailyBudgetPassedThrough)

amountPassedBackToUserInfo = dailyBudgetPassedThrough - Double(runningNumber)!
newestUpdate.goalToSaveDaily = amountPassedBackToUserInfo

print(amountPassedBackToUserInfo)

self.delegate?.calculatedValue(value: amountPassedBackToUserInfo)


}


}

最佳答案

我的建议是使用回调闭包。与协议(protocol)/委托(delegate)相比,它的代码更少且更易于处理。

AddSubtractMoney 中声明一个 callback 变量并在传递 Double 值的 sendBackUpdatedNumber 中调用它

class AddSubtractMoney: UIViewController {

// ...

var callback : ((Double)->())?

// ...

func sendBackUpdatedNumber(){

let newestUpdate = UserInfo(whatYouSpentToday: runningNumber, oldDailyBudgetPassed: dailyBudgetPassedThrough)
amountPassedBackToUserInfo = dailyBudgetPassedThrough - Double(runningNumber)!
newestUpdate.goalToSaveDaily = amountPassedBackToUserInfo
print(amountPassedBackToUserInfo)
callback?(amountPassedBackToUserInfo)
}
}

prepare(for segue 中将闭包分配给 callback 变量并添加要在返回时执行的代码

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

if segue.identifier == "addOrSubtractMoney"{
let addOrSubtractMoneyVC = segue.destination as! AddSubtractMoney
addOrSubtractMoneyVC.callback = { result in
print(result)
// do something with the result
}
addOrSubtractMoneyVC.dailyBudgetPassedThrough = userDailyBudgetPassedOver
}
}

关于ios - Swift 将计算出的数据传递回之前的 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49205932/

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