Data From Label in CollectionViewCell Sometimes Refreshes on Reload other times it Doesn't












0















First let me say this seems to be a common question on SO and I've read through every post I could find from Swift to Obj-C. I tried a bunch of different things over the last 9 hrs but my problem still exists.



I have a vc (vc1) with a collectionView in it. Inside the collectionView I have a custom cell with a label and an imageView inside of it. Inside cellForItem I have a property that is also inside the the custom cell and when the property gets set from datasource[indePath.item] there is a property observer inside the cell that sets data for the label and imageView.



There is a button in vc1 that pushes on vc2, if a user chooses something from vc2 it gets passed back to vc1 via a delegate. vc2 gets popped.



The correct data always gets passed back (I checked multiple times in the debugger).



The problem is if vc1 has an existing cell in it, when the new data is added to the data source, after I reload the collectionView, the label data from that first cell now shows on the label in new cell and the data from the new cell now shows on the label from old cell.



I've tried everything from prepareToReuse to removing the label but for some reason only the cell's label data gets confused. The odd thing is sometimes the label updates correctly and other times it doesn't? The imageView ALWAYS shows the correct image and I never have any problems even when the label data is incorrect. The 2 model objects that are inside the datasource are always in their correct index position with the correct information.



What could be the problem?



vc1: UIViewController, CollectionViewDataSource & Delegate {

var datasource = [MyModel]() // has 1 item in it from viewDidLoad

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: customCell, for: indexPath) as! CustomCell

cell.priceLabel.text = ""
cell.cleanUpElements()
cell.myModel = dataSource[indexPath.item]

return cell
}

// delegate method from vc2
func appendNewDataFromVC2(myModel: MyModel) {

// show spinner

datasource.append(myModel) // now has 2 items in it

// now that new data is added I have to make a dip to fb for some additional information
firebaseRef.observeSingleEvent(of: .value, with: { (snapshot) in

if let dict = snapshot.value as? [String: Any] else { }

for myModel in self.datasource {
myModel.someValue = dict["someValue"] as? String
}

// I added the gcd timer just to give the loop time to finish just to see if it made a difference
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {

self.datasource.sort { return $0.postDate > $1.postDate } // Even though this sorts correctly I also tried commenting this out but no difference
self.collectionView.reloadData()

// I also tried to update the layout
self.collectionView.layoutIfNeeded()

// remove spinner
}
})
}
}


CustomCell Below. This is a much more simplified version of what's inside the myModel property observer. The data that shows in the label is dependent on other data and there are a few conditionals that determine it. Adding all of that inside cellForItem would create a bunch of code that's why I didn't update the data it in there (or add it here) and choose to do it inside the cell instead. But as I said earlier, when I check the data it is always 100% correct. The property observer always works correctly.



CustomCell: UICollectionViewCell {

let imageView: UIImageView = {
let iv = UIImageView()
iv.translatesAutoresizingMaskIntoConstraints = false
return iv
}()

let priceLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()

var someBoolProperty = false

var myModel: MyModel? {
didSet {

someBoolProperty = true

// I read an answer that said try to update the label on the main thread but no difference. I tried with and without the DispatchQueue
DispatchQueue.main.async { [weak self] in
self?.priceLabel.text = myModel.price!
self?.priceLabel.layoutIfNeeded() // tried with and without this
}

let url = URL(string: myModel.urlStr!)
imageView.sd_setImage(with: url!, placeholderImage: UIImage(named: "placeholder"))

// set imageView and priceLabel anchors
addSubview(imageView)
addSubview(priceLabel)

self.layoutIfNeeded() // tried with and without this
}
}

override func prepareForReuse() {
super.prepareForReuse()

// even though Apple recommends not to clean up ui elements in here, I still tried it to no success
priceLabel.text = ""
priceLabel.layoutIfNeeded() // tried with and without this
self.layoutIfNeeded() // tried with and without this

// I also tried removing the label with and without the 3 lines above
for view in self.subviews {
if view.isKind(of: UILabel.self) {
view.removeFromSuperview()
}
}
}

func cleanUpElements() {
priceLabel.text = ""
imageView.image = nil
}
}


I added 1 breakpoint for everywhere I added priceLabel.text = "" (3 total) and once the collectionView reloads the break points always get hit 6 times (3 times for the 2 objects in the datasource).The 1st time in prepareForReuse, the 2nd time in cellForItem, and the 3rd time in cleanUpElements()










share|improve this question





























    0















    First let me say this seems to be a common question on SO and I've read through every post I could find from Swift to Obj-C. I tried a bunch of different things over the last 9 hrs but my problem still exists.



    I have a vc (vc1) with a collectionView in it. Inside the collectionView I have a custom cell with a label and an imageView inside of it. Inside cellForItem I have a property that is also inside the the custom cell and when the property gets set from datasource[indePath.item] there is a property observer inside the cell that sets data for the label and imageView.



    There is a button in vc1 that pushes on vc2, if a user chooses something from vc2 it gets passed back to vc1 via a delegate. vc2 gets popped.



    The correct data always gets passed back (I checked multiple times in the debugger).



    The problem is if vc1 has an existing cell in it, when the new data is added to the data source, after I reload the collectionView, the label data from that first cell now shows on the label in new cell and the data from the new cell now shows on the label from old cell.



    I've tried everything from prepareToReuse to removing the label but for some reason only the cell's label data gets confused. The odd thing is sometimes the label updates correctly and other times it doesn't? The imageView ALWAYS shows the correct image and I never have any problems even when the label data is incorrect. The 2 model objects that are inside the datasource are always in their correct index position with the correct information.



    What could be the problem?



    vc1: UIViewController, CollectionViewDataSource & Delegate {

    var datasource = [MyModel]() // has 1 item in it from viewDidLoad

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: customCell, for: indexPath) as! CustomCell

    cell.priceLabel.text = ""
    cell.cleanUpElements()
    cell.myModel = dataSource[indexPath.item]

    return cell
    }

    // delegate method from vc2
    func appendNewDataFromVC2(myModel: MyModel) {

    // show spinner

    datasource.append(myModel) // now has 2 items in it

    // now that new data is added I have to make a dip to fb for some additional information
    firebaseRef.observeSingleEvent(of: .value, with: { (snapshot) in

    if let dict = snapshot.value as? [String: Any] else { }

    for myModel in self.datasource {
    myModel.someValue = dict["someValue"] as? String
    }

    // I added the gcd timer just to give the loop time to finish just to see if it made a difference
    DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {

    self.datasource.sort { return $0.postDate > $1.postDate } // Even though this sorts correctly I also tried commenting this out but no difference
    self.collectionView.reloadData()

    // I also tried to update the layout
    self.collectionView.layoutIfNeeded()

    // remove spinner
    }
    })
    }
    }


    CustomCell Below. This is a much more simplified version of what's inside the myModel property observer. The data that shows in the label is dependent on other data and there are a few conditionals that determine it. Adding all of that inside cellForItem would create a bunch of code that's why I didn't update the data it in there (or add it here) and choose to do it inside the cell instead. But as I said earlier, when I check the data it is always 100% correct. The property observer always works correctly.



    CustomCell: UICollectionViewCell {

    let imageView: UIImageView = {
    let iv = UIImageView()
    iv.translatesAutoresizingMaskIntoConstraints = false
    return iv
    }()

    let priceLabel: UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
    }()

    var someBoolProperty = false

    var myModel: MyModel? {
    didSet {

    someBoolProperty = true

    // I read an answer that said try to update the label on the main thread but no difference. I tried with and without the DispatchQueue
    DispatchQueue.main.async { [weak self] in
    self?.priceLabel.text = myModel.price!
    self?.priceLabel.layoutIfNeeded() // tried with and without this
    }

    let url = URL(string: myModel.urlStr!)
    imageView.sd_setImage(with: url!, placeholderImage: UIImage(named: "placeholder"))

    // set imageView and priceLabel anchors
    addSubview(imageView)
    addSubview(priceLabel)

    self.layoutIfNeeded() // tried with and without this
    }
    }

    override func prepareForReuse() {
    super.prepareForReuse()

    // even though Apple recommends not to clean up ui elements in here, I still tried it to no success
    priceLabel.text = ""
    priceLabel.layoutIfNeeded() // tried with and without this
    self.layoutIfNeeded() // tried with and without this

    // I also tried removing the label with and without the 3 lines above
    for view in self.subviews {
    if view.isKind(of: UILabel.self) {
    view.removeFromSuperview()
    }
    }
    }

    func cleanUpElements() {
    priceLabel.text = ""
    imageView.image = nil
    }
    }


    I added 1 breakpoint for everywhere I added priceLabel.text = "" (3 total) and once the collectionView reloads the break points always get hit 6 times (3 times for the 2 objects in the datasource).The 1st time in prepareForReuse, the 2nd time in cellForItem, and the 3rd time in cleanUpElements()










    share|improve this question



























      0












      0








      0








      First let me say this seems to be a common question on SO and I've read through every post I could find from Swift to Obj-C. I tried a bunch of different things over the last 9 hrs but my problem still exists.



      I have a vc (vc1) with a collectionView in it. Inside the collectionView I have a custom cell with a label and an imageView inside of it. Inside cellForItem I have a property that is also inside the the custom cell and when the property gets set from datasource[indePath.item] there is a property observer inside the cell that sets data for the label and imageView.



      There is a button in vc1 that pushes on vc2, if a user chooses something from vc2 it gets passed back to vc1 via a delegate. vc2 gets popped.



      The correct data always gets passed back (I checked multiple times in the debugger).



      The problem is if vc1 has an existing cell in it, when the new data is added to the data source, after I reload the collectionView, the label data from that first cell now shows on the label in new cell and the data from the new cell now shows on the label from old cell.



      I've tried everything from prepareToReuse to removing the label but for some reason only the cell's label data gets confused. The odd thing is sometimes the label updates correctly and other times it doesn't? The imageView ALWAYS shows the correct image and I never have any problems even when the label data is incorrect. The 2 model objects that are inside the datasource are always in their correct index position with the correct information.



      What could be the problem?



      vc1: UIViewController, CollectionViewDataSource & Delegate {

      var datasource = [MyModel]() // has 1 item in it from viewDidLoad

      func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: customCell, for: indexPath) as! CustomCell

      cell.priceLabel.text = ""
      cell.cleanUpElements()
      cell.myModel = dataSource[indexPath.item]

      return cell
      }

      // delegate method from vc2
      func appendNewDataFromVC2(myModel: MyModel) {

      // show spinner

      datasource.append(myModel) // now has 2 items in it

      // now that new data is added I have to make a dip to fb for some additional information
      firebaseRef.observeSingleEvent(of: .value, with: { (snapshot) in

      if let dict = snapshot.value as? [String: Any] else { }

      for myModel in self.datasource {
      myModel.someValue = dict["someValue"] as? String
      }

      // I added the gcd timer just to give the loop time to finish just to see if it made a difference
      DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {

      self.datasource.sort { return $0.postDate > $1.postDate } // Even though this sorts correctly I also tried commenting this out but no difference
      self.collectionView.reloadData()

      // I also tried to update the layout
      self.collectionView.layoutIfNeeded()

      // remove spinner
      }
      })
      }
      }


      CustomCell Below. This is a much more simplified version of what's inside the myModel property observer. The data that shows in the label is dependent on other data and there are a few conditionals that determine it. Adding all of that inside cellForItem would create a bunch of code that's why I didn't update the data it in there (or add it here) and choose to do it inside the cell instead. But as I said earlier, when I check the data it is always 100% correct. The property observer always works correctly.



      CustomCell: UICollectionViewCell {

      let imageView: UIImageView = {
      let iv = UIImageView()
      iv.translatesAutoresizingMaskIntoConstraints = false
      return iv
      }()

      let priceLabel: UILabel = {
      let label = UILabel()
      label.translatesAutoresizingMaskIntoConstraints = false
      return label
      }()

      var someBoolProperty = false

      var myModel: MyModel? {
      didSet {

      someBoolProperty = true

      // I read an answer that said try to update the label on the main thread but no difference. I tried with and without the DispatchQueue
      DispatchQueue.main.async { [weak self] in
      self?.priceLabel.text = myModel.price!
      self?.priceLabel.layoutIfNeeded() // tried with and without this
      }

      let url = URL(string: myModel.urlStr!)
      imageView.sd_setImage(with: url!, placeholderImage: UIImage(named: "placeholder"))

      // set imageView and priceLabel anchors
      addSubview(imageView)
      addSubview(priceLabel)

      self.layoutIfNeeded() // tried with and without this
      }
      }

      override func prepareForReuse() {
      super.prepareForReuse()

      // even though Apple recommends not to clean up ui elements in here, I still tried it to no success
      priceLabel.text = ""
      priceLabel.layoutIfNeeded() // tried with and without this
      self.layoutIfNeeded() // tried with and without this

      // I also tried removing the label with and without the 3 lines above
      for view in self.subviews {
      if view.isKind(of: UILabel.self) {
      view.removeFromSuperview()
      }
      }
      }

      func cleanUpElements() {
      priceLabel.text = ""
      imageView.image = nil
      }
      }


      I added 1 breakpoint for everywhere I added priceLabel.text = "" (3 total) and once the collectionView reloads the break points always get hit 6 times (3 times for the 2 objects in the datasource).The 1st time in prepareForReuse, the 2nd time in cellForItem, and the 3rd time in cleanUpElements()










      share|improve this question
















      First let me say this seems to be a common question on SO and I've read through every post I could find from Swift to Obj-C. I tried a bunch of different things over the last 9 hrs but my problem still exists.



      I have a vc (vc1) with a collectionView in it. Inside the collectionView I have a custom cell with a label and an imageView inside of it. Inside cellForItem I have a property that is also inside the the custom cell and when the property gets set from datasource[indePath.item] there is a property observer inside the cell that sets data for the label and imageView.



      There is a button in vc1 that pushes on vc2, if a user chooses something from vc2 it gets passed back to vc1 via a delegate. vc2 gets popped.



      The correct data always gets passed back (I checked multiple times in the debugger).



      The problem is if vc1 has an existing cell in it, when the new data is added to the data source, after I reload the collectionView, the label data from that first cell now shows on the label in new cell and the data from the new cell now shows on the label from old cell.



      I've tried everything from prepareToReuse to removing the label but for some reason only the cell's label data gets confused. The odd thing is sometimes the label updates correctly and other times it doesn't? The imageView ALWAYS shows the correct image and I never have any problems even when the label data is incorrect. The 2 model objects that are inside the datasource are always in their correct index position with the correct information.



      What could be the problem?



      vc1: UIViewController, CollectionViewDataSource & Delegate {

      var datasource = [MyModel]() // has 1 item in it from viewDidLoad

      func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: customCell, for: indexPath) as! CustomCell

      cell.priceLabel.text = ""
      cell.cleanUpElements()
      cell.myModel = dataSource[indexPath.item]

      return cell
      }

      // delegate method from vc2
      func appendNewDataFromVC2(myModel: MyModel) {

      // show spinner

      datasource.append(myModel) // now has 2 items in it

      // now that new data is added I have to make a dip to fb for some additional information
      firebaseRef.observeSingleEvent(of: .value, with: { (snapshot) in

      if let dict = snapshot.value as? [String: Any] else { }

      for myModel in self.datasource {
      myModel.someValue = dict["someValue"] as? String
      }

      // I added the gcd timer just to give the loop time to finish just to see if it made a difference
      DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {

      self.datasource.sort { return $0.postDate > $1.postDate } // Even though this sorts correctly I also tried commenting this out but no difference
      self.collectionView.reloadData()

      // I also tried to update the layout
      self.collectionView.layoutIfNeeded()

      // remove spinner
      }
      })
      }
      }


      CustomCell Below. This is a much more simplified version of what's inside the myModel property observer. The data that shows in the label is dependent on other data and there are a few conditionals that determine it. Adding all of that inside cellForItem would create a bunch of code that's why I didn't update the data it in there (or add it here) and choose to do it inside the cell instead. But as I said earlier, when I check the data it is always 100% correct. The property observer always works correctly.



      CustomCell: UICollectionViewCell {

      let imageView: UIImageView = {
      let iv = UIImageView()
      iv.translatesAutoresizingMaskIntoConstraints = false
      return iv
      }()

      let priceLabel: UILabel = {
      let label = UILabel()
      label.translatesAutoresizingMaskIntoConstraints = false
      return label
      }()

      var someBoolProperty = false

      var myModel: MyModel? {
      didSet {

      someBoolProperty = true

      // I read an answer that said try to update the label on the main thread but no difference. I tried with and without the DispatchQueue
      DispatchQueue.main.async { [weak self] in
      self?.priceLabel.text = myModel.price!
      self?.priceLabel.layoutIfNeeded() // tried with and without this
      }

      let url = URL(string: myModel.urlStr!)
      imageView.sd_setImage(with: url!, placeholderImage: UIImage(named: "placeholder"))

      // set imageView and priceLabel anchors
      addSubview(imageView)
      addSubview(priceLabel)

      self.layoutIfNeeded() // tried with and without this
      }
      }

      override func prepareForReuse() {
      super.prepareForReuse()

      // even though Apple recommends not to clean up ui elements in here, I still tried it to no success
      priceLabel.text = ""
      priceLabel.layoutIfNeeded() // tried with and without this
      self.layoutIfNeeded() // tried with and without this

      // I also tried removing the label with and without the 3 lines above
      for view in self.subviews {
      if view.isKind(of: UILabel.self) {
      view.removeFromSuperview()
      }
      }
      }

      func cleanUpElements() {
      priceLabel.text = ""
      imageView.image = nil
      }
      }


      I added 1 breakpoint for everywhere I added priceLabel.text = "" (3 total) and once the collectionView reloads the break points always get hit 6 times (3 times for the 2 objects in the datasource).The 1st time in prepareForReuse, the 2nd time in cellForItem, and the 3rd time in cleanUpElements()







      ios swift uicollectionview uilabel uicollectionviewcell






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Dec 31 '18 at 0:21







      Lance Samaria

















      asked Dec 30 '18 at 23:38









      Lance SamariaLance Samaria

      2,32621449




      2,32621449
























          1 Answer
          1






          active

          oldest

          votes


















          0














          Turns out I had to reset a property inside the cell. Even though the cells were being reused and the priceLabel.text was getting cleared, the property was still maintaining it's old bool value. Once I reset it via cellForItem the problem went away.



          10 hrs for that, smh



          func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

          let cell = collectionView.dequeueReusableCell(withReuseIdentifier: customCell, for: indexPath) as! CustomCell

          cell.someBoolProperty = false
          cell.priceLabel.text = ""
          cell.cleanUpElements()
          cell.myModel = dataSource[indexPath.item]

          return cell
          }





          share|improve this answer
























          • Look into prepareForReuse in your cell to clean up afterwards instead of cleaning up when dequeuing.

            – FJ de Brienne
            Dec 31 '18 at 0:44











          • @FJdeBrienne Apple recommends against that but if you look in the question I did tried it anyway. Reread the question and you’ll see prepareToReuse with the cleanup code in it. Thanks for the suggestion though

            – Lance Samaria
            Dec 31 '18 at 0:46











          • Sorry @LanceSamaria hadn’t noticed. I’m surprised by your statement of Apple not recommending it since it is their API function to specifically prépare a reusable cell prior to its reuse. Glad you got it working!

            – FJ de Brienne
            Dec 31 '18 at 14:28











          • @FJdeBrienne read more about it here: stackoverflow.com/q/40773208/4833705. Happy New Years!

            – Lance Samaria
            Dec 31 '18 at 14:33













          • thanks for the heads up, I've been using prepareForReuse to do this for a while now and haven't noticed any adverse effects. It seems it is related to performance more than function. Happy new year to you too!

            – FJ de Brienne
            Dec 31 '18 at 15:22











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53982323%2fdata-from-label-in-collectionviewcell-sometimes-refreshes-on-reload-other-times%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0














          Turns out I had to reset a property inside the cell. Even though the cells were being reused and the priceLabel.text was getting cleared, the property was still maintaining it's old bool value. Once I reset it via cellForItem the problem went away.



          10 hrs for that, smh



          func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

          let cell = collectionView.dequeueReusableCell(withReuseIdentifier: customCell, for: indexPath) as! CustomCell

          cell.someBoolProperty = false
          cell.priceLabel.text = ""
          cell.cleanUpElements()
          cell.myModel = dataSource[indexPath.item]

          return cell
          }





          share|improve this answer
























          • Look into prepareForReuse in your cell to clean up afterwards instead of cleaning up when dequeuing.

            – FJ de Brienne
            Dec 31 '18 at 0:44











          • @FJdeBrienne Apple recommends against that but if you look in the question I did tried it anyway. Reread the question and you’ll see prepareToReuse with the cleanup code in it. Thanks for the suggestion though

            – Lance Samaria
            Dec 31 '18 at 0:46











          • Sorry @LanceSamaria hadn’t noticed. I’m surprised by your statement of Apple not recommending it since it is their API function to specifically prépare a reusable cell prior to its reuse. Glad you got it working!

            – FJ de Brienne
            Dec 31 '18 at 14:28











          • @FJdeBrienne read more about it here: stackoverflow.com/q/40773208/4833705. Happy New Years!

            – Lance Samaria
            Dec 31 '18 at 14:33













          • thanks for the heads up, I've been using prepareForReuse to do this for a while now and haven't noticed any adverse effects. It seems it is related to performance more than function. Happy new year to you too!

            – FJ de Brienne
            Dec 31 '18 at 15:22
















          0














          Turns out I had to reset a property inside the cell. Even though the cells were being reused and the priceLabel.text was getting cleared, the property was still maintaining it's old bool value. Once I reset it via cellForItem the problem went away.



          10 hrs for that, smh



          func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

          let cell = collectionView.dequeueReusableCell(withReuseIdentifier: customCell, for: indexPath) as! CustomCell

          cell.someBoolProperty = false
          cell.priceLabel.text = ""
          cell.cleanUpElements()
          cell.myModel = dataSource[indexPath.item]

          return cell
          }





          share|improve this answer
























          • Look into prepareForReuse in your cell to clean up afterwards instead of cleaning up when dequeuing.

            – FJ de Brienne
            Dec 31 '18 at 0:44











          • @FJdeBrienne Apple recommends against that but if you look in the question I did tried it anyway. Reread the question and you’ll see prepareToReuse with the cleanup code in it. Thanks for the suggestion though

            – Lance Samaria
            Dec 31 '18 at 0:46











          • Sorry @LanceSamaria hadn’t noticed. I’m surprised by your statement of Apple not recommending it since it is their API function to specifically prépare a reusable cell prior to its reuse. Glad you got it working!

            – FJ de Brienne
            Dec 31 '18 at 14:28











          • @FJdeBrienne read more about it here: stackoverflow.com/q/40773208/4833705. Happy New Years!

            – Lance Samaria
            Dec 31 '18 at 14:33













          • thanks for the heads up, I've been using prepareForReuse to do this for a while now and haven't noticed any adverse effects. It seems it is related to performance more than function. Happy new year to you too!

            – FJ de Brienne
            Dec 31 '18 at 15:22














          0












          0








          0







          Turns out I had to reset a property inside the cell. Even though the cells were being reused and the priceLabel.text was getting cleared, the property was still maintaining it's old bool value. Once I reset it via cellForItem the problem went away.



          10 hrs for that, smh



          func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

          let cell = collectionView.dequeueReusableCell(withReuseIdentifier: customCell, for: indexPath) as! CustomCell

          cell.someBoolProperty = false
          cell.priceLabel.text = ""
          cell.cleanUpElements()
          cell.myModel = dataSource[indexPath.item]

          return cell
          }





          share|improve this answer













          Turns out I had to reset a property inside the cell. Even though the cells were being reused and the priceLabel.text was getting cleared, the property was still maintaining it's old bool value. Once I reset it via cellForItem the problem went away.



          10 hrs for that, smh



          func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

          let cell = collectionView.dequeueReusableCell(withReuseIdentifier: customCell, for: indexPath) as! CustomCell

          cell.someBoolProperty = false
          cell.priceLabel.text = ""
          cell.cleanUpElements()
          cell.myModel = dataSource[indexPath.item]

          return cell
          }






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Dec 31 '18 at 0:19









          Lance SamariaLance Samaria

          2,32621449




          2,32621449













          • Look into prepareForReuse in your cell to clean up afterwards instead of cleaning up when dequeuing.

            – FJ de Brienne
            Dec 31 '18 at 0:44











          • @FJdeBrienne Apple recommends against that but if you look in the question I did tried it anyway. Reread the question and you’ll see prepareToReuse with the cleanup code in it. Thanks for the suggestion though

            – Lance Samaria
            Dec 31 '18 at 0:46











          • Sorry @LanceSamaria hadn’t noticed. I’m surprised by your statement of Apple not recommending it since it is their API function to specifically prépare a reusable cell prior to its reuse. Glad you got it working!

            – FJ de Brienne
            Dec 31 '18 at 14:28











          • @FJdeBrienne read more about it here: stackoverflow.com/q/40773208/4833705. Happy New Years!

            – Lance Samaria
            Dec 31 '18 at 14:33













          • thanks for the heads up, I've been using prepareForReuse to do this for a while now and haven't noticed any adverse effects. It seems it is related to performance more than function. Happy new year to you too!

            – FJ de Brienne
            Dec 31 '18 at 15:22



















          • Look into prepareForReuse in your cell to clean up afterwards instead of cleaning up when dequeuing.

            – FJ de Brienne
            Dec 31 '18 at 0:44











          • @FJdeBrienne Apple recommends against that but if you look in the question I did tried it anyway. Reread the question and you’ll see prepareToReuse with the cleanup code in it. Thanks for the suggestion though

            – Lance Samaria
            Dec 31 '18 at 0:46











          • Sorry @LanceSamaria hadn’t noticed. I’m surprised by your statement of Apple not recommending it since it is their API function to specifically prépare a reusable cell prior to its reuse. Glad you got it working!

            – FJ de Brienne
            Dec 31 '18 at 14:28











          • @FJdeBrienne read more about it here: stackoverflow.com/q/40773208/4833705. Happy New Years!

            – Lance Samaria
            Dec 31 '18 at 14:33













          • thanks for the heads up, I've been using prepareForReuse to do this for a while now and haven't noticed any adverse effects. It seems it is related to performance more than function. Happy new year to you too!

            – FJ de Brienne
            Dec 31 '18 at 15:22

















          Look into prepareForReuse in your cell to clean up afterwards instead of cleaning up when dequeuing.

          – FJ de Brienne
          Dec 31 '18 at 0:44





          Look into prepareForReuse in your cell to clean up afterwards instead of cleaning up when dequeuing.

          – FJ de Brienne
          Dec 31 '18 at 0:44













          @FJdeBrienne Apple recommends against that but if you look in the question I did tried it anyway. Reread the question and you’ll see prepareToReuse with the cleanup code in it. Thanks for the suggestion though

          – Lance Samaria
          Dec 31 '18 at 0:46





          @FJdeBrienne Apple recommends against that but if you look in the question I did tried it anyway. Reread the question and you’ll see prepareToReuse with the cleanup code in it. Thanks for the suggestion though

          – Lance Samaria
          Dec 31 '18 at 0:46













          Sorry @LanceSamaria hadn’t noticed. I’m surprised by your statement of Apple not recommending it since it is their API function to specifically prépare a reusable cell prior to its reuse. Glad you got it working!

          – FJ de Brienne
          Dec 31 '18 at 14:28





          Sorry @LanceSamaria hadn’t noticed. I’m surprised by your statement of Apple not recommending it since it is their API function to specifically prépare a reusable cell prior to its reuse. Glad you got it working!

          – FJ de Brienne
          Dec 31 '18 at 14:28













          @FJdeBrienne read more about it here: stackoverflow.com/q/40773208/4833705. Happy New Years!

          – Lance Samaria
          Dec 31 '18 at 14:33







          @FJdeBrienne read more about it here: stackoverflow.com/q/40773208/4833705. Happy New Years!

          – Lance Samaria
          Dec 31 '18 at 14:33















          thanks for the heads up, I've been using prepareForReuse to do this for a while now and haven't noticed any adverse effects. It seems it is related to performance more than function. Happy new year to you too!

          – FJ de Brienne
          Dec 31 '18 at 15:22





          thanks for the heads up, I've been using prepareForReuse to do this for a while now and haven't noticed any adverse effects. It seems it is related to performance more than function. Happy new year to you too!

          – FJ de Brienne
          Dec 31 '18 at 15:22


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53982323%2fdata-from-label-in-collectionviewcell-sometimes-refreshes-on-reload-other-times%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Monofisismo

          Angular Downloading a file using contenturl with Basic Authentication

          Olmecas