Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否筛选属性的自定义视图控制器数组?_Ios_Swift_Filter_Uiviewcontroller - Fatal编程技术网

Ios 是否筛选属性的自定义视图控制器数组?

Ios 是否筛选属性的自定义视图控制器数组?,ios,swift,filter,uiviewcontroller,Ios,Swift,Filter,Uiviewcontroller,我有一个viewControllers数组,不同的子类不是所有的VC。我想过滤包含它们的数组,以识别与我选择的过滤器匹配的数组 问题是,由于各种不同类型的VC被当作“ViewController”处理,所以我无法使用clear属性进行过滤 是否有一种方法可以定义所有ViewController上的属性,然后根据该属性进行过滤 一个想法是我可以对VC进行子类化,然后对每个控制器的子类进行子类化,这样我就可以将它们全部转换为该类型并检查该参数 代码如下:但是我想用“title”替换自定义属性 con

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

问题是,由于各种不同类型的VC被当作“ViewController”处理,所以我无法使用clear属性进行过滤

是否有一种方法可以定义所有ViewController上的属性,然后根据该属性进行过滤

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

代码如下:但是我想用“title”替换自定义属性

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)

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

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的索引时,您不需要搜索,只需执行以下操作:
让index=viewControllerIndexList[“myPageID”]
我认为最好的方法是添加一个
协议,如:

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

这里的问题是,我不知道在类中设置它的属性,我在初始化时传递它,不hardcoded@jackdm然后,您可以将实现更改为使用存储属性。您可以向我们展示如何进行初始化,然后我们可以展示如何进行初始化…使用示例更新操作,因此我将其调用并添加到数组中,因此每个自定义VC类型都将其pageID分配给其类变量,而不是协议。反射时,我将导航控制器和TabbarController添加到ViewController数组中。而不是我的每个特定视图控制器,所以我可能需要扩展导航和选项卡控制器intead?在
TextViewController
pageID:page.pageID
是如何存储的?作为
TextViewController
中名为
pageID
的属性,这里的问题是我不知道在类中设置它的属性,我在初始化时传递它,不hardcoded@jackdm然后,您可以将实现更改为使用存储属性。您可以向我们展示如何进行初始化,然后我们可以展示如何进行初始化…使用示例更新操作,因此我将其调用并添加到数组中,因此每个自定义VC类型都将其pageID分配给其类变量,而不是协议。反射时,我将导航控制器和TabbarController添加到ViewController数组中。而不是我的每个特定视图控制器,所以我可能需要扩展导航和选项卡控制器intead?在
TextViewController
pageID:page.pageID
是如何存储的?作为
TextViewController
中名为
pageID
的属性?