3

現在、viewWithTag実際には最初に自分自身を検索してから、すべてのサブビューをサブツリー全体で再帰的に検索し、そのタグが付いたビューを探します。

しかし、サブビューのタグを100、101などに設定し、後でタグ100を探しても、この現在のビューの親が現在のビューのタグを100に設定した場合はどうなりますか?次にviewWithTag、サブビューの代わりに現在のビューを返します。

コードが

[fooView viewWithTag: 123]

なぜコードはfooView自体を含むサブツリーを検索したいのですか?これは、コードがfooViewを十分に認識していないために検索したいようなものです。言い換えれば、fooView自分自身を検索するように言われています...これは奇妙です。ビューはそれ自体を知りませんか?(自分自身を探すために検索を行う必要がありますか?)

それで、サブビューとグランドサブビューのみを(自己を検索せずに)検索する方法はありますか?

4

5 に答える 5

7

の再帰的な性質を利用する-viewWithTag:

- (UIView *)viewWithTagNotCountingSelf:(NSInteger)tag
{
    UIView *toReturn = nil;

    for (UIView *subView in self.subviews) {
        toReturn = [subView viewWithTag:tag];

        if (toReturn) {
            break;
        }
    }
    return toReturn;
}

編集:これは「グランドサブビュー」よりもさらにドリルダウンします:階層内の自己ではないビューを取得します。また、これはのカテゴリに実装されますUIView

于 2012-09-01T05:43:28.630 に答える
1

これを行う:

NSMutableArray *arrSameViewTag = [NSMutableArray array];
for(UIView *subview in [yourView subviews]) //your view to find subview
{
    if(subview.tag == 123) //specific tah here
    {
        [arrSameViewTag addObject:subview]; //view found add in array
    } 
}
NSlog(@"arrSameViewTag : %@",arrSameViewTag);

UIButtonや任意のUIElementのような特定のものを見つけるには、次のようにします。

NSMutableArray *arrSameViewTag = [NSMutableArray array];
for(id *subview in [yourView subviews]) //your view to find subview
{
  if([subview isKindofClass[UIButton class]) //any UIElement of specific type here
  {
    UIButton *btn = (UIButton *)subview; //same UIElement mentioned for checking it
    if(btn.tag == 123) //specific tah here
    {
        [arrSameViewTag addObject:subview]; //view found add in array
    } 
  }
}
NSlog(@"arrSameViewTag : %@",arrSameViewTag)
于 2012-09-01T05:38:49.340 に答える
1

1レベルの場合:

UIView *view;
for (int i = 0; i < viewToSearch.subviews.count; i++){
    UIView *subview = viewToSearch.subviews[i];
    if (subview.tag == tagToSeach){
        view = subview;
        break;
    }
}

複数のレベルを持つビュー階層を検索するには:

__block UIView *view;
BOOL (^__block searchViewForTag)(UIView *,NSInteger) = ^(UIView *aView, NSInteger tag){
    for (UIView *subview in aView.subviews){
        if (subview.tag == tag){
            view = subview;
            return YES;
        }
        if (searchViewForTag(subview,tag)) return YES;
    }
    return NO;
};
NSInteger tagToSearchFor = 1;
searchViewForTag(viewToSearch,tagToSearchFor);

//Do something with view
于 2012-09-01T05:37:51.710 に答える