Swift - 新手问题。在不同的文件、函数和视图之间传递变量值
Swift - Newbie question. Passing variable values between different files, functions and views
这里的新手 swift 程序员需要一些可能微不足道的帮助...
这是在不同的文件中,不同的视图:
class CanvasContainerView: UIView {
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
// here are all of the calculations that lead to scoreString being calculated..
var scoreString = round(1000 * accuracyTotal / angleTotal)
}
//lots of other code
}
我需要我计算的“scoreString”的值可以在不同的文件、不同的控制器中访问。如果我使用 TouchesMoved 函数,我如何传递这个值?下面是我如何尝试在不同的文件中实现它,但由于范围内没有“scoreString”而惨遭失败:
import UIKit
class CanvasMainViewController: UIViewController {
@IBOutlet weak var ScoreText: UITextField!
/// Prepare the drawing canvas.
/// - Tag: CanvasMainViewController-viewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
ScoreText.text = "\(CanvasContainerView.touchesMoved(scoreString))"
}
//lots of code
}
最后我希望我的分数显示在屏幕顶部:
所以我知道 Stack 上已经有这样的问题,但我的问题具体是我使用这个“touchesMoved”覆盖函数,它不会让我 return 任何值。它大喊它需要 void return 类型。
如有任何帮助,我将不胜感激。
显然在文件顶部声明的 var 前面添加 public 解决了问题。感谢您参与尝试帮助我。
使用委托是个好方法:
// the protocol (ie the method called by container view in the controller)
protocol CanvasContainerViewDelegate {
func scoreUpdate(fromView view:CanvasContainerView, newScore: Double)
}
class CanvasContainerView: UIView {
// the delegate that will be called
var delegate: CanvasContainerViewDelegate?
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
// here are all of the calculations that lead to scoreString being calculated..
var scoreString = round(1000 * accuracyTotal / angleTotal)
// Telling the delegate the new score value
delegate?.scoreUpdate(fromView: self, newScore: scoreString)
}
//lots of other code
}
class CanvasMainViewController: UIViewController, CanvasContainerViewDelegate {
@IBOutlet weak var ScoreText: UITextField!
@IBOutlet weak var containerView: CanvasContainerView!
/// Prepare the drawing canvas.
/// - Tag: CanvasMainViewController-viewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
// set the controller as a delegate of the view
containerView.delegate = self
}
// Update the score (called by the view)
func scoreUpdate(fromView view: CanvasContainerView, newScore: Double) {
ScoreText.text = "\(newScore)"
}
//lots of code
}
这里的新手 swift 程序员需要一些可能微不足道的帮助...
这是在不同的文件中,不同的视图:
class CanvasContainerView: UIView {
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
// here are all of the calculations that lead to scoreString being calculated..
var scoreString = round(1000 * accuracyTotal / angleTotal)
}
//lots of other code
}
我需要我计算的“scoreString”的值可以在不同的文件、不同的控制器中访问。如果我使用 TouchesMoved 函数,我如何传递这个值?下面是我如何尝试在不同的文件中实现它,但由于范围内没有“scoreString”而惨遭失败:
import UIKit
class CanvasMainViewController: UIViewController {
@IBOutlet weak var ScoreText: UITextField!
/// Prepare the drawing canvas.
/// - Tag: CanvasMainViewController-viewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
ScoreText.text = "\(CanvasContainerView.touchesMoved(scoreString))"
}
//lots of code
}
最后我希望我的分数显示在屏幕顶部:
所以我知道 Stack 上已经有这样的问题,但我的问题具体是我使用这个“touchesMoved”覆盖函数,它不会让我 return 任何值。它大喊它需要 void return 类型。
如有任何帮助,我将不胜感激。
显然在文件顶部声明的 var 前面添加 public 解决了问题。感谢您参与尝试帮助我。
使用委托是个好方法:
// the protocol (ie the method called by container view in the controller)
protocol CanvasContainerViewDelegate {
func scoreUpdate(fromView view:CanvasContainerView, newScore: Double)
}
class CanvasContainerView: UIView {
// the delegate that will be called
var delegate: CanvasContainerViewDelegate?
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
// here are all of the calculations that lead to scoreString being calculated..
var scoreString = round(1000 * accuracyTotal / angleTotal)
// Telling the delegate the new score value
delegate?.scoreUpdate(fromView: self, newScore: scoreString)
}
//lots of other code
}
class CanvasMainViewController: UIViewController, CanvasContainerViewDelegate {
@IBOutlet weak var ScoreText: UITextField!
@IBOutlet weak var containerView: CanvasContainerView!
/// Prepare the drawing canvas.
/// - Tag: CanvasMainViewController-viewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
// set the controller as a delegate of the view
containerView.delegate = self
}
// Update the score (called by the view)
func scoreUpdate(fromView view: CanvasContainerView, newScore: Double) {
ScoreText.text = "\(newScore)"
}
//lots of code
}