Почему мой UIViewController не отображается в моей всплывающей карте? - PullRequest
0 голосов
/ 15 октября 2019

Я хотел создать всплывающее окно для одного из моих UIViewController и нашел это репо на GitHub.

Работает нормальнос моим InfoViewController , который имеет только 4 UILabels (я думаю, что это может быть проблема, которая не отображается при использовании многоразового использованияячеек) Но почему-то он не работает с моим StructureNavigationListViewController , и я не знаю, почему.

Я вызываю didTapCategory метод в моем MainViewController , где должен отображаться StructureNavigationController, но я вижу только тусклое представление (что странно, потому что распознаватель касаний и жесты панорамирования работают нормально, но контент не отображаетсявверх)


В моем MainViewController Я настроил всплывающее окно, как раньше:

    @IBAction func didTapCategory(_ sender: UIBarButtonItem) {
        let popupContent = StructureNavigationListViewController.create()
        let cardpopUp = SBCardPopupViewController(contentViewController: popupContent)
        cardpopUp.show(onViewController: self)
    }

В моем StructureNavigationListViewController Я создал таблицупросмотреть и всплывающее окно:

public var popupViewController: SBCardPopupViewController?

    public var allowsTapToDismissPopupCard: Bool = true

    public var allowsSwipeToDismissPopupCard: Bool = true

    static func create() -> UIViewController {
        let sb = UIStoryboard(name: "Main", bundle: nil)
        let vc = sb.instantiateViewController(withIdentifier: "StructureNavigationListViewController") as! StructureNavigationListViewController
        return vc
    }

    @IBOutlet var tableView: UITableView!
    var structures = Variable<[Structure]>([])
    public var treeSource: StructureTreeSource?
    let disposeBag = DisposeBag()

    var depthDictionary : [String : Int] = [:]

    public override func viewDidLoad() {
        structures.asObservable()
            .bind(to:tableView.rx.items) {(tableView, row, structure) in
                let cell = tableView.dequeueReusableCell(withIdentifier: "StructureNavigationCell", for: IndexPath(row: row, section: 0)) as! StructureNavigationCell
                cell.structureLabel.text = structure.name
                cell.spacingViewWidthConstraint.constant = 20 * CGFloat(self.depthDictionary[structure.id]!)
                return cell
            }.disposed(by:disposeBag)

        _ = tableView.rx.modelSelected(Structure.self).subscribe(onNext: { structure in
            let storyBoard = UIStoryboard(name:"Main", bundle:nil)
            let plansViewCtrl = storyBoard.instantiateViewController(withIdentifier: "PlansViewController2") as! PlansViewController2
            self.treeSource?.select(structure)
            plansViewCtrl.treeSource = self.treeSource
            plansViewCtrl.navigationItem.title = structure.name
            self.show(plansViewCtrl, sender: self)
            if let mainVC = self.parent as? ProjectOverViewTabController2 {
                mainVC.addChildView(viewController: plansViewCtrl, in: mainVC.scrollView)
            }
        })
        showList()
    }
func showList() {
        if treeSource == nil {
            treeSource = StructureTreeSource(projectId:GlobalState.selectedProjectId!)
        }

        //The following piece of code achieves the correct order of structures and their substructures.
        //It is extremely bad designed and rather expensive with lots of structures and should
        //therefore be refactored!
        if let strctrs = getStructures() {
            var sortedStructures : [Structure] = []
            while(sortedStructures.count != strctrs.count) {
                for strct in strctrs {
                    if let _ = sortedStructures.index(of: strct) {
                        continue
                    } else {
                        depthDictionary[strct.id] = getDepthOfNode(structure: strct, depth: 1)
                        if let structures = getStructures() {
                            if let parent = structures.first(where: {$0.id == strct.parentId}) {
                                if let index = sortedStructures.index(of: parent) {
                                    sortedStructures.insert(strct, at: index+1)
                                }
                            } else {
                                sortedStructures.insert(strct, at: 0)
                            }
                        }
                    }
                }
            }
            structures.value = sortedStructures

            tableView.reloadData()
        }
    }

    func getDepthOfNode(structure: Structure, depth: Int) -> Int {
        if(structure.parentId == nil || structure.parentId == "") {
            return depth
        } else {
            if let structures = getStructures() {
                if let parent = structures.first(where: {$0.id == structure.parentId}) {
                    return getDepthOfNode(structure: parent, depth: depth + 1)
                }
            }
        }
        return -1
    }

    private func getStructures() -> Results<Structure>? {
        do {
            if let projectId = GlobalState.selectedProjectId {
                return try Structure.db.by(projectId: projectId)
            }
        } catch { Log.db.error(error: error) }

        return nil
    }
}


Здесь много кода. Извините ..

Это потому, что я вызываю метод create () после того, как viewDidLoad () удаляет из очередиклетки

1 Ответ

1 голос
/ 16 октября 2019

Трудно сказать, в чем проблема, поскольку вы не оставили информации о том, где didTapCategory должен быть вызван, но, возможно, это как-то связано с преждевременным выпуском вашей подписки modelSelected?

Редактировать: Как указано здесь: https://stackoverflow.com/a/28896452/11851832 если ваша пользовательская ячейка построена с помощью Interface Builder, вам следует зарегистрировать Nib, а не класс:

tableView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCellIdentifier")
...