Сегментконтроль не выбирается в ios swift - PullRequest
0 голосов
/ 01 декабря 2018

Я использовал сегментный контроль внутри проекта.И при его выборе я отображаю данные моего табличного представления, но после загрузки ничего не отображается, но после нажатия кнопки все данные отображаются.Таким образом, проблема в том, что по умолчанию выбран мой сегментный контроль, но данные не заполняются в табличном представлении.Тем не менее, я использовал выбранный метод управления сегментами

// 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)
    }

}

Внутри ячейки я делаю эту операцию

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

    }


}

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

На самом деле, когда вы вызываете callUpdateOrders в сегменте ControlControl в первый раз, он не получает данные в updateArray.так назовите это в callMyOrders, как предложил Роберт.

0 голосов
/ 01 декабря 2018

Проблема в том, что вы звоните callUpdatedOrders(totalOrders: totalOrders) от действия вашего UISegmentedControl в тот момент, когда у вас нет totalOrders, потому что у вас еще нет данных.Поэтому, если вы хотите отобразить данные, когда появится ваш ViewController, вызовите callMyOrders(), как вы делаете, и в этом методе вызовите callUpdatedOrders(totalOrders: totalOrders) сразу после добавления заказов к totalOrders

if let details = orderObj.bookingMasterModels {

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

self.callUpdatedOrders(totalOrders: totalOrders)

Примечания:

  • Вам не нужно вызывать функции callUpdatedOrders, ... с параметром totalOrders, поскольку totalOrders является глобальной переменной
  • В вашемв случае viewDidLoad вы должны вызывать только super.viewDidLoad() и configureSearchController()
  • В конце callMyOrders() вам не нужно звонить self.tableView.reloadData(), это вызов, когда вы устанавливаете значение upcomingOrders
...