2014-11-24 21 views
8

giống như trong tiêu đề, tôi đang cố thay đổi văn bản nhãn khi nhấp vào nút. Lỗi xuất hiện ở dòng self.playerChoice.text = "You: Rock"Swift: văn bản nhãn -> "lỗi nghiêm trọng: không tìm thấy nil trong khi mở một giá trị Tùy chọn"

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

là "playerChoice" khởi tạo? Bạn đã kết nối các cửa hàng trong IB. – gagarwal

+0

nên được, tôi lấy những bước cần thiết trong việc thêm nhãn – artie711

Trả lời

0

Tôi đã thử mã này và nó làm việc tốt cho tôi:

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

Cập nhật mã của tôi, vẫn làm việc doesnt – artie711

+0

Cùng một lỗi như trước – artie711

+0

Yep, tôi thậm chí đã xóa nó và tái tạo liên kết. Theo thanh tra kết nối cho nhãn "bạn", lựa chọn trình phát được kết nối với bộ điều khiển xem dưới tham chiếu các cửa hàng – artie711

3

Hình như máy nghe nhạc lựa chọn không được khởi tạo.

@IBOutlet var playerChoice: UILabel! 

Có thể mất kết nối giữa đầu ra và bảng InterfaceBuilder/Storyboard. Thử kết nối lại.

tôi đã tạo ra một bản demo nhỏ và tất cả mọi thứ hoạt động tốt:

enter image description here

Kiểm tra xem các vòng tròn ở phía bên trái của IBOutlet của bạn được lấp đầy. Nếu không, kết nối sẽ bị mất.

+0

Điều duy nhất tôi làm là kiểm soát, nhãn click chuột phải và kéo để viewController. Trong thanh tra kết nối, tôi có: Player Choice được kết nối để xem bộ điều khiển dưới tham chiếu các cửa hàng. – artie711

+0

Tôi đã cập nhật câu trả lời của mình. – Stefan

+0

Yep, tất cả các vòng tròn được làm đầy, tôi cũng cập nhật mã, vẫn doesnt work – artie711

18

Tôi chạy vào vấn đề này và nó bật ra rằng các nhãn mà tôi đã cố gắng để chỉnh sửa không tồn tại đồng thời mã chạy.

Hóa ra tôi đã tham chiếu cùng một bộ điều khiển chế độ xem từ chế độ xem phụ huynh chế độ xem vùng chứa con. Các nhãn tôi đã cố gắng thay đổi chỉ trong khung nhìn vùng chứa nhưng khi cả hai lượt xem được tải, nó chạy trình điều khiển xem cho cả hai vì vậy nó cố gắng tìm các nhãn không tồn tại trong chế độ xem gốc và đã ném lỗi ở trên.

Vì vậy, các bài học tôi đã học ... Nếu một tham chiếu đến một đối tượng xem là ném một NIL ..

  • The View không được ánh xạ đúng cách để View Controller.
  • Đối tượng trong chế độ xem không được ánh xạ tới IBOutlet tham chiếu.
  • Hoặc như trong trường hợp của tôi, có nhiều chế độ xem được kết nối với cùng một Trình điều khiển chế độ xem và các tham chiếu để xem các đối tượng trong một chế độ xem không được tìm thấy ở chế độ xem khác.
2

Tôi đã gặp sự cố tương tự trong Xcode 6.2. Tôi sử dụng XIB riêng lẻ thay vì bảng phân cảnh. Vấn đề đối với tôi là với Swift, Xcode không tự động kết hợp XIB với bộ điều khiển xem nếu các tên giống nhau. Do đó các IBOutlets cho các nhãn được trỏ đến nil gây tử vong.

Bạn có thể thay đổi viewcontroller.xib được gọi là modulename.viewcontroller.xib để xcode có thể liên kết nó với trình điều khiển chế độ xem và sự cố sẽ biến mất.

Các tuỳ chọn khác được đề cập về chủ đề này:

Can't Load UIViewController XIB file in Storyboard in Swift

2

gì cố định này đối với tôi (và nó được tôi mọi, đặc biệt là khi bạn là người mới sử dụng cốt truyện) là để đảm bảo rằng bạn đang khởi tạo điều khiển của bạn xem như vậy:

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

thay vì đứng một mình cách xib:

slideShowVC = WWSlideShowVC() 

Hoặc nếu không tất cả các cửa hàng của bạn sẽ được nil na nhiều đau đầu sẽ sớm làm theo.

Các vấn đề liên quan