2016-07-17 4 views
0

ここでは何が起こっているのですか。私はMainTabeViewControllerと呼ばれるテーブルビュークラスを持っています。私はSettingsSidebarViewControllerと呼ばれるサイドバークラスを持っており、SW Revealを使ってメニューを表示します。メニューはというbar button itemで切り替わります。メニューはbar button itemで正常に動作します。メニューを押すと、メニューが切り替わります。スウィフトでスイッチを押した後のバーボタンの無し?

しかし、スイッチをクリックすると、アプリケーションがクラッシュし、というエラーがコンソールFatal error: unexpectedly found nil while unwrapping an optional valueに表示され始めます。スイッチを押した後、バーのボタン項目が何も表示されないのはなぜですか?

MAINTABLEVIEWCONTROLLER.swiftここ

import UIKit 
import SwiftyJSON 

class MainTableViewController: UITableViewController, SettingsSidebarViewDelegate { 

//HEERE IS THE BAR BUTTON ITEM CALLED SETTINGS <- <- <- 
@IBOutlet var settings: UIBarButtonItem! 


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 initSettings(){ 
    //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(_:)) 
    self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer()) 
} 



func showTags(showTags: Bool) { 
    tableView.reloadData() 
} 



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


override func viewDidLoad() { 
    super.viewDidLoad() 

    parseJSON() 
    initSettings() 

     } 




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.tableView.indexPathForSelectedRow! 
     detailVC.text = names[indexPath.row] 

     self.tableView.deselectRowAtIndexPath(indexPath, animated: true) 
    }}} 

SettingsSidebarViewController.swift

import UIKit 

protocol SettingsSidebarViewDelegate{ 
    func showTags(showTags: Bool); 
    func showTimestamp(showTimeStamp: Bool) 
} 

var showTagsVal = false 
var showTimeStampVal = false 

class SettingsSidebarViewController: UIViewController { 

var delegate: SettingsSidebarViewDelegate! = nil 

@IBOutlet weak var sidebar_title: UILabel! 

@IBOutlet var showTagsSwitch: UISwitch! 

@IBOutlet var showTimestampSwitch: UISwitch! 


@IBAction func switchPressed(sender: AnyObject) { 

    let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) 

    let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("main") as! MainTableViewController 
    self.presentViewController(nextViewController, animated:true, completion:nil) 


    let vc = MainTableViewController() 
    self.delegate = vc 

    if showTagsSwitch.on{ 
     showTagsVal = true 
     delegate.showTags(showTagsVal) 
    } 
    else{ 
     showTagsVal = false 
     delegate.showTags(showTagsVal) 
    } 

    if showTimestampSwitch.on{ 
     showTimeStampVal = true 
     delegate.showTimestamp(showTimeStampVal) 
    } 
    else{ 
     showTimeStampVal = false 
     delegate.showTimestamp(showTimeStampVal) 

    } 
} 
override func viewDidLoad() { 
    super.viewDidLoad() 
    sidebar_title.text = "Settings" 


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

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

助けに感謝します!私はこれが何か簡単なビューコントローラの移行に関する質問だと確信していますが、私はそれを理解するのには長すぎます。

+0

'MainTableViewController()'ストーリーボードのコントローラではないビューコントローラのブランドの新しいインスタンスを作成します。 **実際の**コントローラへの参照が必要です。 – vadian

+0

@vadian実際のコントローラをどのように参照していますか(まだスイッチ機能内にあります)? –

+0

実際には同じスコープ( 'nextViewController')の参照があります – vadian

答えて

2

問題は、MainTableViewControllerという新しいインスタンスを作成して代理人に割り当てることです。そのため、すべての初期化とバインディングが行われていないため、棒ボタン項目はnilです。あなたが代理人を変更し、すでにinstantiateViewControllerWithIdentifierとなったビューコントローラを割り当てる必要があり

self.delegate = nextViewController 
関連する問題