2016-03-31 18 views
0

ViewControllerの異なるボタンが別のメニューをtableViewControllerにロードするアプリケーションを作成しています。ボタンはセグの準備によってリンクされ、メニュー(配列)はcontentModeによってリンクされます。 1:朝食メニュー& 2:ランチメニュー。私はこれを設定する誰かからの助けがあったが、今はテーブルがデータをロードしていない...セルは、項目、情報と価格を表示する3つのラベルがあります。 contentModeが選択されると、コード内の値が変更されます。誰かが私のコードでこの問題を見ていますか?どうもありがとう!なぜ私のtableViewControllerはデータをロードしていませんか?

import UIKit 

class foodMenuController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
let foodMenuController = segue.destinationViewController as! foodTableViewController 

    if segue.identifier == "showBreakfast" { 
      foodMenuController.contentMode = 1 
    } else if segue.identifier == "showLunch" { 
     foodMenuController.contentMode = 2 
     } 
    } 


} 

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

import UIKit 

class foodTableViewCell: UITableViewCell { 

@IBOutlet weak var foodItem: UILabel! 
@IBOutlet weak var foodDescription: UILabel! 
@IBOutlet weak var foodPrice: UILabel! 

override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 
} 

override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 

    // Configure the view for the selected state 
} 

} 

import UIKit 

class foodTableViewController: UITableViewController { 

//Content Mode Selection in menu 
var contentMode = 0 

// THIS SHOULD BE LOADED WHEN CONTENT MODE is "1" --> BREAKFAST 
let breakfastItems = ["Bread", "Coffee", "Nada"] 
let breakfastInfo = ["Good", "Nice", "Nothing"] 
let breakfastPrice = ["$1", "$100", "$12,40"] 

// THIS SHOULD BE LOADED WHEN CONTENT MODE IS "2" --> LUNCH 
let lunchItems = ["Not bread", "Not Coffee", "Something"] 
let lunchInfo = ["Not good", "Not nice", "Yes"] 
let lunchPrice = ["$1", "$100", "$12,40"] 

var foodItems: [String] = [] 
var foodInfo: [String] = [] 
var foodPrice: [String] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 
    } 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(true) 
    switch (contentMode){ 
    case 1: contentMode = 1 
     foodItems = breakfastItems 
     foodInfo = breakfastInfo 
     foodPrice = breakfastPrice 
    case 2: contentMode = 2 
     foodItems = lunchItems 
     foodInfo = lunchInfo 
     foodPrice = lunchPrice 
    default: 
     break 
    } 
    tableView.reloadData() 
} 


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

} 

// Table view data source 

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

    override func tableView(tableView: UITableView, numberOfRowsInSection section: 
     Int) -> Int { 
     return foodItems.count 

} 


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

    let cellIdentifier = "Cell" 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! foodTableViewCell 

    cell.foodItem.text = foodItems[indexPath.row] 
    cell.foodDescription.text = foodInfo[indexPath.row] 
    cell.foodPrice.text = foodPrice[indexPath.row] 

     return cell 


    } 
} 

+0

この質問に答えると、おそらくそれをマークして閉じる必要があります。すでに重複しています。それを開いたままにしないでください。また、欠落箇所は何だったのか注意してください。また、普遍的な命名基準に従っていることを確認してください。 'class'名は大文字で始まらなければなりません。 – Mathews

+0

私は申し訳ありません@マシューズしかし、私はこの問題をはるかに長い間扱ってきたので、私はただそれを修正することを切望しています。しかし、私は値を印刷して、それはcontentMode "0"として戻ってくるので、問題がどこにあるか見る必要があります。 – Kevin

+0

'FoodMenuViewController'の' prepareForSegue'メソッドを見てください。 segue識別子が間違っていれば、必要に応じて 'contentMode'を設定しません。 – Mathews

答えて

0

私はあなたのプロジェクトを少し修正しました。 1. FoodMenuControllerUINavigationController StoryBoard

のルートは今もあなたがFoodTableViewController

override func viewDidLoad() { 
     super.viewDidLoad() 
     self.navigationController?.navigationBarHidden = false 
    } 

UINavigationBarが見えるようにすることができますFoodMenuController

@IBOutlet weak var bakeryButton: UIButton! 
@IBOutlet weak var breakfastButton: UIButton! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    self.navigationController?.navigationBarHidden = true //hide navigationBar in first ViewController 
    self.bakeryButton.addTarget(self, action: "bakeryButtonAction:", forControlEvents: .TouchUpInside) 
    self.breakfastButton.addTarget(self, action: "breakfastButtonAction:", forControlEvents: .TouchUpInside) 
} 

func bakeryButtonAction(sender: UIButton) { 
    performSegueWithIdentifier("showLunch", sender: self) 
} 

func breakfastButtonAction(sender: UIButton) { 
    performSegueWithIdentifier("showBreakfast", sender: self) 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    let foodTableViewController: FoodTableViewController = segue.destinationViewController as! FoodTableViewController 

    if segue.identifier == "showBreakfast" { 
     foodTableViewController.contentMode = 1 
    } else if segue.identifier == "showLunch" { 
     foodTableViewController.contentMode = 2 
    } 
} 

を変更しますUINavigationControllerInitialViewController 2を作りますPS:それはいつもありますUIButtonにセグを直接追加しない方が良いでしょう。または、FoodMenuControllerの上にある黄色のボタンから追加して、UIButtonActionで解雇するセグを指定することができます。performSegueWithIdentifier

+0

ありがとう、百万人の男!!!!最後にそれは動作します。そうでなければ、私は物をコピーしています。そして、あなたはセグーを実行してボタンを識別子にするために、セグーの準備を変えなければならないと言っていますか? – Kevin

+0

これは正しくありません。 1. 'PerformSegueWithIdentifier':実行されると、与えられた識別子で' segue'を起動します。次に 'PrepareForSegue'メソッドが実行されます。 2.'PrepareForSegue':このメソッドはオーバーライドされ、 'segue'に渡されるデータを設定します。 直接 'segue'の代わりに' ViewController'のsegueを宛先に追加することができます。今度は 'UIButton'のための'アウトレット 'を作成し、ボタンのアクションを追加します – Mathews

+0

答えが満足であれば、答えをマークして質問を閉じます。 – Mathews

1

共有スニペットと明らかに何か問題がありません。 tableView:numberOfRowsInSection:メソッドで返される内容を確認し、値が返されているかどうかを確認することができます。> 0

また、これは特定の時点で行われていますが、とdatasourceはviewcontrollerに設定されています。

+0

ビュー階層、デリゲート/データ・ソースは適切に配線されていなければなりません(間違っていない限り)。ですから、 'tableView:numberOfRowsInSection:' ...? –

+0

セグの識別子を確認したところ、データはまだロードされていませんか?私はここで何が欠けているのですか?誰もがアイデアを持っている?質問を再投稿したくない...専門家が何が起こっているのか分からなければ、これはちょっとばかげている...私はファイルをアップロードすべきですか? – Kevin

+0

@Kevinは私が言ったように、明らかにコードに間違いはない。 'viewWillAppear:'で 'reloadData'を実行した後、' numberOfRowsInSection: 'が正しいカウントを取得しているかどうかチェックしましたか?それはあなたにヒントを与えるかもしれない – lostInTransit

0

データソースを設定してtableViewの代理人を参照することはできませんが、これらは両方ともセットアップされているかどうかを確認してください。

+0

コントローラクラスはすでに' UITableViewController'をサブクラス化していますので、 'dataSource'と' delegate'はコントローラークラスを使用しています。@Nicolasのコメントを参照 – Mathews

+0

コードを試しました。問題なく動作します。コードでxcodeプロジェクトを接続しています。https://drive.google.com/file/d/0Bwftp_LIDNUQcTd2cXA0TVB2THc/view ?usp = sharing –

+0

ありがとうございます。しかし、あなたは 'UIViewController'の中で' UITableView'を使っていますが、私たちは 'UITableViewController'を扱っているので、' dataSource'と 'delegate'について気にする必要はありません。それらの'UITableViewController'自体で世話をします。 – Mathews

関連する問題