0

私はシングルトンオブジェクトを持っています。シングルトンメソッド内に現在の画面にナビゲーションバーが含まれているかどうかを判断する簡単な方法はありますか?

シングルトンは UIView サブクラスです。ネットワーク交換などの進行中のアクティビティを表示するために設計されています。作業が完了すると、黒い長方形が上から落ちて隠れるように見えます。なぜシングルトン?コードのどこからでも簡単に呼び出すことができます

次のスニペットは、アクティビティ シングルトンの初期化を示しており、私の考えをよりよく理解するためにここに公開されています。

-(void) showUpdatingView:(NSString *) msg {
    [self initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 44)];
    activity = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite] autorelease];
    activity.frame = CGRectMake(5, 10, 22, 22);
    labelView = [[[UILabel alloc] initWithFrame:CGRectMake(35, 10, [UIScreen mainScreen].bounds.size.width - 10, 22)] autorelease];
    labelView.font = [UIFont boldSystemFontOfSize:12];
    labelView.backgroundColor = [UIColor clearColor];
    labelView.textColor = [UIColor whiteColor];
    labelView.text = msg;
    [self addSubview:activity];
    [self addSubview:labelView];
    self.backgroundColor = [UIColor blackColor];
    self.alpha = 0.7;
}

アクティビティは次の方法で呼び出すことができます

[[ActivitySingleton getInstance] showUpdatingView:@"Getting data."];

それはすべてではありません。シングルトンは AppDelegate オブジェクトで作成され、ビューが追加されます

    inlineActivity = [[CHInlineActivityView alloc] initView];
    [self.window.rootViewController.view addSubview:inlineActivity];

私はそれがクレイジーに見えるかもしれないことを知っています。しかし、私が設計していたとき、それは私には合理的に見えました

4

1 に答える 1

1

オールインワンのナビゲーションコントローラがある場合:

BOOL navHidden = self.window.rootViewController.navigationController.navigatonBarHidden;


そうしないと、少し難しくなります..ウィンドウのサブビューをチェックして、UINavigationBar

id navbar = [self.window firstSubviewOfKind:[UINavigationBar class] withTag:NSNotFound];
BOOL navHidden = navbar == nil;


@implementation NSView (findSubview)

- (NSArray *)findSubviewsOfKind:(Class)kind withTag:(NSInteger)tag inView:(NSView*)v {
    NSMutableArray *array = [NSMutableArray array];

    if(kind==nil || [v isKindOfClass:kind]) {
        if(tag==NSNotFound || v.tag==tag) {
            [array addObject:v];
        }
    }

    for (id subview in v.subviews) {
        NSArray *vChild = [self findSubviewsOfKind:kind withTag:tag inView:subview];
        [array addObjectsFromArray:vChild];
    }

    return array;
}

#pragma mark - 

- (NSView *)firstSubviewOfKind:(Class)kind withTag:(NSInteger)tag {
    NSArray *subviews = [self findSubviewsOfKind:kind withTag:tag inView:self];
    return subviews.count ? subviews[0] : nil;
}

@end
于 2013-03-19T14:27:59.430 に答える