2016-10-20 53 views
1


只是我正在行使委託模式。我創建了一個簡單的應用程序,在該應用程序中,代理向UIViewController發送消息,說明是否停止或啓動UIActivityIndi​​catorView。不幸的是,我得到以下錯誤:錯誤阿塔爾:意外地發現無解釋可選值時。 這似乎是UIActivityIndi​​catorView未初始化。我不明白我錯在哪裏。代表和UIActivityIndi​​catorView錯誤

protocol ProgressBarDelegate { 
     func UpdateProgressBar(progress: Bool) 
    } 


    class Dao: NSObject { 

     var delegate: ProgressBarDelegate? 
     override init() { 
      super.init() 
      //DELEGATO 
      //I who should I send the message? to FirstViewController 
      let messaggero = FirstViewController() 
      self.delegate = messaggero 
      scriviUnMessaggio(progress: true) 
     } 
func scriviUnMessaggio(progress: Bool){ 
     print("I'm writing a message ...") 
     delegate?.UpdateProgressBar(progress:progress)  
    } 

我控制器

class FirstViewController: UIViewController,ProgressBarDelegate { 

    @IBOutlet var activity: UIActivityIndicatorView! 

    func UpdateProgressBar(progress: Bool){ 

     print("I received the message from Dao class (the delegate)") 

     switch progress{ 
     case true: 
     // At this point I get the following error:Fatal error: unexpectedly found nil while unwrapping an Optional value 


      self.activity.startAnimating() 
     case false: 
      self.activity.stopAnimating() 
     default: 
      self.activity.startAnimating() 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let dao = Dao() 

     /// dao.caricamentoDati() 
+0

你連接活動視圖插座? – rmaddy

+0

(是)組件在我的故事板中正確連接 – Diego

+0

顯然不然,您不會得到該錯誤。在'self.activity.startAnimating()'行放置一個斷點,你會發現'self.activity'是'nil'。 – rmaddy

回答

1

的問題是,你要創建的FirstViewControllerDao初始化一個新的對象。由於FirstViewController對象不是通過xib/storyboard創建的,因此插座未連接。這就是爲什麼它給墜毀在self.activity.startAnimating()

將委託selfviewDidLoad

更改您的DOA的init方法如下

class Dao: NSObject { 

    var delegate: ProgressBarDelegate? 
    init(delegate: ProgressBarDelegate) { 
    super.init() 
    //DELEGATO 
    //I who should I send the message? to FirstViewController 
    self.delegate = delegate 
    scriviUnMessaggio(progress: true) 
    } 
    func scriviUnMessaggio(progress: Bool){ 
    print("I'm writing a message ...") 
    delegate?.UpdateProgressBar(progress:progress) 
} 

然後在viewDidLoad中做到這一點

override func viewDidLoad() { 
    super.viewDidLoad() 
    let dao = Dao(delegate: self) 
} 
+0

謝謝您的回答,不幸的是我得到了同樣的錯誤:( – Diego

+0

@Diego讓我知道編輯的答案是否適合你 –

+0

對不起,我沒有讀你的消息,現在嘗試 – Diego

相關問題