2017-06-23 16 views
0

私は素早く初心者ですが、HTML、CSS、およびJavaで適切な背景を持っています。私はこのアカウントを文字通り単にこの質問をしたので、私はその点までまっすぐになるでしょう。押されたボタンに応じてtableViewControllerにデータを渡す

私は本当に素早く楽しんでいますが、文字通り、同じコードを何度も何度も繰り返し書いていました。無数のチュートリアル、本、ガイドなどを見直してください。私はうそをつくつもりはない、私はreaaaally私はこれを把握しようとしているとして私のコンパイラでスタック10 +エラーを見てうんざりしています。

私はViewControllerを持っています。私はTableViewControllerを持っています - ViewControllerは私のホーム画面です。上記のviewControllerには、2つのボタンがあり、1つはBuildingItems、もう1つはBuildingBlocksです。どちらもセグである。

私のTableViewControllerでは、私はbuildBlocksとbuildItemsを持っていて、どちらも配列が定義されています。

私がやろうとしていることは、ユーザーが選択したボタンに依存しています。私はそれを私のテーブルビューに入力するためのデータにします。私は通常のcell.textLabel?.text = arrayNameHere [indexPath.row]を使用してテーブルビューを具体的に取り込むことができますが、明らかにそれは私の問題を解決しません。

ここで私を助けてくれることを願っています。私は虚偽の文法とフォーマットについてお詫び申し上げます。私は文字通りこの週に4〜5時間を過ごしました。これをうまくやってみると、怒ってしまい、私のプロジェクト全体を3回別々に削除しました。以下のコードを追加します。もう一度、フォーマットを許してください。なぜ私は素早く把握できないのか分からないので、デリゲートのあらゆるバリエーションを試してみて、何かを渡してもうまくいきますが、何も動いていません。

のViewController:TableViewControllerで

@IBAction func BuildItems (_sender: Any) { 
} 

@IBAction func BuildBlocks (_sender: Any) { 
} 

:あなたは

let buildItems = ["these are all my", "arrays for this"] 

    let buildBlocks = ["same thing here","just saving time"] 

    class TableViewController: UITableViewController { 

     var myIndex = 0 

     override func tableView(_ tableView: UITableView, numberOfRowsInSection: Int) -> Int { 
     return buildItems.count 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "cell" for: indexPath) 

     cell.textLabel?.text = buildItems[indexPath.row] 

     return cell 
    } 


    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     myIndex = indexPath.row 

    } 
} 

答えて

0

ViewControllerからTableViewControllerまでは、1つのセグメンテーションが必要です。

var category = "" 

変更ボタンが押されたときに、その後、セグエ値:

@IBAction func BuildItems (_sender: Any) { 
    category = "BuildItems" 
    self.performSegue(withIdentifier: "segue", sender: self) 
} 

@IBAction func BuildBlocks (_sender: Any) { 
    category = "BuildBlocks" 
    self.performSegue(withIdentifier: "segue", sender: self) 
} 

を次にprepareに:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "segue" { 
     let vc = segue.destination as! TableViewController 
     // Assuming you created a variable called sentCategory in the TableViewController 
     vc.sentCategory = category 
    } 
} 
あなた ViewControllerボタンが押されているため、変数を作るには

TableViewControllerに空の配列を作成します。 viewDidLoad

let data = [String]() 

if sentCategory == "BuildItems" { 
    data = buildItems 
} else { 
    data = buildBlocks 
} 

data変数を使用してTableViewを移入します。

カップルのコメント:あなたはしないように十分な理由がない限り

  • は、あなたのクラススコープ内のすべてを保管してください。
  • このシナリオでは、代理人は必要ありません。上記のように、prepareの機能でデータを渡します。
+0

これはうまくいった!とてもありがとう!唯一のことは、一度に2つのセグを実行することです、なぜ私はそれほど確かではありません。それは私がやったことだと確信しています。それでも、ありがとうございました。この間、私は物事を困難な方法でやろうとしていました。 1つの質問 - 準備と委任の違いは何ですか? (初心者が理解できる、より愚かなバージョンで)ありがとう! – Tyler

+0

prepare関数を使用すると、1 ViewControllerから別のViewControllerにデータを1方向に渡す最も簡単な方法です。デリゲートを使用して、データを後方またはどこかに実際に渡すことができます。基本的にVCはプロトコル(デリゲート)に準拠し、変更をリスンすることができます。したがって、1 VCは別のVCでメソッドを呼び出すことができます。 – nighttalker

0

多分あなたのtableViewコントローラにブールVARを作成し、helpArray

var dataArray:[String] = [] 
var isBuildItem:Bool = false 

最初のコントローラは、このようprepareForSegueメソッドを実装します。

すべてのtableViewのデリゲートメソッドで
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let vc = segue.destination as? TableViewController { 
      //set true or false it depends of which button you click 
      vc.isBuildItem = //true or false 
     } 
} 
あなたTableViewControllerチェックするbool変数内のviewDidLoadで次に

if(isBuildItem:Bool){ 
    dataArray = buildItems 
} 
else{ 
    dataArray = buildBlocks 
} 

はあなたのViewControllerにdataArray

0

とbuildItems配列を変更します。

import UIKit 

var segueName = "" 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

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

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    { 
     segueName = segue.identifier! 
     print(segueName) 
    } 

} 

T ableViewController:

import UIKit 

class TableViewController: UITableViewController 
{ 
    let animals = ["Cat","Dog","Mouse"] 
    let colors = ["White","Blue","Red"] 
    var arrayResult = [""] 


    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     if segueName == "seguebuttonA" 
     { 
      arrayResult = animals 
     } 
     else if segueName == "seguebuttonB" 
     { 
      arrayResult = colors 
     } 
    } 

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

    // MARK: - Table view data source 

    override func numberOfSections(in tableView: UITableView) -> Int 
    { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 

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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cellTest", for: indexPath) as! TableViewCell 

     // Configure the cell... 

     cell.titleLabel.text = arrayResult[indexPath.row] 

     return cell 
    } 
} 

追加セグエ名: enter image description here

完全な例は、以下のリンクであるが、私は質問があれば私に知らせて、私が助けたと思っています。 https://github.com/cwilliams26/viewSegueTabelview/tree/master

+0

私はこのショットを与えました、それはセグを実行しましたが、それは私に細胞をもたらし、次に別の細胞 - 両方とも未産卵でした。理由は分かりません。それにもかかわらず、私はまだあなたの時間を感謝します! – Tyler

+0

あなたのコードを質問またはリンクに追加して、プロジェクトをダウンロードしてレビューできるようにしてください。 – cwilliamsz

関連する問題