ios - 过滤属性的自定义 View Controller 数组?

标签 ios swift filter uiviewcontroller

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

问题是,由于它的各种不同类型的 VC 被处理为只是“ViewControllers”,我无法通过明确的属性进行过滤。

有没有一种方法可以定义一个属性,该属性将出现在所有 viewController 上,然后根据它进行过滤?

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

这是代码:但是我想将“标题”换成自定义属性

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 初始化的更新

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

最佳答案

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

protocol PropertyProtocol {
    var customProperty: String { get }
}

然后让你的 View Controller 符合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
})

当然,命名你的协议(protocol)比我的情况更具描述性。

因为你已经有了一个 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"]

关于ios - 过滤属性的自定义 View Controller 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46828482/

相关文章:

javascript - 在 JSContext 中暂停/停止评估脚本

swift - 如何将后台应用程序刷新添加到 swift WatchOs 应用程序

filter - 如何在drawtext FFmpeg中使用多种颜色

swift - 滑动即可删除单元格,而无需按删除按钮 Swift

wcf - OData $filter 与 $expand 中的项目

java - 如何使用多个条件从集合列表中过滤

iphone - 打开 Interface Builder 时出现错误 (Mac OS X Lion)

ios - 为适用于不同对象的属性定义宏?

ios - 如何在大屏幕和小屏幕上设置适当的布局

ios - 自动调整 UILabel 文本大小以适合 UILabel 宽度