2016-06-05 4 views
1

Мне нужно закодировать приложение для школьного проекта, чтобы мы получили библиотеку PDF с категориями и подробный вид выбранного PDF. Проблема заключается в том, что когда я выбираю категорию сбой приложения, и я получаю эту ошибку «фатальная ошибка: неожиданно найденная nil при развертывании необязательного значения» Я заметил, что это когда я перезагружаю данные в этом представлении, что он сбой. линия, где я получаю ошибку является Open.target = self.revealViewController()self.revealViewController() error return nil

Вот весь мой файл:

// 
// TableViewControllertest.swift 
// ProjetSwift 
// 
// Created by geoffrey dalfin on 08/04/2016. 
// Copyright © 2016 geoffrey dalfin. All rights reserved. 
// 

import UIKit 
import Alamofire 

class TableViewControllertest: UITableViewController { 

@IBOutlet weak var titrePDF: UILabel! 
@IBOutlet weak var Open: UIBarButtonItem! 

@IBOutlet weak var titleView: UINavigationItem! 
var TabPDF = [Dictionary<String, AnyObject>]() 
var selectedCategorie = String("") 




override func viewDidLoad() { 
    if selectedCategorie == "" { 
     loadDataPDF() 
    } else { 
     LoadPDFCateorie(selectedCategorie) 
    } 

    super.viewDidLoad() 
    tableView.delegate = self 
    tableView.dataSource = self 
    Open.target = self.revealViewController() ***<== ERROR COMES FROM HERE*** 
    //Quand on clique dessus, sa on appele le revealViewController 
    Open.action = Selector("revealToggle:") 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
} 

func loadDataPDF(){ 
    Alamofire.request(.GET, "http://perso.montpellier.epsi.fr/~geoffrey.dalfin/ProjetE4/requetes/ListePDF.php").responseJSON{ 
     response in switch response.result{ 
     case.Success: 
      if let PDF = response.result.value as? [Dictionary<String, AnyObject>]{ 
       self.TabPDF = PDF 
       self.tableView.reloadData() 
      } 
     case.Failure(let error): 
      print(error) 
     } 
    } 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 
    return TabPDF.count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cellule = tableView.dequeueReusableCellWithIdentifier("cellule" ,forIndexPath: indexPath) as! TableViewCell 
    let P = TabPDF[indexPath.row] 
    cellule.titrePDF?.text = P["Nom"] as? String 
    return cellule 
} 


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "detail" { 
     var details = segue.destinationViewController as!ViewDetailPDF 

     var indexPath = NSIndexPath() 

     indexPath = self.tableView.indexPathForSelectedRow!; 

     details.test = ((TabPDF[indexPath.row] as! [String: AnyObject])) 

    } 
} 


func LoadPDFCateorie(categorie : String){ 
    print(categorie) 
    Alamofire.request(.GET, "http://perso.montpellier.epsi.fr/~geoffrey.dalfin/ProjetE4/requetes/RequeteCategorie.php?categorie="+categorie).responseJSON{ 
     response in switch response.result{ 
     case.Success: 
      print(String(response.result.value)) 
      if let PDF = response.result.value as? [Dictionary<String, AnyObject>]{ 
       self.TabPDF = PDF 
       self.tableView.reloadData() 
      } 
     case.Failure(let error): 
      print(error) 
     } 

    } 
} 






// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
/* override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
// Get the new view controller using segue.destinationViewController. 
// Pass the selected object to the new view controller. 
    if (segue.identifier == "detail") { 
     // pass data to next view 
     var nextScene = segue.destinationViewController as! ViewDetailPDF 

     if let indexPath = self.tableView.indexPathForSelectedRow! { 
     // Pass the selected object to the new view controller 
      let selectedPDF = TabPDF[indexPath.row] 
      nextScene.DetailPDF = selectedPDF 
     } 
    } 
}*/ 
/* override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { // Fonction pour passer des données d'un controller à un autre 
    let destViewController : ViewDetailPDF = segue.destinationViewController as! ViewDetailPDF 
    let selectedIndex = self.tableView.indexPathForCell(sender as! UITableViewCell) 
    destViewController.DetailPDF = TabPDF // On fait passer nos notes 
}*/ 




} 

У меня есть файл с функцией в нем, но он был разработан другом, используя плагин, так что я надеюсь, что это это хорошая часть файла:

@protocol SWRevealViewControllerDelegate<NSObject> 

    @optional 

    // The following delegate methods will be called before and after             the front view moves to a position 
    - (void)revealController:(SWRevealViewController *)revealController     willMoveToPosition:(FrontViewPosition)position; 
    - (void)revealController:(SWRevealViewController *)revealController  didMoveToPosition:(FrontViewPosition)position; 

    // This will be called inside the reveal animation, thus you can use  it to place your own code that will be animated in sync 
    - (void)revealController:(SWRevealViewController *)revealController animateToPosition:(FrontViewPosition)position; 
+1

Вы можете указать код для 'opensViewController()' – Cjay

+0

Какую версию 'SWRevealViewController' вы используете? – Sulthan

ответ

4

self.revealViewController() возвращает родительский контроллер типа SWRevealViewController.

Если ваш контроллер не находится в иерархии вида SWRevealViewController, метод вернет nil.

В viewDidLoad у вашего контроллера нет родителей, и revealViewController() всегда будет возвращать nil.

Вы должны позвонить revealViewController() только тогда, когда ваш контроллер виден, то есть в viewDidAppear:. Никогда в viewDidLoad.