![](/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.