从UIView子视图中的所有UILabel中排除UIButton的标签

时间:2018-12-04 15:39:18

标签: 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.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
    }
}

这很好用,除非UIView中没有UIButton,否则它也将抓住UIButton的标签。

    let allLabels = view.allSubViewsOf(type: UILabel.self)
    changeColor(allLabels)

更改颜色:

  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),但是超级视图是UIView。

我很茫然。

如何排除UIButton的标签?

4 个答案:

答案 0 :(得分:1)

我最终创建了第二个函数,该函数需要另一种类型排除

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
    }

答案 1 :(得分:0)

在迭代每个子视图时,请检查该子视图是否为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
    }
}

答案 2 :(得分:0)

使用 isKind 进行过滤怎么样?

示例:

def serving_input_receiver_fn():
# Prep a placeholder where the input example will be fed in
    features = tf.placeholder(dtype=dtype, shape=[batch_size] + shape, name='input_tensor')
    return tf.estimator.export.ServingInputReceiver(features=features, receiver_tensors=features)

在这种情况下,我们将从视图中获取所有 eval_estimator.export_savedmodel(FLAGS.model_dir, serving_input_receiver_fn= build_tensor_serving_input_receiver_fn(shape, dtype=tf.float32, batch_size=1))

答案 3 :(得分:0)

您可以为每个标签分配一个tag,这是一个整数值,可用于标识标签。

例如,您可以为UILabel.tag分配1值,仅用于您希望颜色更改的标签。但是,声明标签时,需要设置标签值。我为您编写了一个函数,该函数递归地迭代视图的子视图,并返回所有UILabel的数组,其中tag为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
}