【问题标题】:How can I get all buttons from a view?如何从视图中获取所有按钮?
【发布时间】:2017-09-15 13:42:21
【问题描述】:

我尝试从UIView 获取所有按钮。我试过这段代码,但它不起作用。

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);
    }
}

请帮忙。

【问题讨论】:

  • “它不起作用” 不是恰当的问题描述。它做了什么,你会期待什么,提供接近 MVCE 的东西。如果您“无法理解它是如何工作的”,您是如何提出代码的,或者您是否只是从另一个 SO 帖子中复制而不考虑它?
  • 打印您的子视图并检查一次
  • 嘿,我没有复制这段代码,而且我是初级,所以我试图在 ios 中提高自己。在我的问题中,我想以一种方法而不是手动为所有按钮提供边框颜色和角半径。意味着拿一个按钮并提供边框颜色和半径,然后选择另一个。它增加了我的代码。这就是我发布这个问题的原因跨度>
  • self.view.subviews 返回 self.view 的子视图,如果按钮在另一个容器视图中,它不会返回。例如。如果 self.view.anotherview.button1 则无法获取按钮
  • 可以分享storyboard的截图吗?

标签: ios objective-c uiview uibutton


【解决方案1】:

使用此代码:

- (void)getAllButtonFromView:(UIView*)view {
    for (UIView* subview in view.subviews) {

        if (subview.subviews.count > 0) {
            [self getAllButtonFromView:subview];
        }        
        else 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);
        }
    }
}

问题可能是您的按钮没有直接添加到您的视图中,实际上它们是添加到视图的子视图中的。因此,只需检查 view.subviews 中的子视图中的视图是否具有包含 UIButton 的子视图。

【讨论】:

  • 这是完美的解决方案
【解决方案2】:

Swift 解决方案 4.0+

func getAllButtonFromViewRecursion(view: UIView)  {

    for insideView in view.subviews {
        if insideView.subviews.count > 0 {
            getAllButtonFromView(view: insideView)
        }
        else if (insideView.isKind(of: UIButton)) {
            insideView.layer.borderWidth = 1.0
            insideView.layer.borderColor = UIColor.white.cgColor
            insideView.layer.cornerRadius = 2.0
        }
    }
}

Objective C 解决方案

- (void)getAllButtonFromViewWithRecursion:(UIView*)view {

    for (UIView* insideView in view.subviews) {

        if (insideView.subviews.count > 0) {
            [self getAllButtonFromView:insideView];
        }        
        else if ([insideView isKindOfClass:[UIButton class]]) {

            NSLog(@"found a button!");
            insideView.layer.borderWidth = 1.0f;
            insideView.layer.borderColor = [[UIColor whiteColor] CGColor];
            [insideView.layer setCornerRadius: subview.frame.size.width/2.0f];
            NSLog(@"button.tag = %ld", (long)subview.tag);
        }
     }
  }

【讨论】:

  • Matloob,请解释一下你的代码。他还要求对问题进行解释,并想了解它是如何工作的。
  • 是的,实际上这段代码只会检查单个进一步的 UIview,如果他在子视图中找到 UIview,而不是尝试在进一步的 UIView 中获取按钮,如果 self.view 中有多个视图层次结构比我们需要使用递归。所以如果您在层次结构中有多个视图,请更新我
【解决方案3】:

SWIFT 5.2

for subview in self.view.subviews {
    if subview is UIButton {
        let button = subview as! UIButton
        // do smth with a button
        button.setBackgroundImage(nil, for: .normal)
        button.isUserInteractionEnabled = true
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多