Обработка данных между ViewController в SJSegmentedViewController

Я использую библиотеку SJSegmentedViewController для моего проекта, github ссылка на модуль

Проблема: у меня есть контроллер основного вида (FilterVC), на котором у меня есть кнопка "APPLY", по ее действию я хочу получить доступ к массиву, хранящемуся в другом viewcontroller (FilterSkillVC), я делаю это с помощью делегирования, но все же я получаю пустой экземпляр

ОБНОВЛЕНОМой код FilterVC

import UIKit
import SJSegmentedScrollView

protocol FilterVCDelegate {
    func btnApply()
}

class FilterVC: UIViewController {

    var selectedSegment: SJSegmentTab?
    var segmentedVC : SJSegmentedViewController?
    var vcDelegate : FilterVCDelegate?

    @IBOutlet weak var containerView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        segmentViewInitialization()
    }

    @IBAction func btnApply(_ sender: Any) {
        vcDelegate?.btnApply()
    }
}

extension FilterVC {

    var titles: [String] {

        return [SegmentTitles.skillSet.rawValue,
                SegmentTitles.cuisines.rawValue,
                SegmentTitles.others.rawValue ]
    }

    var tabs: [String] {

        return [StoryboardId.skillSet.rawValue,
                StoryboardId.skillSet.rawValue,
                StoryboardId.others.rawValue ]
    }

    func segmentViewInitialization() {

        segmentedVC = CSSegment.setupTabs(storyboard: self.storyboard, tabs: tabs, titles: titles) as? SJSegmentedViewController

        segmentedVC?.delegate = self
        segmentedVC?.selectedSegmentViewHeight = 2.0
        segmentedVC?.segmentTitleColor = .white

        segmentedVC?.selectedSegmentViewColor = AppColor.secondary.value
        segmentedVC?.segmentBackgroundColor = AppColor.primary.value
        segmentedVC?.segmentViewHeight = 64.0
        segmentedVC?.segmentShadow = SJShadow.light()
        segmentedVC?.segmentTitleFont = AppFont.avenirMedium.size(14.0)

        containerView.addSubview((segmentedVC?.view)!)
        segmentedVC?.view.frame = containerView.bounds
    }
}

extension FilterVC: SJSegmentedViewControllerDelegate {

    func didMoveToPage(_ controller: UIViewController, segment: SJSegmentTab?, index: Int) {
        if index != tabs.count-1 {
            let filterVC = controller as! FilterSkillVC
            filterVC.updateCurrentHeader(currentTab:SegmentTitles(rawValue: titles[index])!)
        }
        if selectedSegment != nil {
            selectedSegment?.titleColor(.white)
        }

        if (segmentedVC?.segments.count)! > 0 {

            selectedSegment = segmentedVC?.segments[index]
            selectedSegment?.titleColor(AppColor.secondary.value)
        }
    }
}

Код моего навыка VC

    import UIKit

class FilterSkillVC: UIViewController {

    @IBOutlet var tblView: UITableView!
    var instance = FilterVC()
    lazy var arraySkills = [JSTags]()
    lazy var arrayCuisines = [JSTags]()
    var arrayID = [String]()
    var currentHeader: SegmentTitles = .skillSet

    override func viewDidLoad() {
        super.viewDidLoad()
        apiSkillCall()
        apiCuisineCall()
        registerCell(cellId: .filterListCell, forTableView: tblView)
        tblView.tableFooterView = UIView()
//        let instance = FilterVC()
        instance.vcDelegate = self
    }

    func updateCurrentHeader(currentTab : SegmentTitles){
        currentHeader = currentTab
        tblView.reloadData()
    }


    //MARK: ----- Custom Methods
    func countForHeader() -> NSInteger {
        switch currentHeader {
        case .skillSet:
            return arraySkills.count
        case .cuisines:
            return arrayCuisines.count
        default:
            return 0
        }
    }
    func titleForHeader(_ index: NSInteger) -> (name: String?, obj: AnyObject?) {
        switch currentHeader {
        case .skillSet:
            return (name: arraySkills[index].name, obj: arraySkills[index])
        case .cuisines:
            return (name: arrayCuisines[index].name, obj: arrayCuisines[index])
        default:
            return (name: nil, obj: nil)

        }
    }

    //MARK: ----- Handle Response Methods
    func handleSkillsResponse(response: Response) {
        switch response{

        case .success(let response):
            if let skills = response as? [JSTags] {
                self.arraySkills = skills
            }
        case .failure(let str):
            Alerts.shared.show(alert: .oops, message: /str, type: .error)

        case .dataNotExist(let str):
            Alerts.shared.show(alert: .oops, message: str, type: .info)
        }
        tblView.reloadData()
    }

    func handleCuisineResponse(response: Response) {
        switch response{

        case .success(let response):
            if let cuisines = response as? [JSTags] {
                self.arrayCuisines = cuisines
                tblView.reloadData()
            }

        case .failure(let str):
            Alerts.shared.show(alert: .oops, message: /str, type: .error)

        case .dataNotExist(let str):
            Alerts.shared.show(alert: .oops, message: str, type: .info)
        }
    }


    //MARK: API Methods
    func apiSkillCall() {
        APIManager.shared.request(with: ProfileEndPoint.fetchSkills()) { (response) in
                self.handleSkillsResponse(response: response)
        }
    }

    func apiCuisineCall() {
        APIManager.shared.request(with: ProfileEndPoint.fetchCuisines()) { (response) in
            self.handleCuisineResponse(response: response)
        }
    }
}

extension FilterSkillVC : UITableViewDelegate, UITableViewDataSource, FilterListCellDelegate {

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: CellIdentifiers.filterListCell.rawValue) as! FilterListCell
        let filter = titleForHeader(indexPath.row)
        cell.lblFilterLabel.text = filter.name

        //Mark: Cell delegate
        cell.delegate = self
        return cell
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 70
    }

    //Mark: FilterCellDelegate Method
    func buttonTapped(cell: FilterListCell) {
        if let indexPath = self.tblView.indexPath(for: cell) {
            print("Button tapped on row \(indexPath.row)")
            if currentHeader == .skillSet {
                arraySkills[indexPath.row].isSelected = !arraySkills[indexPath.row].isSelected
            }
            else {
                arrayCuisines[indexPath.row].isSelected = !arrayCuisines[indexPath.row].isSelected
            }
        }
    }
}

extension FilterSkillVC : FilterVCDelegate {
    func btnApply() {
        for object in arraySkills {
            if object.isSelected {
                arrayID.append((object.id) ?? "")
            }
        }
        for object in arrayCuisines {
            if object.isSelected {
                arrayID.append((object.id) ?? "")
            }
        }
    }
}

1 ответ

Вы теряете ссылку на instance как только метод viewDidLoad будет завершен.

Делать instance глобальная переменная.

Вот так:

импортировать UIKit класс FilterSkillVC: UIViewController {

    @IBOutlet var tblView: UITableView!
    var instance = FilterVC()   //New line added here.

    lazy var arraySkills = [JSTags]()
    lazy var arrayCuisines = [JSTags]()
    var arrayID = [String]()
    var currentHeader: SegmentTitles = .skillSet

    override func viewDidLoad() {
        super.viewDidLoad()
        apiSkillCall()
        apiCuisineCall()
        registerCell(cellId: .filterListCell, forTableView: tblView)
        tblView.tableFooterView = UIView()
        //let instance = FilterVC()  //Commented this.
        instance.vcDelegate = self
    }

Больше обновлений:

В методе didMoveToPage вы получаете ссылку на FilterVC (из раскадровки??), теперь этот экземпляр FilterVC отличается от экземпляра filterVC, который мы создали.

Пожалуйста, добавьте это изменение и попробуйте:

func didMoveToPage(_ controller: UIViewController, segment: SJSegmentTab?, index: Int) {
    if index != tabs.count-1 {
        let filterVC = controller as! FilterSkillVC
        filterVC.updateCurrentHeader(currentTab:SegmentTitles(rawValue: titles[index])!)
      self.vcDelegate = filterVC   // <== Updated this line.
    }
Другие вопросы по тегам