0

I am using UICollectionView didSelectItemAt to update a UI label that I set up in my HomeController. So basically when I press the cell I want my text to be updated. However the text doesn't update, I have debugged though and the value changes. I have tried everything, both setNeedsDisplay() and running through main thread (which it already does)

I have quite a lot of code in these classes (I don't use storyboard) but this is the label setup (sits in HomeController):

import UIKit
import CoreData

class mainHomeController: UICollectionViewController, UICollectionViewDelegateFlowLayout {
static let sharedInstance = HomeController()

    override func viewDidLoad() {
        super.viewDidLoad()


        setupBasketBar()

    }

    let totNumber: UILabel = {
        let label = UILabel()
        label.text = "0"
        label.numberOfLines = 2
        return label
    }()

    func setupBasketBar() {

        self.view.addSubview(totNumber)
        totNumber.translatesAutoresizingMaskIntoConstraints = false
        totNumber.leadingAnchor.constraint(equalTo: view.leadingAnchor,constant: 330).isActive = true
        totNumber.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        totNumber.bottomAnchor.constraint(equalTo: view.bottomAnchor,constant: 0).isActive = true
        totNumber.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 5).isActive = true


    }

}

and this sits in the feed cell:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    HomeController.sharedInstance.totNumber.text = ("234")
    HomeController.sharedInstance.totNumber.setNeedsDisplay()


}

I have edited out the relevant parts.

This is the whole code for the HomeController:

import UIKit
import CoreData

class HomeController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    static let sharedInstance = HomeController()

    let cellId = "cellId"
    let trendingCellId = "trendingCellId"
    let subscriptionCellId = "subscriptionCellId"

    let titles = ["Home", "Trending", "Subscriptions", "Account"]

    override func viewDidLoad() {

        super.viewDidLoad()

        navigationController?.navigationBar.isTranslucent = false

        let titleLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 30, height: view.frame.height))
        titleLabel.text = "Home"
        titleLabel.textColor = UIColor.black
        titleLabel.font = UIFont.systemFont(ofSize: 20)
        navigationItem.titleView = titleLabel

        setupCollectionView()
        setupMenuBar()
        setupBasketBar()

    }

    func setupCollectionView() {
        if let flowLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
            flowLayout.scrollDirection = .horizontal
            flowLayout.minimumLineSpacing = 0
        }

        collectionView?.backgroundColor = UIColor.white
        collectionView?.register(FeedCell.self, forCellWithReuseIdentifier: cellId)
        collectionView?.register(TrendingCell.self, forCellWithReuseIdentifier: trendingCellId)
        collectionView?.register(SubscriptionCell.self, forCellWithReuseIdentifier: subscriptionCellId)


        collectionView?.contentInset = UIEdgeInsetsMake(50, 0, 0, 0)
        collectionView?.scrollIndicatorInsets = UIEdgeInsetsMake(50, 0, 0, 0)

        collectionView?.isPagingEnabled = true
    }

    lazy var settingsLauncher: SettingsLauncher = {
        let launcher = SettingsLauncher()
        launcher.homeController = self
        return launcher
    }()

    func handleMore() {
        //show menu
        settingsLauncher.showSettings()
    }

    func showControllerForSetting(_ setting: Setting) {
        let dummySettingsViewController = UIViewController()
        dummySettingsViewController.view.backgroundColor = UIColor.white
        dummySettingsViewController.navigationItem.title = setting.name.rawValue
        navigationController?.navigationBar.tintColor = UIColor.white
        navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
        navigationController?.pushViewController(dummySettingsViewController, animated: true)
    }

    func handleSearch() {
        scrollToMenuIndex(2)

    }

    func scrollToMenuIndex(_ menuIndex: Int) {
        let indexPath = IndexPath(item: menuIndex, section: 0)
        collectionView?.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition(), animated: true)

        setTitleForIndex(menuIndex)
    }


    fileprivate func setTitleForIndex(_ index: Int) {
        if let titleLabel = navigationItem.titleView as? UILabel {
            titleLabel.text = "  \(titles[index])"
        }

    }

    lazy var menuBar: MenuBar = {
        let mb = MenuBar()
        mb.homeController = self
        return mb
    }()

    func buttonAction(sender: UIButton!) {
        let btnsendtag: UIButton = sender
        if btnsendtag.tag == 1 {

            let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

            let vc: UINavigationController = storyboard.instantiateViewController(withIdentifier: "NewViewController") as! UINavigationController

            self.present(vc, animated: true, completion: nil)

        }

    }

    let totLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21))
    let btn: UIButton = UIButton(frame: CGRect(x: 0, y: 600, width: 500, height: 80))

    func setupBasketBar() {

        //Checkout button
        btn.backgroundColor = UIColor.rgb(36, green: 51, blue: 70)

        btn.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
        btn.tag = 1
        self.view.addSubview(btn)
        btn.setTitleColor(UIColor.yellow, for: .normal)

        //Button that updates the current amount

        totLabel.text = "Total amount"
        totLabel.textColor = UIColor.white
        self.view.addSubview(totLabel)

        //constraints

        totLabel.translatesAutoresizingMaskIntoConstraints = false
        totLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20).isActive = true
        totLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        totLabel.bottomAnchor.constraint(equalTo: view.bottomAnchor,constant: 0).isActive = true
        totLabel.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.1).isActive = true


        //oldconstraints

      /*  self.view.addSubview(totNumber)
        totNumber.translatesAutoresizingMaskIntoConstraints = false
        totNumber.leadingAnchor.constraint(equalTo: view.leadingAnchor,constant: 330).isActive = true
        totNumber.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        totNumber.bottomAnchor.constraint(equalTo: view.bottomAnchor,constant: 0).isActive = true
        totNumber.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.1).isActive = true*/


    }

    fileprivate func setupMenuBar() {
        navigationController?.hidesBarsOnSwipe = false

        let redView = UIView()
        redView.backgroundColor = UIColor.rgb(36, green: 51, blue: 70)
        view.addSubview(redView)
        view.addConstraintsWithFormat("H:|[v0]|", views: redView)
        view.addConstraintsWithFormat("V:[v0(50)]", views: redView)

        view.addSubview(menuBar)
        view.addConstraintsWithFormat("H:|[v0]|", views: menuBar)
        view.addConstraintsWithFormat("V:[v0(50)]", views: menuBar)


        menuBar.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true
    }


    override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {   

        let index = targetContentOffset.pointee.x / view.frame.width

        let indexPath = IndexPath(item: Int(index), section: 0)
        menuBar.collectionView.selectItem(at: indexPath, animated: true, scrollPosition: UICollectionViewScrollPosition.centeredHorizontally)

        setTitleForIndex(Int(index))
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 5

    }

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

        let identifier: String
        if indexPath.item == 1 {
            identifier = trendingCellId
        } else if indexPath.item == 2 {
            identifier = subscriptionCellId
        } else {
            identifier = cellId
        }

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath)

        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: view.frame.width, height: view.frame.height - 50)
    }

}
chetbaker
  • 23
  • 8
  • Possible duplicate of [How to make a simple collection view with Swift](http://stackoverflow.com/questions/31735228/how-to-make-a-simple-collection-view-with-swift) – Sagar Bhut Apr 05 '17 at 11:55
  • Welcome to stackoverflow! I'm almost certain that the approach of using the singleton pattern (with `sharedInstance`) is a more complicated and unnecessary approach for what you're trying to achieve. Is `mainHomeController` a typo, or does your project include both `mainHomeController` and `HomeController` classes? Is the `didSelectItemAt` method called on `HomeController` or `mainHomeController`? It might seem like a lot, but if you could paste the entire class that would probably help a lot. – MathewS Apr 05 '17 at 19:38
  • Thanks @MathewS! I'm new pretty new to coding as well, I guess what I want to achieve should be a lot easier... Yes, there is only one `HomeController` - was a typo as I wanted to make the code cleaner, sorry. I have uploaded all code for my `HomeController` above. Basically I send an `string array` into my `collectionViewCells` through `JSON`. I then use a button to send the array data from the cell to the `HomeController` `UILabel` – chetbaker Apr 06 '17 at 00:48

2 Answers2

1

Okay! looking at the updated code snippet the sharedInstance singleton is definitely not needed - I'd remove that completely.

The didSelectItemAt method then just needs to be this:

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    totNumber.text = "234"
}
MathewS
  • 2,187
  • 2
  • 17
  • 30
0

I'm guessing your sharedInstance variable is a new instance of the view controller, this is separate from the one that is allocated and displayed from storyboards or segues. You should set sharedInstance equal to self inside viewDidLoad

Dan F
  • 16,994
  • 5
  • 69
  • 108
  • Yes, I too think so. `SharedInstance` is a new instance and has different memory location than `self`. – ron27 Apr 05 '17 at 12:04
  • Thanks a lot! I was suspecting something was wrong with the shared instance. How do you set the sharedInstance equal to self in the viewDidLoad exactly? I'm new to coding, can't really figure it out. – chetbaker Apr 05 '17 at 12:51