Ios 排除UIButton';从UIView';s子视图
我想在运行中更改我的UIViews颜色中的所有UILabel 我通过以下方式获取所有UIView: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
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
}