2016-12-30 6 views
0

다음은이 응용 프로그램에 XIB 파일과 함께 여러 CustomTableViewCells를 구현하기 위해 을 따르고 있습니다. 내 Xcode 프로젝트에 이러한 파일이 있습니다 : Image Link Xcode Files.Swift : XIB 파일의 다중 사용자 정의 TableViewCell

은 내가 TextElement가 있습니다 Image Link

내가 노력이 후 중포 기지를 구현하는 오프라인 데이터와이를 테스트하려면 : Image Link 및 내가 ImageElement 있습니다.

import Foundation 
import FirebaseDatabase 

struct Home { 

var key:String! 
let itemRef:FIRDatabaseReference? 
var userUID:String! 
var user:String! 

// Home Element Cell Content 
var elementSortNumber:Int! 
var elementCellType:String! 
var referenceElementID:String! 

var databaseVersion:String! 

init (key:String = "", 
     uid:String, 
     user:String, 

     elementSortNumber:Int, 
     elementCellType:String, 
     referenceElementID:String, 
     databaseVersion:String) { 

    // General (Security tracking) 
    self.key = key 
    self.itemRef = nil 
    self.userUID = uid 
    self.user = user 

    // Home Element Cell Content 
    self.elementSortNumber = elementSortNumber 
    self.elementCellType = elementCellType 
    self.referenceElementID = referenceElementID 

} 

init (snapshot:FIRDataSnapshot) { 

    // General (Security tracking) 
    key = snapshot.key 

    itemRef = snapshot.ref 

    if let addedByUser = snapshot.value as? NSDictionary, let _temp = addedByUser["User"] as? String { 
     user = _temp 
    } else { 
     user = "" 
    } 

    // Home Element Cell Content 
    if let homeElementSortNumber = snapshot.value as? NSDictionary, let _temp = homeElementSortNumber["Title"] as? Int { 
     elementSortNumber = _temp 
    } else { 
     elementSortNumber = 50 
    } 

    if let homeElementCellType = snapshot.value as? NSDictionary, let _temp = homeElementCellType["Content"] as? String { 
     elementCellType = _temp 
    } else { 
     elementCellType = "" 
    } 

    if let homeElementID = snapshot.value as? NSDictionary, let _temp = homeElementID["Ref Element ID"] as? String { 
     referenceElementID = _temp 
    } else { 
     referenceElementID = "" 
    } 

    if let textDatabaseVersion = snapshot.value as? NSDictionary, let _temp = textDatabaseVersion["DB Version"] as? String { 
     databaseVersion = _temp 
    } else { 
     databaseVersion = "" 
    } 

} 

}이 내 TableViewController의 코드

입니다 : 당신이 볼 수있는 시뮬레이터가 비어 :이 문제가

import UIKit 

class HomeTableViewController: UITableViewController { 

    var arrayOfCellData = [Home]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 

     arrayOfCellData = 
      [Home(key: "", 
        uid:"", 
        user:"", 

        elementSortNumber:1, 
        elementCellType:"TextElement", 
        referenceElementID:"123ABC", 
        databaseVersion:"1"), 

      Home(key: "", 
        uid:"", 
        user:"", 

        elementSortNumber:1, 
        elementCellType:"ImageElement", 
        referenceElementID:"QWERTZ", 
        databaseVersion:"1"), 

      Home(key: "", 
        uid:"", 
        user:"", 

        elementSortNumber:1, 
        elementCellType:"TextElement", 
        referenceElementID:"XYZ789", 
        databaseVersion:"1")] 

    } 

    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 { 
     // If I return 1 the app crashes and if I comment this function it also crashes. 
     return 0 
    } 

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

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

     if arrayOfCellData[indexPath.row].elementCellType == "TextElement" { 

      let textElementCell = Bundle.main.loadNibNamed("TextElementTableViewCell", owner: self, options: nil) as! TextElementTableViewCell 

      textElementCell.textElementTitleLabel.text = arrayOfCellData[indexPath.row].referenceElementID 

      return textElementCell 

     } 

     else if arrayOfCellData[indexPath.row].elementCellType == "ImageElement" { 

      let imageElementCell = Bundle.main.loadNibNamed("ImageElementTableViewCell", owner: self, options: nil) as! ImageElementTableViewCell 

      imageElementCell.imageElementImageView.image = UIImage(named: "placeholder") 

      return imageElementCell 
     } 

     else { 

      let textElementDefaultCell = Bundle.main.loadNibNamed("TextElementTableViewCell", owner: self, options: nil) as! TextElementTableViewCell 

      textElementDefaultCell.textElementTitleLabel.text = arrayOfCellData[indexPath.row].referenceElementID 

      return textElementDefaultCell 
     } 

    } 

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 

     if arrayOfCellData[indexPath.row].elementCellType == "TextElement" { 
      return 116 
     } 
     else if arrayOfCellData[indexPath.row].elementCellType == "ImageElement" { 
      return 275 
     } 
     else { 
      return 116 
     } 
    } 

} 

인이 내 Home.swift 데이터 구조체이다 이 이미지 Image Link 왜? 어떻게 해결할 수 있습니까?

정말 도움이됩니다. 고맙습니다.

+0

'numberOfSections' 1 이상 있어야합니다, 당신은 충돌을 얻었다 귀하의'cellForRowAt'가 꽤 잘못 보였기 때문에 당신이 튜토리얼에서 가져 왔는지 확실하지 않습니다. – Tj3n

+0

재사용 가능한 셀을 위해 테이블 ​​뷰에 모든 닙을 등록해야합니다. 'elementCellType'을'tableView.dequeueReusableCell (withIdentifier : <#T##String#>, for : <# T ## IndexPath #>)'에 사용하십시오. 각 셀의 nib 파일에 대한 자동 레이아웃을 설정하면 셀에 대한 코드를 작성할 필요가 없습니다. – bubuxu

+0

셀이 등록되지 않았고 ** numberofsection **이 1을 반환해야합니다. 또한 테이블 뷰 대리인과 데이터 소스가 연결되어 있는지 확인하십시오. –

답변

3

등의 viewDidLoad에 아래의 XIB 파일을 등록

tableView.register(UINib(nibName: "TextElementTableViewCell", bundle: Bundle.main), forCellReuseIdentifier: "TextElementTableViewCellIdentifier") 

그런 cellForRowIndex 경로 : 액세스 세포 자신의 ID를 사용하여

let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "TextElementTableViewCellIdentifier", for: indexPath) as! TextElementTableViewCell 
+0

정말 고마워요. 이것은 예상대로 작동했습니다. 나중에 다른 사람들을 위해 내 코드에서 해결책을 보여주기 위해 내 질문을 업데이트 할 것입니다 ... –