2017-02-04 3 views
1

私は別々のViewControllerクラスで2つのUITableviewを実装しました。 2番目のUItableViewのコードを正常に追加すると、プロジェクトがビルドされますが、ロード後に停止します。UITableViewがtableview.datasourceの開始時にクラッシュする

それは上の赤い線で停止します。これが第二の追加までは実現しなかったので

Thread 1 EXEC_BAD_INSTRUCTION (code-EXC_i386_INVOP,subcode=0x0)

fatal error: unexpectedly found nil while unwrapping an Optional value

:読み込みエラーで

tableView.delegate.dataSource = self 

2番目のビューコントローラのUItableviewおそらく私のコードが互いに衝突しているのだろうかと思います。両方のView Controllerのコピーを投稿します。私は何を変えるべきですか?

ところで:FilmsViewControllerは、アプリケーションがクラッシュする場所です。それは前MCViewControllerフィルムを追加することに取り組んでいたものの:

B:

class FilmsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 
    weak var tableView : UITableView! 
    var FilmArray = [String]() 

    let film_url = "https://www.testing.com/api/resources/films/1" 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return FilmArray.count 
    } 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 


     let cell = tableView.dequeueReusableCell(withIdentifier: "mycell", for:indexPath) as! FilmsAPITableViewCell 
     // Configuring Cell 
     cell.movieTitle.text = FilmArray[indexPath.row] 
     // Returning the cell 
     return cell 
    } 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.dataSource = self 
     tableView.delegate = self 
     let url:URL = URL(string: film_url)! 
     let session = URLSession.shared 

     let request = NSMutableURLRequest(url: url) 
     request.httpMethod = "GET" 
     request.setValue("740c94c51891c02b64d6c78840b478fe0b02fe2c", forHTTPHeaderField: "X-API-KEY") 
     request.setValue("Basic YmhlZW0uZW5nckBnbWFpbC5jb206YmgzM20=", forHTTPHeaderField: "Authorization") 
     request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 
     let paramString = "" 

     request.httpBody = paramString.data(using: String.Encoding.utf8) 

     let task = session.dataTask(with: request as URLRequest, completionHandler: { 
      (
      data, response, error) in 

      guard let _:Data = data, let _:URLResponse = response , error == nil else { 

       return 
      } 



      var json:Any? 

      do 
      { 
       if let existingData = data { 
        json = try JSONSerialization.jsonObject(with: existingData, options: []) 
       } 

       // Prasing JSON 
       if let parsedData = json as? [[String:Any]] { 
        for dict in parsedData { 
         if let title = dict["title"] as? String { 
          self.FilmArray.append(title) 
          print(json) 
         } 
        } 

        OperationQueue.main.addOperation({ 
         self.tableView.reloadData() 
        }) 
       } 
      } 
      catch 
      { 
       return 
      } 

      guard let server_response = json as? NSDictionary else 
      { 
       return 
      } 

      if let data_block = server_response["data"] as? NSDictionary 
      { 
       if let session_data = data_block["session"] as? String 
       { 
        // self.login_session = session_data 

        let preferences = UserDefaults.standard 
        preferences.set(session_data, forKey: "session") 

        // DispatchQueue.main.async(execute: self.LoginDone) 
       } 
      } 
     }) 

     task.resume() 

     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 



} 

MC:

class MCViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    let message_url = "https://www.testing.com/api/resources/get_film_message/film_id/3825" 
    let send_url = "https://www.testing.com/api/resources/send_film_message" 
    let film_id = "3825" 
    var messageArray = [String]() 
    weak var tableView : UITableView! 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return messageArray.count 
    } 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 


     let cell = tableView.dequeueReusableCell(withIdentifier: "msgContent", for:indexPath) as! MessageTableViewCell 
     // Configuring Cell 
     cell.msgContent.text = messageArray[indexPath.row] 
     // Returning the cell 
     return cell 
    } 



    @IBOutlet weak var MessageInput: UITextField! 
    @IBAction func Sendmsg(_ sender: Any) { 
     Sendmsg(username:MessageInput.text!, password: film_id) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.dataSource = self 
     tableView.delegate = self 
     // Do any additional setup after loading the view. 
     //let post_data: NSDictionary = NSMutableDictionary() 


     //  post_data.setValue(username, forKey: "username") 
     //  post_data.setValue(password, forKey: "password") 

     let url:URL = URL(string: message_url)! 
     let session = URLSession.shared 

     let request = NSMutableURLRequest(url: url) 
     request.httpMethod = "GET" 
     request.setValue("740c94c51891c02b64d6c78840b478fe0b02fe2c", forHTTPHeaderField: "X-API-KEY") 
     request.setValue("Basic YmhlZW0uZW5nckBnbWFpbC5jb206YmgzM20=", forHTTPHeaderField: "Authorization") 
     request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 
     // Do any additional setup after loading the view. 
     var paramString = "" 


     //  for (key, value) in post_data 
     //  { 
     //   paramString = paramString + (key as! String) + "=" + (value as! String) + "&" 
     //  } 
     // 
     request.httpBody = paramString.data(using: String.Encoding.utf8) 

     let task = session.dataTask(with: request as URLRequest, completionHandler: { 
      (
      data, response, error) in 

      guard let _:Data = data, let _:URLResponse = response , error == nil else { 

       return 
      } 



      let json: Any? 

      do 
      { 
       json = try JSONSerialization.jsonObject(with: data!, options: []) 
       if let parsedData = json as? [[String:Any]] { 
        for dict in parsedData { 
         if let title = dict["message"] as? String { 
          self.messageArray.append(title) 
          print(json) 
         } 
        } 
       } 
      } 
      catch 
      { 
       return 
      } 

      guard let server_response = json as? NSDictionary else 
      { 
       return 
      } 


      if let data_block = server_response["data"] as? NSDictionary 
      { 
       if let session_data = data_block["session"] as? String 
       { 
        // self.login_session = session_data 

        let preferences = UserDefaults.standard 
        preferences.set(session_data, forKey: "session") 

        // DispatchQueue.main.async(execute: self.LoginDone) 
       } 
      } 



     }) 

     task.resume() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func Sendmsg(username:String, password:String) 
    { 
     let post_data: NSDictionary = NSMutableDictionary() 


     post_data.setValue(username, forKey: "message") 
     post_data.setValue(password, forKey: "film_id") 

     let url:URL = URL(string: send_url)! 
     let session = URLSession.shared 

     let request = NSMutableURLRequest(url: url) 
     request.httpMethod = "POST" 
     request.setValue("740c94c51891c02b64d6c78840b478fe0b02fe2c", forHTTPHeaderField: "X-API-KEY") 
     request.setValue("Basic YmhlZW0uZW5nckBnbWFpbC5jb206YmgzM20=", forHTTPHeaderField: "Authorization") 
     request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData 

     var paramString = "" 


     for (key, value) in post_data 
     { 
      paramString = paramString + (key as! String) + "=" + (value as! String) + "&" 
     } 

     request.httpBody = paramString.data(using: String.Encoding.utf8) 

     let task = session.dataTask(with: request as URLRequest, completionHandler: { 
      (
      data, response, error) in 

      guard let _:Data = data, let _:URLResponse = response , error == nil else { 

       return 
      } 



      let json: Any? 

      do 
      { 
       json = try JSONSerialization.jsonObject(with: data!, options: []) 
       print(json) 
      } 
      catch 
      { 
       return 
      } 

      guard let server_response = json as? NSDictionary else 
      { 
       return 
      } 


//   if let data_block = server_response["data"] as? NSDictionary 
//   { 
//    if let session_data = data_block["session"] as? String 
//    { 
//     self.login_session = session_data 
//      
//     let preferences = UserDefaults.standard 
//     preferences.set(session_data, forKey: "session") 
//      
//     DispatchQueue.main.async(execute: self.LoginDone) 
//    } 
//   } 
//    


     }) 

     task.resume() 


    } 


    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
    } 
    */ 

} 

答えて

0
あなたが tableViewを初期化している

?それはnilかもしれないように思え....あなたはストーリーボード/ XIBを使用している場合、あなたはまた、IBOutletとしてtableViewをフックすることができます

tableView = UITableView(frame: frame)

+0

tableView = UITableView(frame:frame)?私はそれを呼んでいるのか分からない。もう少し説明できますか? –

+0

私はどこを呼びますか? –

+0

他に何かをする前に 'viewDidLoad'で呼び出すでしょう。 'frame'引数はあなたが望むx、yの位置と幅、高さを持つ' CGRect'でしょう。ビューのフレームはまだ計算されていないので、viewDidLoad'でビューのフレームに基づいてフレームを設定するのには注意が必要です。 'viewDidLoad'の' tableView = UITableView() '、' viewDidAppear'のような 'tableView.frame = CGRect(x:yourX、y:yourY、width:yourWidth、height:yourHeight)'も実行可能なオプションになります。 – Samantha

関連する問題