过滤属性的自定义视图控制器数组?

时间:2017-10-19 11:05:04

标签: ios swift filter uiviewcontroller

我有一个viewControllers数组,各个子类并不是所有相同的VC。我想过滤包含它们的数组,以确定哪个匹配我选择的过滤器。

问题在于,因为它的各种不同类型的VC被处理为仅仅“ViewControllers”,因此我无法通过clear属性进行过滤。

是否有一种方法可以定义一个属性,该属性将在所有viewControllers上,然后由它进行过滤?

一个想法是我可以子类化VC然后为每个控制器子类化子类,这样我就可以将它们全部转换为该类型并检查该参数

以下是代码:但我想换掉标题'对于自定义属性

contentViewControllers = contentControllers()

        if self.pushedTitle != nil && self.pushedID != nil, self.pushedPage != nil {
            if let i = contentViewControllers.index(where: { $0.title == self.pushedPage }) {
                return selectContentViewController(contentViewControllers[i])
            }

编辑:VC init上的更新

let text = TextViewController(textView: TextView.init(frame: UIScreen.main.bounds), pageID: page.pageid, pageTitle: page.title)
                let navigationController = UINavigationController(rootViewController: text)
                contentList.append(navigationController)

1 个答案:

答案 0 :(得分:2)

我认为最好的方法是添加protocol,如:

protocol PropertyProtocol {
    var customProperty: String { get }
}

然后让视图控制器符合PropertyProtocol

class ViewController: UIViewController, PropertyProtocol {
    var customProperty: String {
        return "My property for view Controller"
    }
...
}

然后你就做了:

let i = contentViewControllers.index(where: { (viewController) -> Bool in
    if let viewController = viewController as? PropertyProtocol {
        return viewController.customProperty == pushedPage
    }
    return false
})

当然,将您的协议命名为比我的情况更具描述性。

由于您已经拥有TextViewController子类,因此可以执行以下操作:

let i = contentViewControllers.index(where: { (viewController) -> Bool in
    var vc = viewController
    if let navVC = viewController as? UINavigationController {
        vc = navVC.viewControllers.first!
    }

    if let textViewController = vc as? TextViewController {
        return textViewController.pageID == pushedPage
    }

    return false
})

最后一个选项和您应该选择的选项是在contentList - var viewControllerIndexes = [String : Int]()旁边添加一个新变量,然后执行:

contentList.append(navigationController)
viewControllerIndexList[page.pageid] = contentList.count - 1

然后当您需要页面ID的索引时,您不需要搜索,只需执行let index = viewControllerIndexList["myPageID"]