2017-08-03 18 views
0

私は複数の "ドリルダウン"テーブルビューのplistからデータを表示するために取り組んでいます。表示されるデータは読み取り専用になるだけで、Webデータに基づいている必要はありません。最大100データポイントしかないので、JSONの代わりにplistを使用することができます。テーブルビューのplistからデータの配列を表示する

とにかく、質問は...私はかなりよく表示するために管理していた辞書項目の配列を持っています。スタックオーバーフローに関する以下の質問に関するGitHubから始めました(少し修正しましたが、それは重要ではありません)。私は一人一人の下の項目(この例では、「友人」)の配列を表示していると助けを必要と何

Load data from a plist to two TableViews

https://github.com/DonMag/SWPListData

。以下のコードはうまくいけば説明します。

私は、データを表示するのViewControllerに今モデル

struct EmployeeDetails { 
let functionary: String 
let imageFace: String 
let phone: String 

//This is the new array I've added and am having trouble displaying 
let friends: [String] 


init(dictionary: [String: Any]) { 
    self.functionary = (dictionary["Functionary"] as? String) ?? "" 
    self.imageFace = (dictionary["ImageFace"] as? String) ?? "" 
    self.phone = (dictionary["Phone"] as? String) ?? "" 

    //I've initialised it here. 
    self.friends = (dictionary["Friends"] as? [String]) ?? [""] 

で空の配列を作成しました。私は、 "functionary"、 "imageFace"、 "phone"の正しいデータを表示するのに全く問題はありませんが、自分のセクションに配列として "friends"を表示することはできません。私は、主な問題は、numberOfRowscellForRowであるかなり確信している:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if section == 0 { 
    if let theEmployee = newPage { 
     return theEmployee.details.count 
    } 
    return 0 

} 
    else if section == 1 { 
     return 1 
    } 
    else if section == 2 { 
     if let theEmployee = newPage { 
      return theEmployee.details.count 
     } 
     return 0 
    } 
    else { 
     return 0 
    } 
} 

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


    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) // as! TableViewCell2 

    if indexPath.section == 0 { 

     cell.textLabel?.text = "A" 

     if let theEmployee = newPage { 
      cell.textLabel?.text = theEmployee.details[indexPath.row].functionary 
      cell.detailTextLabel?.text = theEmployee.details[indexPath.row].phone + " (" + theEmployee.details[indexPath.row].imageFace + ")" 
     } 
    } 

    else if indexPath.section == 1 { 
     cell.textLabel?.text = "Test" 

     } 

    else if indexPath.section == 2 { 
     cell.textLabel?.text = ???? 

     } 

    return cell 
} 

私はそれがnumberOfRowsに次のように書いて働くだろうと思った:

else if section == 2 { 
     if let theEmployee = newPage { 
      return theEmployee.details.friends.count 
     } 
     return 0 
    } 

しかし、私はエラーを取得する:

value of type '[EmployeeDetails]' has no member 'friends'.

配列を取得するには何が必要ですか?

注:配列は空ではありません。

ご意見/ご協力いただければ幸いです!

+0

を次のように次のステップは、テーブルビューでこれを追加することです、私はあなたがこのtheEmployee.detailsようにそれを書くべきだと思う[yourIndex] .friends.count – 3stud1ant3

答えて

0

問題は、それはあなたがこの

theEmployee.details[yourIndex].friends.count 

更新のようなインデックス何かを介してアクセスする必要がありますので、詳細について内部に格納され、構造体のプロパティであるのに対し、あなたが詳細に友人のプロパティにアクセスしているということです。

//あなたがの.plistファイル内の変更を加える必要がありまずが、これはあなたを変更する必要でしょうそこに行くと今だけ詳細

のように内部で友達アレイを追加してください従業員のstructコード

struct Employee { 
    let position: String 
    let name: String 
    let details: [EmployeeDetails] 
    let friends: [String] 

    init(dictionary: [String: Any]) { 
self.position = (dictionary["Position"] as? String) ?? "" 
self.name = (dictionary["Name"] as? String) ?? "" 

let t = (dictionary["Details"] as? [Any]) ?? [] 
self.details = t.map({EmployeeDetails(dictionary: $0 as! [String : Any])}) 
self.friends = (dictionary["Friends"] as? [String]) ?? [] 

    } 
} 

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

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

if let theEmployee = newPage { 
if section == 0 { 
return theEmployee.details.count 
}else if section == 1 { 
return theEmployee.friends.count 
} 

} 
return 0 

    } 
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 

if section == 0 { 
return "Subordinates" 
}else if section == 1 { 
return "Friends" 
} 

return "" 
} 


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

let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) // as! TableViewCell2 

cell.textLabel?.text = "A" 

if let theEmployee = newPage { 
if indexPath.section == 0 { 
cell.textLabel?.text = theEmployee.details[indexPath.row].functionary 
cell.detailTextLabel?.text = theEmployee.details[indexPath.row].phone + " (" + theEmployee.details[indexPath.row].imageFace + ")" 
}else if indexPath.section == 1 { 
cell.textLabel?.text = theEmployee.friends[indexPath.row] 
} 
} 



return cell 
    } 

} 
+0

OKああ。だからどこで/どのように宣言し、 "yourIndex"の配列を初期化しますか? – DrewDog

+0

plistで各従業員(または職場)に一意の辞書キー/値を割り当てて、それをコード内で参照する必要がありますか? – DrewDog

+0

@DrewDog私はいくつかの変更を加え、答えを更新しました。私の答えをチェックし、さらに助けが必要かどうか質問してください。 – 3stud1ant3

関連する問題