在Swift中,如何在视图控制器中找到UILayoutGuide对象?

在Swift中,如何在视图控制器中找到UILayoutGuide对象?,swift,xcode,Swift,Xcode,我正在使用81个按钮(在堆栈视图中组织)创建一个数独风格的swift应用程序。我正在使用标记值0到80引用按钮,该标记值与我用于存储值的数组对齐。但是,第一个按钮会导致问题,我认为这是因为UILayoutGuide对象也有标记0 这个解决方案是可行的,但我刚刚升级到Xcode版本8.0(8A218a)并转换为swift 3 我向视图控制器的viewDidLoad函数添加了以下代码: // Get the subviews of the view var subviews = view.subvi

我正在使用81个按钮(在堆栈视图中组织)创建一个数独风格的swift应用程序。
我正在使用标记值0到80引用按钮,该标记值与我用于存储值的数组对齐。
但是,第一个按钮会导致问题,我认为这是因为UILayoutGuide对象也有标记0

这个解决方案是可行的,但我刚刚升级到Xcode版本8.0(8A218a)并转换为swift 3

我向视图控制器的viewDidLoad函数添加了以下代码:

// Get the subviews of the view
var subviews = view.subviews

// Return if there are no subviews
if subviews.count == 0 {
    return
}

for subview : AnyObject in subviews{

    // Do what you want to do with the subview
    print("\(subview.tag) - \(subview)")

}
这将生成以下日志:

可选(200)-UIImageView:0x7ff3e240f3b0;帧=(-40;383667);自动调整大小=RM+BM;userInteractionEnabled=否;标签=200;图层= 可选(200)-UIStackView:0x7ff3e240f590;帧=(7103;360);不透明=否;自动调整大小=RM+BM;标签=200;层=CATTransferMLlayer:0x610002316A0

可选(200)-UIImageView:0x7ff3e24111b0;帧=(0 47;375 436);自动调整大小=RM+BM;userInteractionEnabled=否;标签=200;层=层:0x610002344E0

可选(200)-UIToolbar:0x7ff3e2637ff0;帧=(0 623;375 44);不透明=否;自动调整大小=RM+BM;标签=200;层=层:0x600000343E0

可选(200)-UIImageView:0x7ff3e26015f0;帧=(63 228;248 211);自动调整大小=RM+BM;userInteractionEnabled=否;标签=200;层=层:0x60000034EA0

可选(200)-UILabel:0x7ff3e263e2e0;帧=(117 313;141 41);text=‘干得好’;不透明=否;自动调整大小=RM+BM;userInteractionEnabled=否;标签=200;图层=_UILabelLayer:0x60000093060

可选(200)-UIStackView:0x7ff3e263e750;帧=(127 491;120);不透明=否;自动调整大小=RM+BM;标签=200;层=CATTransferMLlayer:0x60000035520

可选(0)——\u UILayoutGuide:0x7ff3e263ee80;帧=(0;0);隐藏=是;层=层:0x60000035BC0

可选(0)——\u UILayoutGuide:0x7ff3e263f030;帧=(0;0);隐藏=是;层=层:0x60000035C60


因此,最后两个输出行是我怀疑的UILayoutGuide对象。我没有对它们进行编码,它们也不是层次结构中的对象。我如何看待它们/摆脱它们

如果您只是想阻止循环添加_UILayoutGuide(属于UILayoutSupport类),请执行以下操作:

// Get the subviews of the view
var subviews = view.subviews

// Return if there are no subviews
if subviews.count == 0 {
    return
}

for subview : AnyObject in subviews{

    // Do what you want to do with the subview
    print("\(subview.tag) - \(subview)")

    // Check for whether is it a UILayout class or not
      if(subview is UILayoutSupport){
            //This section is executed when UILayoutGuide will come into play
            print("Don't add it to the stack")
       }else{ 
            // Write your code in this section
       }

}

您还可以打印堆栈,检查其中的UILayoutGuide并将其删除。

简单的答案是UILayoutGuide没有标记。打印subview.tag时,如果没有标记,则显示标记=0。因此,按钮0的问题与UILayoutGuide无关


我没有弄清楚标记0按钮的问题是什么,但重新编码以避免使用标记0。不完全固定,但解决方案有效。

我只是使用循环来显示UILayoutGuide对象存在于ViewController中。我不是故意创建它们的,我看不出它们在模型中的位置。我的代码引用了我希望为1按钮设置的标记id 0(在堆栈中)但是由于这些布局指南,有3个标记id为0的对象,这会在按标记id引用按钮时导致崩溃。因此,我想删除UILayoutGuide对象或更改它们的标记,但我不知道如何找到它们。@StruanK:-默认情况下,每个元素都有一个标记0,因此您不能直接使用它。你能做的就是在你给标签的时候,使用(0+一些Int值)。在使用该元素时,减去Int值。