2016-07-17 1 views
0

私は、MainTableViewControllerと呼ばれるクラスと、MainTableViewというIBOutletというクラスを持っています。デリゲート関数でテーブルビューをリロードしようとすると、Fatal Error: found nil while unwrapping an optional valueというコンソールで読み取るエラーがEXC_BAD_INSTRUCTIONになっています。Swiftのテーブルデータをリロードする?

私は私のクラスのViewDidLoad方法で変数MainTableViewをテストするとき、それはゼロではありません。しかし、デリゲート関数内でテストすると、nilになります。

私はここで間違っていますか?コンセントをテーブルビューに使用してテーブルデータをリロードできないのはなぜですか?

MainTableView(私のアウトレット)の代わりにtableViewを使用しようとしても、私は大量のエラーが発生するので、そうであってはいけません。

import UIKit 
import SwiftyJSON 

class MainTableViewController: UITableViewController, SettingsSidebarViewDelegate { 

@IBOutlet var settings: UIBarButtonItem! 

@IBOutlet var MainTableView: UITableView! 

var NumberofRows = 0 
var names = [String]() 
var descriptions = [String]() 
var categories = [String]() 
var types = [String]() 
var series = [String]() 
var groups = [String]() 

func parseJSON(){ 
    let path = NSBundle.mainBundle().URLForResource("documents", withExtension: "json") 

    let data = NSData(contentsOfURL: path!) as NSData! 

    let readableJSON = JSON(data: data) 


    NumberofRows = readableJSON["Documents"].count 


    for i in 1...NumberofRows { 
     let doc = "Doc" + "\(i)" 
     let Name = readableJSON["Documents"][doc]["name"].string as String! 
     let Description = readableJSON["Documents"][doc]["description"].string as String! 
     let Category = readableJSON["Documents"][doc]["category"].string as String! 
     let Type = readableJSON["Documents"][doc]["type"].string as String! 
     let Series = readableJSON["Documents"][doc]["tags"]["series"].string as String! 
     let Group = readableJSON["Documents"][doc]["tags"]["group"].string as String! 

     names.append(Name) 
     descriptions.append(Description) 
     categories.append(Category) 
     types.append(Type) 
     series.append(Series) 
     groups.append(Group) 

    } 


} 



func showTags(showTags: Bool) { 

    tableView.reloadData() 
} 



func showTimestamp(showTimeStamp: Bool) { 
    tableView.reloadData() 
} 


override func viewDidLoad() { 
    super.viewDidLoad() 

    parseJSON() 



    //Sets button title to gear, sets button actions (to open menu) 
    settings.title = NSString(string: "\u{2699}\u{0000FE0E}") as String! 
    let font = UIFont.systemFontOfSize(25); 
    settings.setTitleTextAttributes([NSFontAttributeName: font], forState:UIControlState.Normal) 
    settings.target = self.revealViewController() 
    settings.action = #selector(SWRevealViewController.rightRevealToggle(_:)) 

     } 




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

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return NumberofRows 
} 




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

    let cell = tableView.dequeueReusableCellWithIdentifier("MainTableCell", forIndexPath: indexPath) as! MainTableViewCell 


    if names.count != 0{ 
     cell.fileName.text = names[indexPath.row] 
     cell.fileDescription.text = descriptions[indexPath.row] 
     cell.fileCategory.text = categories[indexPath.row] 
     cell.fileType.text = types[indexPath.row] 

     cell.options.setTitle(NSString(string: ":") as String!, forState: .Normal) 

     cell.tag1.text = series[indexPath.row] 
     cell.tag2.text = groups[indexPath.row] 

     if showTagsVal{ 
      cell.tag1.hidden = false 
     } 
     else{ 
      cell.tag1.hidden = true 
     } 
     if showTimeStampVal{ 
      cell.tag2.hidden = false 
     } 
     else{ 
      cell.tag2.hidden = true 
     } 



    } 



    return cell 
} 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    self.performSegueWithIdentifier("showView", sender: self) 
} 

// 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?) { 
    if(segue.identifier == "showView"){ 
     let detailVC: DetailViewController = segue.destinationViewController as! DetailViewController 
     let indexPath = self.MainTableView.indexPathForSelectedRow! 
     detailVC.text = names[indexPath.row] 

     self.MainTableView.deselectRowAtIndexPath(indexPath, animated: true) 

    } 

} 

}

+0

あなたの 'MainTableViewController'コードを表示してください。 – Fujia

+0

@Fujiaがコードを追加しました –

+0

デリゲートメソッドを呼び出すコードを表示 – dan

答えて

0

あなたMainTableViewControllerUITableViewControllerのサブクラスであるとして、それはすでにビルトインテーブルビューをリンクしています。 MainTableViewコンセント(およびインターフェースビルダーで行ったすべてのもの)を削除してください。テーブルビューにアクセスする必要があるときは、UITableViewControllerから継承したtableViewプロパティを使用してください。

+0

お役立ち情報しかし、私がそれをやった後、コンソールでExc Bad Instructionエラーが発生しました。致命的なエラー:オプションの値をアンラッピングしている間に予期せずnilが見つかりました。それは私がバーボタン項目のタイトルを設定している行で起こります。その行を削除すると、その行のターゲットとアクションを定義する行の下に移動します。前に、これらの行はうまくいきました。違いは何ですか? –

+0

'settings'アウトレットがあなたのストーリーボードのバーアイテムに接続されていません。 – Fujia

+0

私はバーのボタンがうまく動作し、メニュー内のスイッチを押してクラッシュするまでメニューを開くと思います –

関連する問題