0

I have used segment control inside the project. And in its selection, I am displaying my table view data but after loading nothing is displaying but after the press of a button all data is displaying. So the concern is by default my segment control is selected but data is not populating over table view. Still, I have used a segment control selected method

//ViewController

import UIKit

class MyOrdersVC: UIViewController {

    //MARK: - IBOutlets

    @IBOutlet weak var tableView: UITableView!

    @IBOutlet weak var segmentedControl: UISegmentedControl!

    //MARK: - Variables

    var searchController = UISearchController()

    // list all pagerlist
    var totalOrders = [BookingMasterModel]() {
        didSet {

            tableView.reloadData()
        }
    }

    var upcomingOrders = [BookingMasterModel]() {
        didSet {

            tableView.reloadData()
        }
    }

    var completedOrders = [BookingMasterModel]() {
        didSet {

            tableView.reloadData()
        }
    }

    var cancelledOrders = [BookingMasterModel]() {
        didSet {

            tableView.reloadData()
        }
    }


    var arrFilter:[BookingMasterModel] = [] {
        didSet{
            tableView.reloadData()
        }
    }


    //MARK: ViewController Life cycle

    override func viewDidLoad() {
        super.viewDidLoad()
//        index = 0
        segmentedControl.selectedSegmentIndex = 0

        segmentedControl.setEnabled(true, forSegmentAt: 0)
        segmentedControl.sendActions(for: .valueChanged)
        //searchbar configuration
        configureSearchController()
        //By default Upcoming order is selected

        callUpdatedOrders(totalOrders: totalOrders)


    }


    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(false)
        segmentedControl.selectedSegmentIndex = 0
        callMyOrders()

    }

    //configure SearchViewController
    func configureSearchController() {

        self.searchController = ({
            let controller = UISearchController(searchResultsController: nil)
            controller.searchResultsUpdater = self
            controller.dimsBackgroundDuringPresentation = true
            controller.searchBar.sizeToFit()
            controller.searchBar.placeholder = "Search by Receipt No, Order No"
            controller.searchBar.showsCancelButton = false
            controller.searchBar.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
            controller.searchBar.searchBarStyle = .minimal

            controller.searchBar.setShowsCancelButton(false, animated: false)

            let textFieldInsideSearchBar = controller.searchBar.value(forKey: "searchField") as? UITextField
            let imageView = textFieldInsideSearchBar?.leftView as! UIImageView
            imageView.image = imageView.image?.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
            imageView.tintColor = #colorLiteral(red: 0.8901960784, green: 0.1764705882, blue: 0.2156862745, alpha: 1)

            let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
            imageView.isUserInteractionEnabled = true
            imageView.addGestureRecognizer(tapGestureRecognizer)

            //Add searchbar controller in header
            self.tableView.tableHeaderView = controller.searchBar

            return controller
        })()



    }


    @objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
    {
        let tappedImage = tapGestureRecognizer.view as! UIImageView

        print("Image tapped red")
        // Your action
    }


    //MARK: - Button Action

    @IBAction func segmentedControlAction(_ sender: Any) {

        switch segmentedControl.selectedSegmentIndex {
        case 0:
            print("1")

            callUpdatedOrders(totalOrders: totalOrders)

            break

        case 1:
            print("2")

            callCompletedOrders(totalOrders: totalOrders)
            //            tableView.reloadData()
            //            selectionFlag = 1
            break

        case 2:
            print("3")

            callCancelledOrders(totalOrders: totalOrders)
            //            tableView.reloadData()
            //            selectionFlag = 2
            break

        default:
            print("Select proper segment")
            callUpdatedOrders(totalOrders: totalOrders)
            break
        }
    }

    //MARK: - Arrays

    func callUpdatedOrders(totalOrders : [BookingMasterModel]) {

        upcomingOrders = totalOrders
        upcomingOrders = upcomingOrders.filter { ($0.status != "CANCELLED") || $0.status != "REJECTED" || $0.status != "SERVICED" || $0.status != "DONE" || $0.status != "CREDITED" || $0.status != "DILEVERY" || $0.status != "REPORTED" || $0.status != "PARTIALY DONE" || $0.status != "DISPATCHED"}
    }

    func callCompletedOrders(totalOrders : [BookingMasterModel]) {

        completedOrders = totalOrders
        completedOrders = completedOrders.filter { $0.status == "SERVICED" || $0.status == "DONE" || $0.status == "CREDITED" || $0.status == "DILEVERY" || $0.status == "REPORTED" || $0.status == "PARTIALY DONE" || $0.status == "DISPATCHED" }
    }

    func callCancelledOrders(totalOrders : [BookingMasterModel]) {

        cancelledOrders = totalOrders
        cancelledOrders = cancelledOrders.filter { $0.status == "CANCELLED" || $0.status == "REJECTED" }
    }


    //MARK : - Webservices

    //MARK: View Profile

    func callMyOrders(){


        let url  = Utilities.stringToUrl(urlString: finalUrl)

        WebService.requestServices(url: url, method: .get, parameters: [:], view: view, showLoaderFlag: true) { (json) in

            let orderObj = MyOrderModels(fromJson: json)

            guard let success = orderObj.response else {
                return
            }

            if success == "SUCCESS" {

                if let details = orderObj.bookingMasterModels   {

                    for value in details {

                        self.totalOrders.append(value)

                    }

                    print("Total Orders:- \(self.totalOrders.count)")

                }

                self.tableView.reloadData()
            }

        }

    }


}

extension MyOrdersVC : TableViewDelegateGroup {

    //MARK: UITableViewDelegate

    private func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    }

    private func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 44
    }

    //MARK: UITableViewDataSource
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

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

        //TODO: Switch
        switch segmentedControl.selectedSegmentIndex {
        case 0:
            return searchController.isActive ? arrFilter.count : upcomingOrders.count
        case 1:
            return searchController.isActive ? arrFilter.count : completedOrders.count
        case 2:
            return searchController.isActive ? arrFilter.count : cancelledOrders.count
        default:
            break
        }

        return searchController.isActive ? arrFilter.count : upcomingOrders.count

    }

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

        if let cell = tableView.dequeueReusableCell(withIdentifier:
            MyOrdersTableViewCell.identifier, for: indexPath) as? MyOrdersTableViewCell{

            //TODO: Switch

            var order: BookingMasterModel?

            switch segmentedControl.selectedSegmentIndex {
            case 0:

                order = searchController.isActive ? arrFilter[indexPath.row] : upcomingOrders[indexPath.row]

            case 1:

                order = searchController.isActive ? arrFilter[indexPath.row] : completedOrders[indexPath.row]


            case 2:

                order = searchController.isActive ? arrFilter[indexPath.row] : cancelledOrders[indexPath.row]

            default:

                order = searchController.isActive ? arrFilter[indexPath.row] : upcomingOrders[indexPath.row]

            }


            cell.orderDetails = order
            cell.setOrders()

            //Logic to display color background
            var count : Int = 0
            //suppose indexpath count exceeds to colorarray count then count = 32 /31 = 1 .... 2... 
            count = indexPath.row / colorArray.count

            var x: Int = 0
            x = indexPath.row - (count) * colorArray.count
            cell.backgroundColor = colorArray[x]

            return cell
        }

        return UITableViewCell()
    }


}

extension MyOrdersVC : UISearchResultsUpdating,UISearchBarDelegate{
    func updateSearchResults(for searchController: UISearchController) {

        let searchText = searchController.searchBar.text ?? ""

        switch segmentedControl.selectedSegmentIndex {
        case 0:

            arrFilter = upcomingOrders.filter { order in

                let isMatchingSearchText = order.names.lowercased().contains(searchText.lowercased()) || searchText.lowercased().count == 0

                return isMatchingSearchText

            }

        case 1:
            arrFilter = completedOrders.filter { order in

                let isMatchingSearchText = order.names.lowercased().contains(searchText.lowercased()) || searchText.lowercased().count == 0

                return isMatchingSearchText

            }

        case 2:
            arrFilter = cancelledOrders.filter { order in

                let isMatchingSearchText = order.names.lowercased().contains(searchText.lowercased()) || searchText.lowercased().count == 0

                return isMatchingSearchText

            }

        default:
            break
        }

    }

    private func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
        searchBar.setShowsCancelButton(false, animated: false)
    }

    private func searchBarTextDidEndEditing(searchBar: UISearchBar) {
        searchBar.setShowsCancelButton(false, animated: false)
    }

}

Inside cell, I am doing this operation

import UIKit

class MyOrdersTableViewCell: UITableViewCell {

    //MARK: IBOutlets

    @IBOutlet weak var orderNo: UILabel!

    @IBOutlet weak var apptDateLabel: UILabel!

    //MARK: Variables

    var orderDetails:BookingMasterModel?{
        didSet{
            setOrders()
        }
    }

    class var identifier: String {
        return String(describing: self)
    }

    class var nib: UINib {
        return UINib(nibName: identifier, bundle: nil)
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code


    }

    //MARK: Extra Function
    //*******************

    // function call when set ordres cell called
    func setOrders(){

        guard let txt = orderDetails?.names else {return}
        self.orderNo.text = txt

    }


}
1
  • 2
    Please only post code that is relevant to your question. Commented Dec 1, 2018 at 15:17

2 Answers 2

1

Problem is that you're calling callUpdatedOrders(totalOrders: totalOrders) from action of your UISegmentedControl in moment when you don't have any totalOrders because you haven't got data yet. So if you want to show data when your ViewController will appear, call callMyOrders() how you do and in this method call callUpdatedOrders(totalOrders: totalOrders) right after you append orders to totalOrders

if let details = orderObj.bookingMasterModels {

    for value in details {
        self.totalOrders.append(value)
    }
    print("Total Orders:- \(self.totalOrders.count)")
}

self.callUpdatedOrders(totalOrders: totalOrders)

Notes:

  • You don't have to call functions callUpdatedOrders, ... with parameter totalOrders because totalOrders is global variable
  • In your case in viewDidLoad you should call just super.viewDidLoad() and configureSearchController()
  • At the end of callMyOrders() you don't have to call self.tableView.reloadData() this is call when you set value of upcomingOrders
Sign up to request clarification or add additional context in comments.

Comments

0

Actually when you are calling callUpdateOrders in segmentControl at first time it is not getting data in updatingArray. so call it in callMyOrders as Robert suggested.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.