1

これは iOS 7 のアップグレードまで機能していた UISearchBar の UITextField を持っていますが、現在は次の行で失敗しています。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;
4

4 に答える 4

2

これを試してみてください。IOS6IOS7+の両方で動作し、安全なアプローチです

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont fontWithName:@"ArialMT" size:10]];
于 2013-10-07T14:17:36.900 に答える
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;
        }
    }
于 2013-10-07T14:11:37.857 に答える
1

searchBarsecondのサブビューが UITextField になると仮定するのは得策ではありません。

のサブビューを印刷しましたUISearchBar。これは、iOS 7 で取得したものです。

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

サブビューは 1 つだけなので、... objectAtIndex:1]間違いなくクラッシュします。

次のカテゴリを使用して、UIViewで検索できUITextFieldますsearchBar

@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
于 2013-10-07T14:17:08.087 に答える
0

どのバージョンでも機能するようにだますことができる再帰メソッドはどうですか

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;
}
于 2015-03-17T07:17:34.950 に答える