我有一个计算器类,第一个用于插入值的ViewController和第二个用于显示计算结果的ViewController.不幸的是,如果我点击按钮,我会收到一个名为"无法解开Optional.None"的错误.我知道语法有问题,但我不知道如何改进它.
第一个Viewcontroller中的按钮在故事板中设置为"Segue:Show(例如Push)",如果他被轻击,则切换到secondViewController.
计算器类是这样的:
class Calculator: NSObject {
func calculate (a:Int,b:Int) -> (Int) {
var result = a * b
return (result)
}
}
Run Code Online (Sandbox Code Playgroud)
Viewcontroller调用该函数,插入一个/ b并想要更改位于secondviewcontroller中的标签:
class ViewController: UIViewController {
@IBAction func myButtonPressed(sender : AnyObject) {
showResult()
}
var numberOne = 4
var numberTwo = 7
var myCalc = Calculator()
func showResult () {
var myResult = myCalc.calculate(numberOne, b: numberTwo)
println("myResult is \(String(myResult))")
var myVC = secondViewController()
myVC.setResultLabel(myResult)
}
Run Code Online (Sandbox Code Playgroud)
这是secondViewController的代码
class secondViewController: UIViewController {
@IBOutlet var myResultLabel : UILabel = nil
func setResultLabel (resultValue:Int) {
myResultLabel.text = String(resultValue)
}
init(coder aDecoder: NSCoder!)
{
super.init(coder: aDecoder)
}
Run Code Online (Sandbox Code Playgroud)
RM *_*Vos 16
在Swift中,默认情况下一切都是公开的.在类之外定义变量:
import UIKit
var placesArray: NSMutableArray!
class FirstViewController: UIViewController {
//
..
//
}
Run Code Online (Sandbox Code Playgroud)
然后访问它
import UIKit
class TableViewController: UITableViewController {
//
placesArray = [1, 2, 3]
//
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是FirstViewController没有引用 的实例SecondViewController。因此,这一行:
secondViewController.setResultLabel(myResult)
Run Code Online (Sandbox Code Playgroud)
什么都不做(除了可能导致错误Can't unwrap Optional.None)。有几种方法可以解决这个问题。如果您使用故事板segues,您可以使用-prepareForSegue的方法UIViewController。这是一个例子:
在第一个视图控制器中:
override func prepareForSegue(segue: UIStoryboardSegue!,sender: AnyObject!){
//make sure that the segue is going to secondViewController
if segue.destinationViewController is secondViewController{
// now set a var that points to that new viewcontroller so you can call the method correctly
let nextController = (segue.destinationViewController as! secondViewController)
nextController.setResultLabel((String(myResult)))
}
}
Run Code Online (Sandbox Code Playgroud)
注意:此代码不会按原样运行,因为该函数无法访问结果变量。你必须自己弄清楚:)
| 归档时间: |
|
| 查看次数: |
24074 次 |
| 最近记录: |