2017-06-05 16 views
1

この質問は、Use UICollectionViews to create dynamic and multiple featuresに続きます。私は名前と、このアプリのような同様のレシピの画像を表示する静的な細胞を作成することができていUITableViewsを使用してSwiftで静的および動的行を作成する方法

:私は量に基づいて変化する動的な行を作成して貼り付けてい

enter image description here

すなわち器具または下の画像のような栄養価の内部データの:

enter image description here

私は普通のtableView上のデータの行を表示する方法を知っています。しかし、それをテーブルビュー内のセクションに埋め込む方法は不明です。私は複数のプロトタイプセルを追加し、それらをUITableViewCellのサブクラスに割り当てようとしました。その後、cellForRowif声明を使用しようとしましたが、これは私の問題を解決するものではありません。私もこのデモを見てきました

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

    if indexPath.row == 0 { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! FirstCell 
     //set the data here 

     cell.recipeTitle.text = recipe.name 
     cell.imageView.image = UIImage(named: "url") 
     return cell 
    } 
    else if indexPath.row == 1 { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as! SecondCell 
     //set the data here 
     return cell 
    } 
    else { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell3", for: indexPath) as! ThirdCell 
     //set the data here 
     return cell 
    } 
} 

https://medium.com/ios-os-x-development/ios-how-to-build-a-table-view-with-multiple-cell-types-2df91a206429、私が達成したいものに近いですが、私はそれが非常に困難それに適応することが分かってきました。

誰かが私にこのやっかいなアプローチに最善の方法を教えることができたら、本当に感謝します。

答えて

1

最初に静的セルと動的セルを同じtableViewに配置することはできません。では、どうやってそれを回避するのですか?スタティック・セルは、それぞれのセクションに属するスタティック・セルと、そのセルが属するセクションのダイナミック・セルを定義します。しかし、それはあなたがしようとしているようには見えません。同じテーブル内に複数のセクションが必要なだけです。各セクションは異なるデータリストを持ちます。

これを行うにはセクション数が必要です。tableView(_:numberOfSections :)関数を使用します。

override func numberOfSections(in tableView: UITableView) -> Int { 
    return 3 
} 

次に、(おそらく必要があります)(またちょうどのtableViewである可能性があります。あなたが使用しているものthatsの仮定)あなたのtableViewController内のタイトルを持つ配列を初期化することにより、これらのセクションのそれぞれにタイトルを付けることができます。

let headerTitles = ["Nutritional Values", "Utensils", "Ingredients"] 

その後のtableView(_使用:titleForHeaderInSection :)

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    if section < headerTitles.count { 
     return headerTitles[section] 
    } 
    return nil 
} 

を今、あなたはセクションによって、あなたの行の定義を開始することができます。

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

    if indexPath.section == 0 { 
     //Setup up the first row 
     if indexPath.row == 0 { 
      //I'm not sure where or how you defined First/SecondCell but this may not work depending on those two questions. 
      let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! FirstCell     
      return cell 
     } else if indexPath.row == 1 { 
      let cell = Bundle.main.loadNibNamed("StaticCell", owner: self, options: nil)?.first as! StaticCell 
      return cell 
     } 

    } else if indexPath.section == 1 { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) as! SecondCell 
     //setup cell1 n your storyboard to have a label with a tag # of 12(or whatever number you want to use) 
     //you also want an array with your utensil data accessible here 
     let label = cell.viewWithTag(12) as! UILabel 
     label.text = utensilNames[indexPath.row]    
      return cell 

    } else if indexPath.section == 2 { 
     let cellIngredients = tableView.dequeueReusableCell(withIdentifier: "Ingredients", for: indexPath) 

     tableView.deselectRow(at: indexPath, animated: true) 
     return cellIngreidents 
    } 
    cell = tableView.dequeueReusableCell(withIdentifier: "cell")! 
    return cell 
} 

ここで重要なのは、セクションと行を使用してデータを配信することです。

セクション0を明確にする行0 - Nは、静的な行が設定されている場所です。私は、TableViewCellをサブクラス化するXIBファイルを使用することをお勧めします。 これが役立つことを願っています。

EDIT「静的な」セルを見ているのは、最初のセクションにxibが置かれている場所に正確に配置されているということです。上記の例では、2番目のセルの最初のセクションは

+0

です。私はこの回答を高く評価しています。私はあなたの例を試しましたが、2番目と3番目のセクションを表示するのに苦労しています。私はそれを実行すると、それはちょうど私に最初のセクションの2つの複製を与えます。また、_FirstCell_と_SecondCell_は、私のすべてのUIアウトレットがリンクされているカスタムTableViewCellです。私は 'cellForRowAt'すなわち' cell.recipeLabel.text = recipe.name'でそれらを呼び出します。私はタグの代わりにこれを使用します。最後に、私のtableViewにはUIViewのサブクラスである_headerView_もあります。私はレシピの画像を表示するためにこれを使用します。これは私のtableViewの最初のセクションでなければなりません。 – Chace

+0

また、「各スタティックセルが属するセクションと、そのセルが属するセクションのダイナミックセルを定義する」という意味は?現在私のtableViewは_Dynamic Prototyp_を使用しています。 – Chace

+0

私の答えは完全な実装ではありませんでした。私はあなたが出発点として使用するためのテンプレートを提供しようとしていました。あなたがしたいように聞こえるのは、静的セルが作成されたときに呼び出されるxibとtableviewcellファイルを一緒に使用することです。あなたの2番目のコメントに対する答えは、静的なセルがxibに定義され、関連するswiftファイルがcellForRowAtを通してtableviewに配置されているということです。 – returnVoid

関連する問題