【问题标题】:Finding all UIButtons in subviews在子视图中查找所有 UIButton
【发布时间】:2015-11-09 12:46:45
【问题描述】:

我的UIViewController 视图中只有一个UIButton。我还有十个在主视图中的subview。我想找到所有这些按钮。到目前为止,我有:

-(void)findAllButtons{

    for(UIView *view in self.view.subviews) {
        if ([view isKindOfClass:[myButton class]]){
            NSLog(@"found a button!");         
        }
    }
}

它只找到一个按钮,而不是其他十个。这是为什么?它不应该遍历每个subview 然后找到它们吗?

【问题讨论】:

  • 这 10 个按钮不是主视图的直接子视图。因此,如果您想找到它们,请使用您的子视图插座(属性变量)更改 self.view.subviews
  • 要找到完整层次结构中的所有按钮,您应该编写一些递归函数

标签: ios objective-c uibutton subview


【解决方案1】:
for (UIView *subView in scroll.subviews) {
        if ([subView isKindOfClass:[UIButton class]]) {
            UIButton *btn = (UIButton*)subView;
            if (btn.tag == selectedButton.tag) {
                btn.layer.borderWidth = 1.0f;
                btn.layer.borderColor = [UIColor darkGrayColor].CGColor;
            }else{
                btn.layer.borderWidth = 1.0f;
                btn.layer.borderColor = [UIColor clearColor].CGColor;
            }
        }
    }

【讨论】:

    【解决方案2】:

    几行代码

    -(void)findAllButtons {
        [self findButtonsInSubviews:self.view.subviews];
    }
    
    - (void)findButtonsInSubviews:(NSArray *)subviews {
        for(UIView *view in subviews) {
            if ([view isKindOfClass:[UIButton class]]){
                NSLog(@"found a button!");
            } else {
                [self findButtonsInSubviews:view.subviews];
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      像这样使用 Objective-C 块的递归函数将在给定视图的视图层次结构中找到测试块中指定的给定子类类型的所有视图:

      NSMutableArray *marrAllButtons = [NSMutableArray new];
      
      BOOL (^viewTest)(UIView*) = ^BOOL(UIView* viewToTest) {
      
          return [view isKindOfClass:[UIButton class]];
      };
      
      void(^viewEnumerator)(UIView*) = ^(UIView* outerView){
      
          for (UIView *view in outerView.subviews)
          {
              if (viewTest(view))
              {
                  [marrAllButtons addObject:view];
              }
              else
              {
                  viewEnumerator(view);
              }
          }
      };
      
      viewEnumerator(self.view);
      
      NSLog(@"All Buttons %@", marrAllButtons);
      

      【讨论】:

        【解决方案4】:
        - (NSMutableArray *)buttonsInView:(UIView *)view
        {
            NSArray *subviews = view.subviews;
            NSMutableArray *buttons = [NSMutableArray array];
        
            for (UIView *subview in subviews)
            {
                if ([subview isKindOfClass:[UILabel class]])
                {
                    [buttons addObject:subview];
                }
                else if(subview.subviews)
                {
                    [buttons addObjectsFromArray:[self buttonsInView:subview]];
                }
            }
            return buttons;
        }
        

        【讨论】:

          【解决方案5】:

          如果您的所有按钮都已在 self.view(主视图) 中,则您的方法是正确的。

          只需为所有按钮设置标签检查并确保所有按钮都在主视图。我希望这会奏效。

          -(void)findAllButtons{
          
          for(UIView *view in self.view.subviews) {
              if ([view isKindOfClass:[myButton class]]){
                 UIButton *button = (UIButton*)view;
                  NSLog(@"found a button with tag:%d",button.tag);         
              }
            }
          }
          

          【讨论】:

            【解决方案6】:
            for(UIView * subView in view.subviews) // here write Name of you ScrollView.
            
             {
            
                 // NSLog(@"test %@", [subView class]);
            
                                if([subView isKindOfClass:[UIButton class]])
            
                                {
            
                                    UIButton *button = (UIButton*)subView;
            
                                    [button setSelected:NO] ;
            
            
            NSString *s1;
            
            s1 = @",";
            
            s1 = [s1 stringByAppendingString:[NSString stringWithFormat:@"%@",button.titleLabel.text ]];
            
            
            s1 = [s1 stringByAppendingString:[NSString stringWithFormat:@"%@",@"," ]];
            
            
                               NSRange range = [temp_Colors_Name_comma rangeOfString:s1  ];
            
                                    if(range.location == NSNotFound)
            
                                    {
            
            
            
                                    }
            
                                    else
            
                                    {
            
                                        [button setSelected:YES];
            
            
                                    }
            
                                }
            
                            }
            

            【讨论】:

            • temp_Colors_Name_comma 这个存储你想要传递的值
            猜你喜欢
            • 2022-01-22
            • 1970-01-01
            • 2011-02-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-16
            • 1970-01-01
            • 2011-12-12
            相关资源
            最近更新 更多