![](/img/trans.png)
[英]Add UIViews to UIStackView programmatically inside UITableView
[英]Programmatically get the custom UIViews embedded inside UIStackView
在我ViewController
,我有12个自定义UIViews
(名为CardView)。
我试图以编程方式遍历ViewController
的子视图以找到自定义视图(CardView)并进行一些配置。 以下是我的代码来计算CardViews的数量。
private func cardCount()->Int{
var count = 0
for subview in self.view.subviews{
if subview is CardView{
count = count + 1
}
}
return count
}
但是,它返回我“ 0”,原因是我的视图已嵌入UIStackViews
。 我在一个垂直对齐的像里面有3个水平对齐的堆栈视图-
如何以编程方式获取CardViews。 任何帮助,将不胜感激。
您可以先做一些平面地图来展平您的视图结构,然后对它们进行计数:
private func cardCount()->Int{
var count = 0
for subview in self.view.subviews.flatMap { $0.subviews }.flatMap { $0.subviews }{
if subview is CardView{
count = count + 1
}
}
return count
}
但是我觉得您做事的方式是错误的。 卡的数量听起来像模型中的东西。 您应该有一个名为cardCount
的变量,并且屏幕上的卡片应该根据该变量进行更改,而不是相反。
您为每个水平堆栈视图创建IBOutlet。 然后循环遍历stackviews中的子视图。
@IBOutlet weak var StackView1: UIStackView!
@IBOutlet weak var StackView2: UIStackView!
@IBOutlet weak var StackView3: UIStackView!
for customView in StackView1.arrangedSubviews
{
// Do task
}
尝试这个
private func cardCount() -> Int
{
var count = 0
for subview in self.view.subviews
{
if let stackView: UIStackView = subview as? UIStackView
{
let arrangedViews = stackView.arrangedSubviews
for cardView in arrangedViews
{
if cardView is CardView
{
count = count + 1
}
}
}
}
return count
}
从您共享的图片图中,似乎StackView是第一个孩子。 每当您获得子视图时,仅返回第一个子视图。 因此self.view.subviews
将只产生一个UIStackView
。 给每个堆栈视图添加一个标签。 然后,在代码中:
private func cardCount()->Int{
var count = 0
for subview in self.view.subviews{
if subview.tag == 10 { // parent stack view
for subviewStack in subview { // Get subviews of parent stackview
if subviewStack.tag == 11 { // First stack view child
for subViewSubStack in subviewStack.subviews { // Get card views in this stack view
// Apply your count logic
}
}
}
}
}
return count
}
我只写了第一个条件。 您可以添加其他人。
话虽如此,我不会说这是最佳的解决方案。 这可以并且应该重构。
创建这样的扩展方法。 它将计算视图控制器中的所有CardView实例。
extension UIView {
func cardCount() -> Int {
switch self {
case let self as CardView:
return 1
case let self as UIStackView:
return self.arrangedSubviews.reduce(0, { $0 + $1.cardCount() })
default:
return self.subviews.reduce(0, { $0 + $1.cardCount() })
}
}
}
并在viewDidLoad
调用此方法
class ViewControllerd: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print(self.view.cardCount())
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.