2017-11-21 1 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

나는 부분과의 tableview를 사용했다하지만 내가 데이터 (항목 배열)을로드하고 있기 때문에이 오류의 이유는 return self.items[section].count 에 런타임 오류를 생산 서버 다음에 섹션 배열을 채 웁니다. tableview가 생성되면 섹션과 items 배열이 비어 있습니다. 그래서 오류가 발생합니다. 저는 iOS를 처음 접했고 tableview의 섹션에서 데이터를 조정하는 방법을 이해하지 못했습니다.

  • 누군가 내가이 작업을 수행하는 더 나은 방법을 제안 할 수 있습니까?
  • 서버 호출이 얼마나 많은 항목을 반환할지 모르는 경우 섹션의 행 수는 얼마입니까?
  • 또한 서버 호출이 실패하고 데이터가 반환되지 않을 때 케이스를 덮고 싶습니다. 테이블 뷰를 숨기고 (그리고 오류 메시지를 표시하는 것만으로도 충분합니까?)

도움을 주시면 감사하겠습니다. 이 작동하는 경우

답변

0

은 참조 :

var items: [[String]]? 

을 그리고 당신의 getCategorySuccess 내부를 인스턴스화하고 값을 입력 : 데이터 소스를 선택합니다. 나중에 categoryTableView.reloadData()으로 전화하여 테이블보기를 다시로드하십시오.

는이처럼 행에 대해 널 체크를 추가 할 수 있습니다

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

이 기본값으로 0을 반환합니다. 같은 섹션의 번호를 간다 :

return self.items?.count ?? 0 

경우 호출이 내가 UIAlertController를 사용하여 오류 메시지를 표시 할 실패합니다.

+0

dataSource를 null로 만들면 쓸모가 없으므로 기본값을 제공해야만 더 많은 코드가 추가됩니다 – zombie

0

사용자 의견이 올바르지 않습니다 : "tableview가 생성되면 섹션과 항목 배열이 모두 비어 있습니다. 따라서 오류가 발생합니다."

이 코드에 따르면, sections는 하나 개의 항목으로 초기화됩니다 :

var sections = ["Adventure type"] 

이 왜 앱 충돌이다. tableview에 하나의 섹션이 있다고 말하면, 해당 섹션의 항목을 찾으려고하면 items이 비어 있기 때문에 충돌합니다.

는 빈 배열로 섹션을 초기화하십시오 :

var sections = [String]() 

이미 일을 더해야한다. 테이블이 비어 있어도 앱이 중단되지 않아야합니다.

이제 getCategorySuccess 끝 부분에 서비스에서 검색 한 데이터가 반영되도록 표를 다시로드해야합니다. 아마도 이것은 비동기 콜백이므로, 그렇게하기 위해 메인 큐로 보내야 할 것입니다.이게 작동해야합니다 :

DispatchQueue.main.async { 
    self.categoryTableView.reloadData() 
} 
관련 문제