我正在学习Swift,目前在一个项目中使用两个ViewControllers。 第一控制器初始化数据并执行对第二控制器的切换。 第二个ViewController将一个新值添加到从第一个ViewController传入的变量中。 但是,当我取消segue并尝试更新第一个segue时,所有IBOutlet属性和变量突然变为nil。 这是通过记录FirstViewController的updateViewController()方法中的属性派生的。 提前谢谢你。
第一视图控制器
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
// Date Label
@IBOutlet weak var dateLabel: UILabel!
// Progress Bar
@IBOutlet weak var progressBar: UIProgressView?
// Progress Label
@IBOutlet weak var progressLabel: UILabel!
// Button Collection View
@IBOutlet weak var collectionView: UICollectionView!
// Current goal button
@IBOutlet weak var currentGoal: UIButton!
// Goal label
@IBOutlet weak var goalLabel: UILabel!
// Variable Initialization
// Initialize daily water goal
var dailyGoal = Float(20)
// Initialize current progress
var currentProgress = Float()
// Water counter variable
var waterDrank = Float(0)
var percentageProgress = Float(0.0)
override func viewDidLoad() {
super.viewDidLoad()
progressBar?.setProgress(0.0, animated: false)
progressBar!.transform = progressBar!.transform.scaledBy(x: 1, y: 3)
}
// MARK: - Button & Progress View Logic
func addProgress(amount: Float) {
// Add amount to the total amount drank
waterDrank += amount
print(waterDrank)
// Get the current progress in relation to the daily goal
let currentProgress = waterDrank / dailyGoal
// Set the new progress to the progressBar
progressBar?.setProgress(currentProgress, animated: true)
// Check if progress is below 0
if (dailyGoal - waterDrank) <= 0.0 {
// done
}
// Check if the daily goal has already been achieved
if waterDrank >= Float(dailyGoal) {
// Daily goal has been achieved - show message & abort code
showAlert(title: "done", message: "!!")
return
}
}
// MARK: - Segue Action
// Segue button to second view controller
@IBAction func changeGoal(_ sender: Any) {
performSegue(withIdentifier: "currentGoal", sender: self)
}
// Save variables
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let secondViewController = segue.destination as! SecondViewController
secondViewController.dailyGoal = self.dailyGoal
}
func updateViewController() {
// Log new daily goal
print(dailyGoal)
// Print progressBar object
print(waterDrank) // is 0, despite waterDrank having been increased in value before performing segue
print(progressBar?.progress) // is nil, despite having not been nil before performing segue
}
}
第二视图控制器
// Current goal label
@IBOutlet weak var currentGoal: UILabel!
// Goal picker
@IBOutlet weak var goalPicker: UIPickerView!
var dailyGoal = Float()
let newDailyGoal = [Int()]
// Initialize current progress
var currentProgress = Float()
// Water counter variable
var waterDrank = Float(0)
var percentageProgress = Float(0.0)
override func viewDidLoad() {
super.viewDidLoad()
// setting secondViewController as delegate & data source for the UIPicker
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
let vc = ViewController()
let newDailyGoal = [1500, 1750, 2000, 2250, 2500]
// Consider row
switch row {
case 0:
self.dailyGoal = Float(newDailyGoal[0])
vc.dailyGoal = self.dailyGoal
case 1:
self.dailyGoal = Float(newDailyGoal[1])
vc.dailyGoal = self.dailyGoal
case 2:
self.dailyGoal = Float(newDailyGoal[2])
vc.dailyGoal = self.dailyGoal
case 3:
self.dailyGoal = Float(newDailyGoal[3])
vc.dailyGoal = self.dailyGoal
case 4:
self.dailyGoal = Float(newDailyGoal[4])
vc.dailyGoal = self.dailyGoal
default:
print("daily goal is default: \(dailyGoal)")
}
// Export to ViewController.swift
return "\(Int(dailyGoal)) ml"
}
// MARK: - Save button segue logic
@IBAction func doneButton(_ sender: Any) {
dismiss(animated: true, completion: nil)
let firstViewController = ViewController()
firstViewController.updateViewController()
}
}
您的方案要求您将ViewController
实例传递给SecondViewController
,而不是像这里所做的那样创建一个新实例。 然后在done按钮操作中调用函数UpdateViewController
。 所以这里是你需要更新的内容。
在ViewController中:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let secondViewController = segue.destination as! SecondViewController
secondViewController.dailyGoal = dailyGoal
secondViewController.viewController = self
}
在SecondViewController中:
class SecondViewController: UIViewController {
weak var viewController: ViewController?
...
@IBAction func doneButton(_ sender: Any) {
dismiss(animated: true)
viewController?.updateViewController()
}
}