【发布时间】:2014-09-27 21:58:32
【问题描述】:
我有一些运行相当复杂算法的代码。我想组合一个相当简单的 UI,它允许我以某种图形方式监控算法中各种变量的值——把它想象成某种仪表板。
所以,为了简单起见,假设我有一个如下所示的算法。它在值向量中搜索与目标值最接近的两个值:
import Foundation
class algorithm {
var numbers = [Double]()
let numberOfRandoms = 1000
dynamic var a: String
dynamic var b: String
init () {
// Load initial vector with some random numbers between 0 and 1
for _ in 1...numberOfRandoms {
numbers.append(Double(arc4random()) / Double(UINT32_MAX))
}
a = " "
b = " "
}
func findTheTwoNumbersThatAddUpTheClosestToTarget(target: Double) {
//Initializing this to a very large value
var currentBestSum = 1000.0
//Begin brute force search for the optimal solution
for i in 0...numbers.count-2 {
for j in i+1...numbers.count-1 {
//Check to see if the current candidate exceeds the best solution
if abs(numbers[i] + numbers[j] - target) < currentBestSum {
//If it does, store the new champion
a = String(i)
b = String(j)
//And reset the current top score to match
currentBestSum = abs(numbers[i] + numbers[j]-target)
}
}
}
}
}
现在,这只是一个简单(且愚蠢)的示例,但它适合这些目的。我基本上想创建一个简单的 UI,在它运行时(动态地)显示进程中的重要值。
在这个例子中,假设我只想在算法执行时显示两个标签,其中包含两个领导者的索引值。
我在情节提要中创建了标签。
然后,我在 ViewController 中创建了 IBOutlets(实际上,当我 Ctrl 拖动时,情节提要为我完成了):
class ViewController: NSViewController {
@IBOutlet weak var a: NSTextField!
@IBOutlet weak var b: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override var representedObject: AnyObject? {
didSet {
// Update the view, if already loaded.
}
}
}
然后,我 ctrl 将标签拖到算法类中的 a 和 b 以创建绑定。
最后,我在视图控制器中创建一个类变量,并在 viewDidLoad 方法中实例化它。这似乎不是正确的做法——也许是。似乎您希望将界面和数据分开...
事实上,标签确实会显示出来——但它们从不显示 a 和 b 的任何值。它们只显示默认文本。
不知道我做错了什么。
帮忙!?
P.S.,作为对 Anthony Kong 的回应,我确实认识到我可以手动同步代码中的所有视图元素,但我认为使用绑定的全部目的是避免必须进行手动同步。我只是不知道如何设置它。
【问题讨论】:
标签: macos user-interface binding swift storyboard