【问题标题】:UItextField within UISearchbar failing after iOS 7 upgradeiOS 7 升级后 UISearchbar 中的 UItextField 失败
【发布时间】:2013-10-14 03:35:10
【问题描述】:

我有一个 UISearchBar 的 UITextField,它在 iOS 7 升级之前一直有效,现在它在这一行失败:UITextField *textfield=(UITextField*)[[searchBar subviews] objectAtIndex:1];

知道如何解决这个问题吗?谢谢

    // search bar
searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 190.0, 44.0)];
searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth;
UIView *searchBarView = [[UIView alloc] initWithFrame:CGRectMake(90.0, 0.0, 230.0, 44.0)];
searchBarView.autoresizingMask = 0;
searchBar.delegate = self;

searchBar.layer.borderColor=[UIColor whiteColor].CGColor;

UITextField *textfield=(UITextField*)[[searchBar subviews] objectAtIndex:1];

[searchBarView addSubview:searchBar];

self.navigationItem.titleView = searchBarView;

【问题讨论】:

    标签: iphone ios objective-c uitextfield


    【解决方案1】:

    在 iOS7 上试试这个。

    测试

    for (id object in [searchBar subviews])
        {
            for (id subObject in [object subviews])
            {
                if ([subObject isKindOfClass:[UITextField class]])
                {
                    UITextField *textfield=(UITextField*)subObject;
                }
            }
        }
    

    iOS6

    for (id object in [searchBar subviews]) {
            if ([object isKindOfClass:[UITextField class]]) {
                UITextField *textfield=(UITextField*)object;
            }
        }
    

    【讨论】:

      【解决方案2】:

      假设第二个searchBar 的子视图将是 UITextField 不是一个好主意。

      我打印了UISearchBar 的子视图,这就是我在 iOS 7 上得到的:

      <__NSArrayM 0x17d141f0>(
      <UIView: 0x17d34f40; frame = (0 0; 320 44); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x17d34fa0>>
      )
      

      只有一个子视图,所以你的... objectAtIndex:1]肯定会崩溃。

      您可以使用UIView 的以下类别在您的searchBar 中找到UITextField

      @interface UIView(Utils)
      
      -(UIView*)findSubviewRecursivelyOfClass:(Class)subviewClass;
      
      @end
      
      @implementation UIView(Utils)
      
      -(UIView*)findSubviewRecursivelyOfClass:(Class)subviewClass
      {
        if( [self isKindOfClass:subviewClass] ) {
          return self;
        } else {
          for( UIView* child in self.subviews ) {
            UIView* result = [child findSubviewRecursivelyOfClass:subviewClass];
            if( result ) {
              return result;
            }
          }
          return nil;
        }
      }
      
      @end
      

      【讨论】:

        【解决方案3】:

        试试这个,它在 IOS6IOS7+ 都可以工作,而且安全方法

        [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont fontWithName:@"ArialMT" size:10]];
        

        【讨论】:

          【解决方案4】:

          一个可以欺骗在任何版本中工作的递归方法怎么样

          UITextField *searchBarTextField = [self findTextFieldFromControl:self.placeSearchBar];
          
          
          - (UITextField *) findTextFieldFromControl:(UIView *) view
          {
              for (UIView *subview in view.subviews)
              {
                  if ([subview isKindOfClass:[UITextField class]])
                  {
                      return (UITextField *)subview;
                  }
                  else if ([subview.subviews count] > 0)
                  {
                      return [self findTextFieldFromControl:subview];
                  }
              }
              return nil;
          }
          

          【讨论】:

            猜你喜欢
            • 2013-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-21
            • 1970-01-01
            • 1970-01-01
            • 2021-04-14
            • 2020-06-30
            相关资源
            最近更新 更多