【问题标题】:filtering array of custom view controllers for property?过滤属性的自定义视图控制器数组?
【发布时间】:2017-10-20 00:12:57
【问题描述】:

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

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

有没有一种方法可以定义一个属性,该属性将位于所有 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 初始化

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

【问题讨论】:

    标签: ios swift filter uiviewcontroller


    【解决方案1】:

    我认为最好的方法是添加一个protocol like:

    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"]

    【讨论】:

    • 这里的问题是我不知道在类中设置它的属性,我在初始化时传递它,而不是硬编码
    • @jackdm 然后您可以更改实现以使用存储的属性
    • 你能告诉我们你是如何进行初始化的,然后我们可以展示它是如何完成的......
    • OP 更新了示例,所以我调用它并添加到数组中,因此每个自定义 VC 类型都将其 pageID 分配给其类变量,而不是协议。在反射时,我将导航控制器和 tabbarcontrollers 添加到 viewcontrollers 数组中。而不是我的每个特定视图控制器,所以也许我需要扩展导航和选项卡控制器?
    • TextViewController里面pageID: page.pageid是怎么存储的?作为 TextViewController 中名为 pageID 的属性?
    猜你喜欢
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多