Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.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 排除UIButton';从UIView';s子视图_Ios_Swift - Fatal编程技术网

Ios 排除UIButton';从UIView';s子视图

Ios 排除UIButton';从UIView';s子视图,ios,swift,Ios,Swift,我想在运行中更改我的UIViews颜色中的所有UILabel 我通过以下方式获取所有UIView: extension UIView { func subViews<T : UIView>(type : T.Type) -> [T]{ var all = [T]() for view in self.subviews { if let aView = view as? T{ all

我想在运行中更改我的UIViews颜色中的所有UILabel

我通过以下方式获取所有UIView:

extension UIView {

    func subViews<T : UIView>(type : T.Type) -> [T]{
        var all = [T]()
        for view in self.subviews {
            if let aView = view as? T{
                all.append(aView)
            }
        }
        return all
    }

    func allSubViewsOf<T : UIView>(type : T.Type) -> [T]{
        var all = [T]()
        func getSubview(view: UIView) {
            if let aView = view as? T{
                all.append(aView)
            }
            guard view.subviews.count>0 else { return }
            view.subviews.forEach{ getSubview(view: $0) }
        }
        getSubview(view: self)
        return all
    }
}
更改颜色:

  fileprivate func changeColor(_ objects: [UILabel]) {
        for label in objects {
            print("Superview: \(type(of: label.superview))")
            label.textColor = isNight ? .white : .black
        }
    }
我试过比较
label.superview.isDescendant(of:UIButton.self)
但是superview是UIView

我不知所措


如何排除UIButton的标签?

在迭代每个子视图时,检查子视图是否为
UIButton
。是的,跳过它

此外,您的递归算法可以编写得更简单。例如:

extension UIView {
    func allSubViewsOf<T : UIView>(type : T.Type) -> [T]{
        guard !(self is UIButton) else { return [] }

        var all = [T]()

        for view in subviews {
            if let tview = view as? T {
                all.append(tview)
            } else {
                all.append(contentsOf: view.allSubViewsOf(type: type))
            }
        }

        return all
    }
}
扩展UIView{ func allSubViewsOf(类型:T.type)->[T]{ 守卫!(自身为UIButton)否则{return[]} var all=[T]() 用于在子视图中查看{ 如果让tview=视为?T{ all.append(tview) }否则{ all.append(contentsOf:view.allsubviewsf(type:type)) } } 全部归还 } }
isKind过滤怎么样

例如:

let subviewLabels = view.subviews.filter({$0.isKind(of: UILabel.self)})

在本例中,我们将从视图中获取所有
UILabel

我最终创建了第二个函数,该函数使用另一种类型进行排除

func allSubViewsOf<K : UIView, V: UIView>(type : K.Type, excluding: V.Type ) -> [K]{
        var all = [K]()
        func getSubview(view: UIView) {
            guard !(view is V) else { return }
            if let aView = view as? K{
                all.append(aView)
            }
            guard view.subviews.count>0 else { return }
            view.subviews.forEach{ getSubview(view: $0) }
        }
        getSubview(view: self)
        return all
    }
func allSubViewsOf(类型:K.type,不包括:V.type)->[K]{
var all=[K]()
func getSubview(视图:UIView){
守卫!(视图是V)else{return}
如果让aView=视为?K{
all.append(aView)
}
保护视图.subviews.count>0其他{return}
view.subviews.forEach{getSubview(视图:$0)}
}
getSubview(视图:self)
全部归还
}

您可以为每个标签分配一个
标记,该标记是一个整数值,可用于标识标签

例如,您可以仅为要更改颜色的标签将
UILabel.tag
值指定给
1
。但是,在声明标签时,需要设置标记值。我为您编写了一个函数,该函数递归地遍历视图的子视图,并返回所有
UILabel
的数组,其中
标记为1:

// function that recursively returns all of the labels in a view's subviews with a tag equal to 1
func getAllLabelsOf(view: UIView) -> [UILabel] {
    var labels = [UILabel]()
    for subview in view.subviews {
        if let label = subview as? UILabel {
            // only get labels with tags equal to one
            if label.tag == 1 {
                 labels.append(label)
            }
        }
        // recursively get all subviews Labels
        let recursiveLabels = getAllLabelsOf(view: subview)
        labels = labels + recursiveLabels
    }
    return labels
}

当您这样做时:
如果让aView=view as?T
,如果它是
ui按钮
,您可能不想保留它,所以不要重复它的子视图吗?你应该考虑使用iStudii也有很多自定义控件,所以外观API被用于我的通用填充注释,可能有其他控件包含内部<代码> uIababel。因此,您可能需要检查更多的代码< <代码> UIButton >代码>。包括。许多UI控件包含内部标签,而不仅仅是UIButton。顺便说一句,请参阅我的答案,了解实现算法的更简单方法。
// function that recursively returns all of the labels in a view's subviews with a tag equal to 1
func getAllLabelsOf(view: UIView) -> [UILabel] {
    var labels = [UILabel]()
    for subview in view.subviews {
        if let label = subview as? UILabel {
            // only get labels with tags equal to one
            if label.tag == 1 {
                 labels.append(label)
            }
        }
        // recursively get all subviews Labels
        let recursiveLabels = getAllLabelsOf(view: subview)
        labels = labels + recursiveLabels
    }
    return labels
}