获取 ViewController 中的所有视图
Posted
技术标签:
【中文标题】获取 ViewController 中的所有视图【英文标题】:Get ALL view inside ViewController 【发布时间】:2017-11-23 22:13:05 【问题描述】:我正在尝试获取 UIViewController 中的所有视图。
我正在使用此代码:
for subview : UIView in self.view.subviews
//code here
问题是我没有得到 UIView 中的视图。 所以我得到了除了他们的孩子之外的所有观点。
请问,如何在我的 UIViewController 中获取所有子视图或父视图?即使一个视图有一个孩子有一个孩子有一个孩子。我想浏览所有视图。
提前感谢 :)
(请在 swift 4.0 中使用)
【问题讨论】:
【参考方案1】:你需要递归处理所有子视图。
func processSubviews(of view: UIView)
// 1. code here do something with view
for subview in view.subviews
// 2. code here do something with subview
processSubviews(of: subview)
// 3. code here do something with subview
// 4. code here do something with view
根据您想要的结果,您需要将代码放在位置 1、2、3 或 4(或者可能是其中两个或多个位置)。
那么你可以这样称呼它:
processSubviews(of: self.view)
【讨论】:
非常感谢。现在我可以很容易地通过代码调整所有视图的大小:)【参考方案2】:要获取视图层次结构中的所有视图(如标签、按钮、视图...)并访问 viewController 中的所有子视图,您应该使用递归函数来迭代所有视图:
func getAllSubviews(view:UIView)
for subview in view.subviews
if let takenLabel = subview as? UILabel
takenLabel.backgroundColor = UIColor.red
getAllSubviews(view:subview)
您可以使用这个函数来访问其他视图,如按钮并更改它们。
在这种情况下,我将 viewController 中所有标签的背景颜色更改为红色
【讨论】:
【参考方案3】:获取子视图的方式有很多种
获取父视图中的所有子视图
for subview in view.subviews
// you can get all of your views one by one here.
过滤任何标记的视图是否可用(假设视图被标记为 100)
view.subviews.filter$0.tag == 100
检查任何视图是否包含子视图的扩展
extension UIView
func isAvailabletoParentView(inParentView : UIView, subViewTag : Int) -> Bool
var isAvailable = false
for subviews in inParentView.subviews
if subviews.tag == subViewTag
isAvailable = true
return true
else
isAvailable = false
return isAvailable
类似电话分机
subview.isAvailabletoParentView(inParentView: parentView, subViewTag: anyTagToSubView)
希望它会有所帮助,快乐编码?。
【讨论】:
以上是关于获取 ViewController 中的所有视图的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中的 ONE ViewController 中的视图之间传递数据
从 AppDelegate 中的 ViewController 获取参数。
如何从 ViewController 中的 xib (nib) 实例化 UIView / UITableView
使用通过 ViewController 从 XIB 加载的子视图中的对象时出错
试图从一个 Viewcontroller 中的 UILabel 获取 NSString 以放置在另一个 Viewcontroller 的 UITextView 中