我想即时更改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的标签?
答案 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
}