查找 view.subviews 内的所有按钮
Finding all buttons within view.subviews
我正在尝试为自定义数字键盘创建圆形按钮。我想通过这个快速枚举循环查找和修改所有按钮:
for (UIView *subview in self.view.subviews)
{
if ([subview isKindOfClass:[UIButton class]])
{
NSLog(@"found a button!");
subview.layer.borderWidth = 1.0f;
subview.layer.borderColor = [[UIColor whiteColor] CGColor];
[subview.layer setCornerRadius: subview.frame.size.width/2.0f];
NSLog(@"button.tag = %ld", (long)subview.tag);
}
不起作用。
所以我环顾四周,发现this question。但是,即使我的方法似乎遵循已接受答案中概述的方法,if
语句也找不到按钮。页面上的其他答案看起来过于复杂,无法满足我的需求。
谁能告诉我哪里出错了?
编辑
回复@luk2303 的评论:
我相信所有相关按钮确实直接在 view
中。这是故事板中层次结构的屏幕截图:
第二次编辑
根据@tomer 的建议,我修改了代码:
for (UIControl *subview in self.view.subviews)
{
NSLog(@"inside loop");
if ([subview isKindOfClass:[UIButton class]])
{
subview.layer.borderWidth = 1.0f;
subview.layer.borderColor = [[UIColor whiteColor] CGColor];
[subview.layer setCornerRadius: subview.frame.size.width/2.0f];
NSLog(@"button.tag = %ld", (long)subview.tag);
}
}
遗憾的是,结果没有改善。
第三次编辑
这是子视图的打印输出,显然不包括所需的按钮...
2016-06-12 14:27:10.352 appName[5983:3143970] <_UILayoutGuide: 0x12f6912b0; frame = (0 0; 0 0); hidden = YES; layer = <CALayer: 0x12f691020>>
2016-06-12 14:27:19.419 appName[5983:3143970] <_UILayoutGuide: 0x12f6918b0; frame = (0 0; 0 0); hidden = YES; layer = <CALayer: 0x12f691a30>>
2016-06-12 14:27:21.988 appName[5983:3143970] <UIImageView: 0x12f691040; frame = (516 209; 49 49); autoresize = RM+BM; layer = <CALayer: 0x12f6911f0>>
通过设置每个 UIButton 的 "tag" 属性,这可以在 Interface Builder 中或以编程方式完成:
button.tag = n; // n being whatever integer value you decide.
您的 IF 语句,这似乎是导致问题的原因,现在可以简单地比较两个整数值...
if(subview.tag == n) { // n still being the integer value you've set
...
// Implement desired code for each UIButton here
...
}
您可以在此处使用界面生成器更改 标签 属性:
根据您的屏幕截图,您已经将它们放在情节提要中,因此您不需要 "find" 它们,它们就在这里。
执行以下操作:
Link 通过使用右键单击或 ctrl+clic 从故事板拖放到 .h 文件,将所有按钮添加到您的 .h 文件。就像您想创建一个插座一样。 (通过打开助手编辑器,屏幕右上角的中间按钮)。
一旦Xcode询问您是否要添加Outlet,或Outlet collection,或Action,请选择"Outlet Collection",并将其命名为"AllButtons"。
对每个按钮重复该过程,除了不是创建新的出口集合,而是 link 最近创建的出口集合的每个按钮。
现在您所有的按钮都是该集合的一部分,如果您愿意,也可以是数组。
从您的 .m 文件中,您可以使用 属性 并在其上循环,就像您处理子视图一样。
foreach (UIButton *button in AllMyButtons){
// Do your stuff here.
}
就是这样。仅此而已:)
我正在尝试为自定义数字键盘创建圆形按钮。我想通过这个快速枚举循环查找和修改所有按钮:
for (UIView *subview in self.view.subviews)
{
if ([subview isKindOfClass:[UIButton class]])
{
NSLog(@"found a button!");
subview.layer.borderWidth = 1.0f;
subview.layer.borderColor = [[UIColor whiteColor] CGColor];
[subview.layer setCornerRadius: subview.frame.size.width/2.0f];
NSLog(@"button.tag = %ld", (long)subview.tag);
}
不起作用。
所以我环顾四周,发现this question。但是,即使我的方法似乎遵循已接受答案中概述的方法,if
语句也找不到按钮。页面上的其他答案看起来过于复杂,无法满足我的需求。
谁能告诉我哪里出错了?
编辑
回复@luk2303 的评论:
我相信所有相关按钮确实直接在 view
中。这是故事板中层次结构的屏幕截图:
第二次编辑
根据@tomer 的建议,我修改了代码:
for (UIControl *subview in self.view.subviews)
{
NSLog(@"inside loop");
if ([subview isKindOfClass:[UIButton class]])
{
subview.layer.borderWidth = 1.0f;
subview.layer.borderColor = [[UIColor whiteColor] CGColor];
[subview.layer setCornerRadius: subview.frame.size.width/2.0f];
NSLog(@"button.tag = %ld", (long)subview.tag);
}
}
遗憾的是,结果没有改善。
第三次编辑
这是子视图的打印输出,显然不包括所需的按钮...
2016-06-12 14:27:10.352 appName[5983:3143970] <_UILayoutGuide: 0x12f6912b0; frame = (0 0; 0 0); hidden = YES; layer = <CALayer: 0x12f691020>>
2016-06-12 14:27:19.419 appName[5983:3143970] <_UILayoutGuide: 0x12f6918b0; frame = (0 0; 0 0); hidden = YES; layer = <CALayer: 0x12f691a30>>
2016-06-12 14:27:21.988 appName[5983:3143970] <UIImageView: 0x12f691040; frame = (516 209; 49 49); autoresize = RM+BM; layer = <CALayer: 0x12f6911f0>>
通过设置每个 UIButton 的 "tag" 属性,这可以在 Interface Builder 中或以编程方式完成:
button.tag = n; // n being whatever integer value you decide.
您的 IF 语句,这似乎是导致问题的原因,现在可以简单地比较两个整数值...
if(subview.tag == n) { // n still being the integer value you've set
...
// Implement desired code for each UIButton here
...
}
您可以在此处使用界面生成器更改 标签 属性:
根据您的屏幕截图,您已经将它们放在情节提要中,因此您不需要 "find" 它们,它们就在这里。
执行以下操作:
Link 通过使用右键单击或 ctrl+clic 从故事板拖放到 .h 文件,将所有按钮添加到您的 .h 文件。就像您想创建一个插座一样。 (通过打开助手编辑器,屏幕右上角的中间按钮)。
一旦Xcode询问您是否要添加Outlet,或Outlet collection,或Action,请选择"Outlet Collection",并将其命名为"AllButtons"。
对每个按钮重复该过程,除了不是创建新的出口集合,而是 link 最近创建的出口集合的每个按钮。
现在您所有的按钮都是该集合的一部分,如果您愿意,也可以是数组。
从您的 .m 文件中,您可以使用 属性 并在其上循环,就像您处理子视图一样。
foreach (UIButton *button in AllMyButtons){
// Do your stuff here.
}
就是这样。仅此而已:)