ios - 在 SJSegmentedViewController 中处理 ViewController 之间的数据

标签 ios swift delegation

我正在为我的项目使用库 SJSegmentedViewController github link to pod

问题: 我有主视图 Controller (FilterVC),上面有一个按钮“APPLY”,在其操作上我想访问存储在另一个 View Controller (FilterSkillVC)中的数组,我正在使用委托(delegate)来执行此操作,但我得到的仍然是一个空的实例

已更新 我的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) ?? "")
            }
        }
    }
}

最佳答案

一旦 viewDidLoad 方法完成,您就会丢失对实例的引用。

使实例成为全局变量。

像这样:

导入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 的引用(来自 Storyboard ??),现在 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.
    }

关于ios - 在 SJSegmentedViewController 中处理 ViewController 之间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44018196/

相关文章:

iphone - 来自 NSString 的 NSDate,如 HH :mm

ios - 使用 Parse 更新高分条目

ios - “文本”不可用 : APIs deprecated as of iOS7. .. 如何从 alert.textFields[0] 获取文本值?

ios - 无法从我的协议(protocol)类调用委托(delegate)方法

Delphi:如何将接口(interface)实现委托(delegate)给子对象?

javascript - 从某个网页上托管的 JavaScript 调用 Objective-C 函数

ios - 使用 NSURL 发布图像文件和字符串文本参数

ios - Swift:协议(protocol)方法作为目标 Action 中的 Action

ios - 处理表中 UITableViewCell 的多个子类

swift - 如何快速检查整数是否在给定范围内