2017-06-22 73 views
-1

下面我試圖將數據加載到UITableView中,並且每次數據都在錯誤的單元格中結束,或者複製到應該永遠不會訪問的單元格中。我已經刪除了很多額外的代碼,並且仍然遇到這個問題。我想我缺少一些有關UITableViews的基礎知識。UITableView將數據加載到錯誤的單元格中

func setUpFeedTable() { 

       self.tableFeed.isScrollEnabled = true 

       for i in 0 ..< allDictionary.count { 


        let dictionary = allDictionary[i] 


        if dictionary?["type"]! != nil { 
         let l = i 
         print("text", l) 
         self.tableFeed.cellForRow(at: IndexPath(row: l, section: 0))?.imageView?.layer.borderColor = UIColor.black.cgColor 
         self.tableFeed.cellForRow(at: IndexPath(row: l, section: 0))?.imageView?.layer.borderWidth = 1 
         self.tableFeed.cellForRow(at: IndexPath(row: l, section: 0))?.imageView?.layer.cornerRadius = 1 

         //self.tableFeed.cellForRow(at: IndexPath(row: i, section: 0))?.imageView?.clipsToBounds = true 
         self.editProfileButton.imageView?.contentMode = UIViewContentMode.scaleAspectFill 
         //self.tableFeed.reloadData() 
         //self.tableFeed.reloadRows(at: [IndexPath(row: l, section: 0)], with: UITableViewRowAnimation(rawValue: 0)!) 

         self.tableFeed.cellForRow(at: IndexPath(row: l, section: 0))?.imageView?.frame = CGRect(x: 0, y: UIScreen.main.bounds.height/2, width: 100, height: 100) 

         self.tableTextOverLays(i: l, type: Int((dictionary?["type"])! as! NSNumber)) 

         //self.tableFeed.reloadRows(at: [IndexPath(row: l, section: 0)], with: UITableViewRowAnimation(rawValue: 0)!) 

         self.tableFeed.reloadDate() 
        } 

        else if (dictionary?["type_"] as! String) == "Image" { 
         print("image", i) 

        } 
        else { 
         print("video") 
        } 



       } 



      } 

      func tableTextOverLays(i: Int, type: Int){ 
       if type == 0{ 
        print("saw type 0", i) 
        self.tableFeed.cellForRow(at: IndexPath(row: i, section: 0))?.imageView?.image = #imageLiteral(resourceName: "Geo-fence-50") 
       } 

       else if type == 1 { 
        self.tableFeed.cellForRow(at: IndexPath(row: i, section: 0))?.imageView?.image = #imageLiteral(resourceName: "Happy-50") 
       } 

       else if type == 2 { 
        self.tableFeed.cellForRow(at: IndexPath(row: i, section: 0))?.imageView?.image = #imageLiteral(resourceName: "Information-50") 
       } 

       else if type == 3 { 
        self.tableFeed.cellForRow(at: IndexPath(row: i, section: 0))?.imageView?.image = #imageLiteral(resourceName: "Home-50") 
       } 
      } 

更新:我已經編輯我的代碼,事情正在努力更好(所以謝謝!),但我現在遇到了一個圖像是地方的問題都到前兩個單元格,然後第4和第第5個細胞。

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

     if tableView == self.table { 
      return users2.count 

     } 
     else { 
      //print("married barry", tableFeedCount) 
      return tableFeedCount 
     } 
    } 

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

     if tableView == self.table { 
      let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath) as UITableViewCell 
      cell.textLabel?.text = self.users2[indexPath.row].name 
      return cell 
     } 
     else { 
      //print("working?") 
      let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath) as UITableViewCell 
      let dictionary = allDictionary[indexPath.row] 


      if dictionary?["type"]! != nil { 
       cell.imageView?.layer.borderColor = UIColor.black.cgColor 
       cell.layer.borderWidth = 1 
       cell.imageView?.layer.cornerRadius = 1 


       cell.imageView?.frame = CGRect(x: 0, y: UIScreen.main.bounds.height/2, width: 100, height: 100) 

       self.tableTextOverLays(i: indexPath.row, type: Int((dictionary?["type"])! as! NSNumber), cell: cell) 

      } 

      else if (dictionary?["type_"] as! String) == "Image" { 
       print("image") 

      } 
      else { 
       print("video") 
      } 


      return cell 
     } 

    } 
+0

信息數組有沒有你是不是想充分利用'tableViewDataSource'協議的具體原因是什麼? – AgRizzo

+1

是的,你正在使用錯誤的方法。 'cellForRowAtIndexPath:'返回已經存在於請求索引處的已格式化的單元格。單元格是啞元容器,當您在列表中滾動時會重新使用/重新填充,因此您無法像這樣單獨設置屬性。初始單元格格式發生在'dequeueReusableCell ...'這裏,您可以設置標籤,圖像,單元格類型。它爲'dataSource'中的每個索引創建單元格;沒有循環req'd。 頁眉/頁腳單元格也使用單獨的方法。建議查看關於如何使用UITableView的教程,創建自定義的UITableViewCell子類等。 – mc01

回答

0

這是不正確的填充TableView這樣。 每個TableView必須與一個DataSource或到UITableViewDelegate,而這一點,例如,應實施的方法,如tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

例如:

class MyViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 
    @IBOutlet var tableView: UITableView! 

    var myStrings = ["1", "2", "3", "4", "5"] 

    override func viewDidLoad() { 
     self.tableView.delegate = self 
     self.tableView.dataSource = self 
    } 

    @available(iOS 2.0, *) 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if section == 0 { 
      return 1 
     } 
     return myStrings.count 
    } 

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

    @available(iOS 2.0, *) 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "reuseId", for: indexPath) 
     if indexPath.section == 0 { 
      cell.textLabel?.text = "This is the row in the first section" 
     } else { 
      cell.textLabel?.text = myStrings[indexPath.row] 
     } 

     return cell 
    } 
} 
2

的原因是因爲找你試圖設置UITableviewCells請求單元格到tableView的元數據,單元格在UITableView協議方法cellforRowAtIndexPath中被重用,這就是爲什麼您在其他單元格中看到重複或元數據的原因。

您需要做的是在cellforRowAtIndexPath方法中設置每個單元格的元數據。

例如,如果你有這樣的

let metadata = ["title1", "title2", "title3"] 

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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 
    let title = metadata[indexPath.row] 
    cell.titleLabel.text = title 
    return cell 
} 
相關問題