以编程方式获取嵌入UIStackView

时间:2019-05-03 05:41:22

标签: ios swift uiview uiviewcontroller uistackview

在我的ViewController中,我有12个自定义UIViews(名为CardView)。

enter image description here

我正在尝试以编程方式遍历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中。我在一个垂直对齐的like-

中有3个水平对齐的堆栈视图

enter image description here

如何以编程方式获取CardViews。任何帮助,将不胜感激。

5 个答案:

答案 0 :(得分:2)

您可以先做一些平面地图来展平您的视图结构,然后对其进行计数:

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的变量,并且屏幕上的卡片应该根据该变量而变化,而不是相反。

答案 1 :(得分:0)

您可以为每个水平堆栈视图创建IBOutlet。然后遍历stackviews中的子视图。

@IBOutlet weak var StackView1: UIStackView!
@IBOutlet weak var StackView2: UIStackView!
@IBOutlet weak var StackView3: UIStackView!



  for customView in StackView1.arrangedSubviews
  {
     // Do task
  }

答案 2 :(得分:0)

尝试一下

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
}

答案 3 :(得分:0)

从您共享的图片图中,似乎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
}  

我只写了第一个条件。您可以添加其他人。
话虽如此,我不会说这是最佳的解决方案。这可以并且应该重构。

答案 4 :(得分:0)

创建这样的扩展方法。它将计算视图控制器中的所有CardView实例。

var data = {
  name: name,
  state: state,
  city: city,
  add: add,
  phone: phone
};
var stringData = JSON.stringify(data);

$.ajax({
  type: "POST",
  url: "Customer.aspx/insertion",
  data: stringData,
  //  data: '{name:"' + name + '", state:"' + state + '",city:"' + city + '",add:"'+add+'"phone:"' +phone+'"  }',
  contentType: "application/json; charset=utf-8",
  dataType: "json",
  success: OnSucces,
  error: OnError
});

function OnSucces(response) {
  //  alert("Hello");
  if (response == true) {
    alert('Category Added Successfully !!!');
    reset();
  } else {
    alert(response);
  }
}

function OnError(response) {
  alert(response);
}
});

并在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