2017-05-17 15 views
0

I-Bibliothek SJSegmentedViewController für mein Projekt verwende, github link to podUmgang mit Daten zwischen Viewcontrollers in SJSegmentedViewController

Problem: habe ich Haupt-View-Controller (FilterVC), auf das habe ich eine Schaltfläche "Übernehmen", auf seiner Aktion I möchten ein Array in einem anderen Viewcontroller (FilterSkillVC) gespeichert zuzugreifen, ich diese Delegation mit tue, aber immer noch, was ich bekommen, ist eine leere Instanz

AKTUALISIERT MY FilterVC Code

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

Meine Fähigkeit VC Code

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) ?? "") 
      } 
     } 
    } 
} 

Antwort

0

Sie verlieren den Verweis auf die instance sobald die viewDidLoad Verfahren abgeschlossen ist.

Make instance eine globale Variable.

Wie so:

Import UIKit Klasse 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 
    } 

Weitere Updates:

Im didMoveToPage Methode, Sie bekommen einen Verweis auf eine FilterVC (aus einem Storyboard ??), unterscheidet sich diese Instanz von FilterVC von der von uns erstellten Instanz von filterVC.

Bitte diese Änderung hinzuzufügen und versuchen:

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. 
    } 
+0

tat, was Sie gesagt haben, aber immer noch funktionieren btnApply() nicht in FilterSkillVC aufgerufen wird – user832

+0

Wenn möglich, können Sie Ihren Code teilen? Basierend auf dem, was Sie hier zeigen, sollte es funktionieren. – TheAppMentor

+0

@ user832, überprüfen Sie bitte das Update. – TheAppMentor

Verwandte Themen