2017-11-21 7 views
0

私はこの画面が必要なアプリケーションを作成しています。さテーブルビューのセクションにデータが正しく取り込まれない

var sections = ["Adventure type"] 
    var categoriesList = [String]() 
    var items: [[String]] = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     categoryTableView.delegate = self 
     categoryTableView.dataSource = self 

     Client.DataService?.getCategories(success: getCategorySuccess(list:), error: getCategoryError(error:)) 
    } 

    func getCategorySuccess(list: [String]) 
    { 
     categoriesList = list 
     let count = list.count 

     var prevInitial: Character? = nil 
     for categoryName in list { 

      let initial = categoryName.first 
      if initial != prevInitial { // We're starting a new letter 
       items.append([]) 
       prevInitial = initial 
      } 
      items[items.endIndex - 1].append(categoryName) 
     } 

     for i in 0 ..< count 
     { 
      var tempItem = items[i] 
      let tempSubItem = tempItem[0] 
      let char = "\(tempSubItem.first)" 
      sections.append(char) 
     } 
    } 

    func getCategoryError(error: CError) 
    { 
     print(error.message) 
    } 

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

     return self.sections[section] 

    } 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 

     return self.sections.count 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return self.items[section].count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = categoryTableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath) 
     cell.textLabel?.text = self.items[indexPath.section][indexPath.row] 
     return cell 
    } 

以下のコードに示すようenter image description here

Iはセクションとテーブルビューを使用しているしかし、私は、データ(項目配列)をロードしていますので、このエラーの原因であるreturn self.items[section].count にランタイムエラーを生成していますその後、セクションの後ろにセクションを配置します。 tableviewが生成された時点で、sectionsとitemsの配列は空です。そのため、エラーが発生します。 私はiOSを初めて使い、tableviewのセクションでデータを調整する方法を理解していません。

  • 誰かが私にこれを行うより良い方法を提案できますか?
  • サーバコールが返されるアイテムの量がわからない場合、セクションの行数はどのくらいですか?
  • また、サーバーコールが失敗し、データが返されない場合は、ケースをカバーしたいと思います。テーブルビューを隠して(とエラーメッセージを表示する)十分でしょうか?

ご協力いただければ幸いです。

var items: [[String]]? 

そして、あなたのgetCategorySuccessの内側にそれをインスタンス化した値でそれを埋める:データソースはオプション行います

答えて

0

は、これが動作するかどうかを参照してください。その後、categoryTableView.reloadData()に電話して、テーブルビューをリロードします。

あなたは、このようなあなたの行にnullチェック追加することができます。これは、デフォルトとして0を返す

return self.items?[section].count ?? 0 

を。同じことは、セクションの数のために行く:

return self.items?.count ?? 0 

呼び出しが失敗した場合、私はUIAlertControllerを使用して、エラーメッセージが表示されるでしょう。

+0

dataSourceをnullにすることは無意味ですが、デフォルト値を指定するだけでコードを追加できます – zombie

0

あなたのコメントは間違っています:「tableviewが生成されるとき、セクションとアイテムの配列は両方とも空です。そのため、エラーが発生します。

あなたのコードによると、sectionsは、1つのエントリで初期化されます。

var sections = ["Adventure type"] 

これはなぜあなたのアプリケーションがクラッシュしています。テーブルビューにはセクションが1つありますが、そのセクションのアイテムを検索しようとすると、itemsが空であるためにクラッシュします。

は空の配列にセクションを初期化してみてください。

var sections = [String]() 

すでに物事が良いはずです。あなたのテーブルは空ですが、あなたのアプリはクラッシュしないでください。

getCategorySuccessの最後に、サービスで取得したデータを反映するためにテーブルを再読み込みする必要があります。おそらく、これは非同期コールバックなので、そうするにはメインキューにディスパッチする必要があります。これはうまくいくはずです:

DispatchQueue.main.async { 
    self.categoryTableView.reloadData() 
} 
関連する問題