2017-04-12 14 views
0

テーブルビューのリストを作成すると、データが動的に読み込まれ、画像 にセルとテキストが含まれます。それは、スクロールけいれんますと は、ユーザースウィフトで - UITableviewがスクロールしているときにジャーキーになる

テーブルビューのパフォーマンスを向上させるための任意のアイデアを刺激すると?

class MainViewController: UIViewController,UITableViewDataSource, UITableViewDelegate { 
    @IBOutlet weak var listTable: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.listTable.delegate = self 
     self.listTable.dataSource = self 
     self.listTable.separatorStyle = .None 
     self.listTable.registerNib(UINib(nibName: "cellOne", bundle: nil), forCellReuseIdentifier: "cellOne") 
     self.listTable.registerNib(UINib(nibName: "cellTwo", bundle: nil), forCellReuseIdentifier: "cellTwo") 
     self.listTable.registerNib(UINib(nibName: "cellThree", bundle: nil), forCellReuseIdentifier: "cellThree") 
    } 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int{ 
     return 1 
    } 

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
     if pageIndex == 7 { 
      return 120 
     } else if indexPath.row == 0 { 
      return 280 
     } else if (indexPath.row == 5 || indexPath.row == 4) { 
      return 200 
     } else if (indexPath.row == 8 || indexPath.row == 11) { 
      return 160 
     } 
     return 80 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ 
     return 50 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = UITableViewCell() 
     let listArray = self.listDataArray[indexPath.row] 

     if indexPath.row == 0 && pageIndex != 7 { 
      var cell = tableView.dequeueReusabl eCellWithIdentifier("cellOne") as! cellOne! 

      if cell == nil { 
       tableView.registerClass(cellOne.classForCoder(), forCellReuseIdentifier: "cellOne") 
       cell = cellOne(style: UITableViewCellStyle.Default, reuseIdentifier: "cellOne") 
      } 

      cell.headLbl.text = "\(listArray["title"]!)".html2String 
      cell.addImageView.userInteractionEnabled = true 
      let guster = UITapGestureRecognizer(target: self, action: "addTarget:") 
      cell.addImageView.addGestureRecognizer(guster) 
      cell.addImageView.tag = 1 

      let qualityOfServiceClass = QOS_CLASS_BACKGROUND 
      let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) 
      dispatch_async(backgroundQueue, { 
       if listArray["image"] != nil && self.imagesLocalDictionary[indexPath.row] == nil { 
        let u = listArray["image"] as! String 
        let url = NSURL(string: u) 
        if url != nil { 
         let data = NSData(contentsOfURL: url!) 

         if data != nil { 
          dispatch_async(dispatch_get_main_queue(), {() -> Void in 
           cell.imageViews.image = UIImage(data: data!) 
          }) 
          self.imagesLocalDictionary.setObject(data!, forKey: indexPath.row) 
         } 
        } 
       } else { 
        dispatch_async(dispatch_get_main_queue(), {() -> Void in 
         cell.imageViews.image = UIImage(data: self.imagesLocalDictionary[indexPath.row] as! NSData) 

        }) 
       } 
      }) 


      if Constants.sharedInstance.addData["1"] != nil { 
       cell.addImageView.image = UIImage(data: Constants.sharedInstance.addData["1"] as! NSData) 
      } 

      return cell 

     } else if indexPath.row == 4 && pageIndex != 7 { 
      var cell = tableView.dequeueReusableCellWithIdentifier("cellTwo") as! cellTwo! 

      if cell == nil { 
       tableView.registerClass(cellTwo.classForCoder(), forCellReuseIdentifier: "cellTwo") 
       cell = cellTwo(style: UITableViewCellStyle.Default, reuseIdentifier: "cellTwo") 
      } 

      cell.headLbl.text = "\(listArray["title"]!)".html2String 
      cell.addImageView.userInteractionEnabled = true 
      let guster = UITapGestureRecognizer(target: self, action: "addTarget:") 
      cell.addImageView.addGestureRecognizer(guster) 
      cell.addImageView.tag = 2 

      let qualityOfServiceClass = QOS_CLASS_BACKGROUND 
      let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) 
      dispatch_async(backgroundQueue, { 
       if listArray["image"] != nil && self.imagesLocalDictionary[indexPath.row] == nil { 
        let u = listArray["image"] as! String 
        let url = NSURL(string: u) 
        if url != nil { 
         let data = NSData(contentsOfURL: url!) 

         if data != nil { 
          dispatch_async(dispatch_get_main_queue(), {() -> Void in 
           cell.imageViews.image = UIImage(data: data!) 
          }) 
          self.imagesLocalDictionary.setObject(data!, forKey: indexPath.row) 
         } 

        } 
       } else { 
        dispatch_async(dispatch_get_main_queue(), {() -> Void in 
         cell.imageViews.image = UIImage(data: self.imagesLocalDictionary[indexPath.row] as! NSData) 
        }) 
       } 
      }) 

      if Constants.sharedInstance.addData["2"] != nil { 
       cell.addImageView.image = UIImage(data: Constants.sharedInstance.addData["2"] as! NSData) 
      } 

      return cell 

     } else if indexPath.row == 5 && pageIndex != 7 { 
      var cell = tableView.dequeueReusableCellWithIdentifier("cellThree") as! cellThree! 

      if cell == nil { 
       tableView.registerClass(cellThree.classForCoder(), forCellReuseIdentifier: "cellThree") 
       cell = cellThree(style: UITableViewCellStyle.Default, reuseIdentifier: "cellThree") 
      } 

      cell.headLbl.text = "\(listArray["title"]!)".html2String 
      cell.addImageView.userInteractionEnabled = true 
      let guster = UITapGestureRecognizer(target: self, action: "addTarget:") 
      cell.addImageView.addGestureRecognizer(guster) 
      cell.addImageView.tag = 3 

      let qualityOfServiceClass = QOS_CLASS_BACKGROUND 
      let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) 

      dispatch_async(backgroundQueue, { 
       if listArray["image"] != nil && self.imagesLocalDictionary[indexPath.row] == nil { 
        let u = listArray["image"] as! String 
        let url = NSURL(string: u) 
        if url != nil { 
         let data = NSData(contentsOfURL: url!) 

         if data != nil { 
          dispatch_async(dispatch_get_main_queue(), {() -> Void in 
           cell.imageViews.image = UIImage(data: data!) 
          }) 
          self.imagesLocalDictionary.setObject(data!, forKey: indexPath.row) 
         } 
        } 
       } else { 
        dispatch_async(dispatch_get_main_queue(), {() -> Void in 
         cell.imageViews.image = UIImage(data: self.imagesLocalDictionary[indexPath.row] as! NSData) 
        }) 
       } 
      }) 

      if Constants.sharedInstance.addData["3"] != nil { 
       cell.addImageView.image = UIImage(data: Constants.sharedInstance.addData["3"] as! NSData) 
      } 

      return cell 
     } else { 
      cell.backgroundColor = UIColor.groupTableViewBackgroundColor() 

      let container = UIView() 
      container.frame = CGRectMake(2, 1, tableView.frame.width-4, 78) 
      container.backgroundColor = UIColor.whiteColor() 
      cell.addSubview(container) 

      let headerLbl = UILabel() 
      headerLbl.backgroundColor = UIColor.clearColor() 

      headerLbl.frame = CGRectMake(120, 1, self.view.frame.width-130, 76) 
      headerLbl.numberOfLines = 0 
      headerLbl.font = UIFont(name: "TelegramHead", size: 18) 

      headerLbl.text = "\(listArray["title"]!)".html2String 
      headerLbl.lineBreakMode = NSLineBreakMode.ByCharWrapping 

      let imageView = UIImageView() 
      imageView.frame = CGRectMake(5, 5, 100, 68) 
      imageView.image = UIImage(named: "place_holder.jpg") 
      imageView.contentMode = UIViewContentMode.ScaleAspectFill 
      imageView.clipsToBounds = true 

      let blackLayerView = UIView(); 
      blackLayerView.frame = CGRectMake(0, 0, 0, 0); 
      blackLayerView.backgroundColor = UIColor.blackColor(); 
      blackLayerView.alpha = 0.4; 

      container.addSubview(imageView) 
      container.addSubview(blackLayerView); 
      container.addSubview(headerLbl) 

      if pageIndex == 7 { 
       container.frame = CGRectMake(2, 1, tableView.frame.width-4, 118) 
       imageView.frame = CGRectMake(5, 5, container.frame.width-10, 108) 
       blackLayerView.frame = imageView.frame; 
       headerLbl.frame = imageView.frame//CGRectMake(10, 5, self.view.frame.width-20, 100) 
       headerLbl.textColor = UIColor.whiteColor() 
       headerLbl.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.2) 

      } else if (indexPath.row == 8 || indexPath.row == 11) && pageIndex != 7 { 
       let add = UIImageView() 
       add.frame = CGRectMake(2, 82, tableView.frame.width-4, 76) 
       //add.contentMode = UIViewContentMode.ScaleAspectFit; 
       cell.addSubview(add) 
       add.userInteractionEnabled = true 
       let guster = UITapGestureRecognizer(target: self, action: "addTarget:") 
       add.addGestureRecognizer(guster) 

       if Constants.sharedInstance.addData["4"] != nil && indexPath.row == 8{ 
        add.image = UIImage(data: Constants.sharedInstance.addData["4"] as! NSData) 
        add.tag = 4 
       } 

       if Constants.sharedInstance.addData["5"] != nil && indexPath.row == 11{ 
        add.image = UIImage(data: Constants.sharedInstance.addData["5"] as! NSData) 
        add.tag = 5 
       } 
      } 

      let qualityOfServiceClass = QOS_CLASS_BACKGROUND 
      let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) 

      dispatch_async(backgroundQueue, { 
       if listArray["image"] != nil && self.imagesLocalDictionary[indexPath.row] == nil { 
        let u = listArray["image"] as! String 
        let url = NSURL(string: u) 
        if url != nil { 
         let data = NSData(contentsOfURL: url!) 


         if data != nil { 
          dispatch_async(dispatch_get_main_queue(), {() -> Void in 
           imageView.image = UIImage(data: data!) 
           self.imagesLocalDictionary.setObject(data!, forKey: indexPath.row) 
          }) 
         } 
        } 

       } else { 
        dispatch_async(dispatch_get_main_queue(), {() -> Void in 
         imageView.image = UIImage(data: self.imagesLocalDictionary[indexPath.row] as! NSData) 
        }) 
       } 
      }) 
     } 
     return cell 
    } 
} 

私には必要な機能があります。しかしTableViewに非常に不自然なジャークがあり、ユーザーエクスペリエンスが悪くなります。

+3

これはあなたの質問とは関係ありません。ちょうど提案。数百のステートメントでCellForRowメソッドをダンプしないでください。小さな関数に分割して呼び出す。特定のセルでデバッグして変更すると、100行全体を処理するのではなく、特定の方法を変更できるようになります。 – Manoj

+3

'let data = NSData(contentsOfURL:url!)'の中で使用しないでください。 –

+0

@ Mr.Bistaありがとうございました。何が – oops

答えて

0

このコードには、パフォーマンスを向上させるためにいくつかの改善点があります。

  1. 各セル毎に固有のカスタムクラスを定義し、作成cellForRowAtの開始時にcellForRowAt
  2. で使用されるロジックを削減
  3. のviewDidLoad
  4. に再利用するためにそれらを登録cellForRowで細胞を登録しないでくださいセルの新しいインスタンスを作成し、後で他のケースが一致しない場合はサブビューを追加します。このセルの再利用はありません。常に再使用してください。より少ないリソースを使用する

私は複雑なテーブルビューを構築し、特定のindexPathの再利用可能セルを設定して返す関数を作成しました。

class LargeImageCell: UITableViewCell { 
    var imageView: UIImageView() 

    // in init, init the cell, add imageview as subview, setup constraints 

    func setContent(imageURL: URL) { 
     // load image from cache or fetch from network in background 
    } 
} 

// in tableview/view controller 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    switch indexPath.row { 
    case 0: 
     return self.getLargeImageCell(indexPath: indexPath) 
    // all other cases 
    } 
} 

これは単に細胞内のロジックの量を削減しようと、ちょうど大体私は私を実装する方法であると私はalwayss、cellForRowAtでそれらを追加するのではなく、カスタムセルを作成するセルの設定をできるように、それ最善を見つけました自分自身

func getLargeImageCell(indexPath: NSIndexPath) -> UITableViewCell { 
    let data = self.data[indexPath.row] // model from db 

    var cell: UITableViewCell 
    if let c = self.tableView.dequeueReusableCellWithIdentifier("largeImageCell") as? LargeImageCell { 
     cell = c 
    } else { 
     cell = LargeImageCell(style: UITableViewCellStyle.Default, reuseIdentifier: "largeImageCell") 
    } 
    cell.setContent(imageURL: data.imageURL) 
    return cell 
} 
+0

registerNibはすでにviewdidloadにあります – oops

+0

cellForRowAtにはregisterClassがたくさんあります – Scriptable

関連する問題