2014-11-24 89 views
8

喜欢它在标题中说,我试图改变标签文本点击一个按钮。错误出现在线self.playerChoice.text = "You: Rock"Swift:标签文本 - >“致命错误:意外地发现零,同时展开一个可选值”

import UIKit 

class ViewController: UIViewController { 

var player : Int = Int() 

@IBOutlet weak var readyLabel: UILabel! 

@IBAction func noButton(sender: AnyObject) { 
    exit(0) 
} 

// --------------------------------------------------------- 

@IBOutlet var computerChoice: UILabel! 

@IBOutlet var playerChoice: UILabel! 

@IBOutlet var score: UILabel! 


// Variables ------------------------------------------------- 

let Rock : String = "Rock" 
let Paper : String = "Paper" 
let Scissors : String = "Scissors" 

//------------------------------------------------------------ 



override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    } 


// ---------------------------------------------------------------- 

@IBAction func rockButton(rockbut: UIButton) { 

    player = 0 
    var ai = arc4random_uniform(3) 
    self.playerChoice.text = "You: Rock" 

    } 

@IBAction func paperButton(paperbut: UIButton) { 

    player = 1 
    var ai = arc4random_uniform(3) 
    self.playerChoice.text = "You: Paper" 

    } 

@IBAction func scissorsButton(scissorsbut: UIButton) { 

    player = 2 
    var ai = arc4random_uniform(3) 
    self.playerChoice.text = "You: Scissors" 

     } 
    } 
+0

“playerChoice”是否已初始化?你有连接IB的插座吗? – gagarwal 2014-11-24 20:46:25

+0

应该是,我采取了添加标签 – artie711 2014-11-24 21:02:55

回答

0

我曾尝试此代码,它为我工作的罚款:

class ViewController: UIViewController { 

var player : Int = Int()  //Declare this globally 

@IBOutlet weak var readyLabel: UILabel! 

@IBAction func noButton(sender: AnyObject) { 
    exit(0) 
} 

// --------------------------------------------------------- 

@IBOutlet var computerChoice: UILabel! 

@IBOutlet var playerChoice: UILabel! 

@IBOutlet var score: UILabel! 


// Variables ------------------------------------------------- 

let Rock : String = "Rock" 
let Paper : String = "Paper" 
let Scissors : String = "Scissors" 

//------------------------------------------------------------ 

@IBAction func rockButton(rockbut: UIButton) { 
    player = 0 
    var ai = arc4random_uniform(3) 
    self.playerChoice.text = "You: Rock" 
} 



@IBAction func paperButton(sender: UIButton) { 
    player = 1 
    var ai = arc4random_uniform(3) 
    self.playerChoice.text = "You: Paper" 
} 

@IBAction func scissorsButton(sender: UIButton) { 
    player = 2 
    var ai = arc4random_uniform(3) 
    self.playerChoice.text = "You: Scissors" 
} 



override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    var p : String = "Undecided" 

    if (player == 0) { 
     var p: String = "Rock" 
    } else if (player == 1) { 
     var p: String = "Paper" 
    } else if (player == 2) { 
     var p: String = "Scissors" 
    } 


    } 

} 
+0

更新了我的代码,仍然没有工作 – artie711 2014-11-25 17:45:47

+0

和以前一样的错误 – artie711 2014-11-26 11:56:07

+0

是的,我甚至删除它并重新创建链接。在“you”标签的连接检查器下,播放器选择连接到参考插座下的视图控制器 – artie711 2014-11-26 12:02:19

3

看起来像玩家的选择没有初始化。

@IBOutlet var playerChoice: UILabel! 

也许连接插座和InterfaceBuilder/Storyboard丢失。尝试再次连接。

我创建了一个小的演示,一切工作正常:

enter image description here

检查你的IBOutlet中左边的圆圈被填满。否则,连接丢失。

+0

的必要步骤我唯一做的是控制,右键单击标签并拖动到viewController。在连接检查员中,我有:玩家选择连接到参考插座下的视图控制器。 – artie711 2014-11-24 20:58:03

+0

我已经更新了我的答案。 – Stefan 2014-11-24 21:35:34

+0

是的,所有的圈子都填满了,我也更新了代码,仍然没有工作 – artie711 2014-11-25 17:46:26

18

我就遇到了这个问题,事实证明,我是想编辑的标签并没有在当时的代码存在跑了。

原来我是从父视图引用同一视图控制器的子容器视图。我试图改变的标签只在容器视图中,但是当两个视图都加载时,它运行了两个视图控制器,所以它试图找到父视图中不存在的标签并抛出上述错误。

于是我明白了...如果一个视图对象的引用抛出一个NIL的教训..

  • 的看法是不正确映射到视图控制器。
  • 视图内的对象未映射到引用IBOutlet。
  • 或者在我的情况下,有多个视图连接到同一个视图控制器,并且在一个视图中对视图对象的引用在另一个视图中没有找到。
2

我在Xcode 6.2中遇到了同样的问题。 我使用单独的XIB而不是故事板。对我来说问题在于,在Swift中,如果名称相同,Xcode不会自动将XIB与视图控制器相关联。因此,标签的IBOutlets指向没有给予致命的。

您可以将viewcontroller.xib更改为modulename.viewcontroller.xib,以便xcode可以将其与视图控制器关联,并且问题消失。

更多选择是在这个线程中提到:

Can't Load UIViewController XIB file in Storyboard in Swift

2

什么固定的这对我来说(这让我每次,尤其是当你是初次使用故事板)是确保你正在初始化您的视图控制器,如下所示:

slideShowVC = (UIStoryboard(name: "Main",bundle: nil).instantiateViewControllerWithIdentifier("WWPhotoSlideShowVC") as! WWPhotoSlideShowVC) 

,而不是独立的厦门国际银行的方式:

slideShowVC = WWSlideShowVC() 

否则你的所有零售店将不会有很多令人头痛的问题很快出现。

相关问题