从子视图中调用Root ViewController上的函数

时间:2014-03-15 18:25:03

标签: ios sprite-kit iad

我有一个名为" ViewController"的UIViewController类。它访问了几个SKScenes。

我有这两个功能来展示和隐藏广告:

-(void)showBannerView{
    if (_adBanner && !_adBannerViewIsVisible){
        _adBannerViewIsVisible = true;

        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.5];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

        CGRect frame = _adBanner.frame;
        frame.origin.x = 0.0f;
        frame.origin.y = 0.0f;

        _adBanner.frame = frame;

        [UIView commitAnimations];
    }
}

-(void)hideBannerView{
    if (_adBanner && _adBannerViewIsVisible){
        _adBannerViewIsVisible = false;

        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.5];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

        CGRect frame = _adBanner.frame;
        frame.origin.x = 0.0f;
        frame.origin.y = -_adBanner.frame.size.height ;

        _adBanner.frame = frame;

        [UIView commitAnimations];
    }

}

我唯一需要弄清楚的是如何在正确的父ViewController上调用这些函数。

如何从我的SKScenes中进行此操作?

我已尝试过(来自skscene内部):

[self.view.window.rootViewController hideBannerView];
[self.view.window.rootViewController showBannerView];

ViewController *parent = [[ViewController alloc] init];
[parent hideBannerView];

第一个只是抛出一个错误,而父代码没有做任何事情,因为它创建了另一个视图控制器而不是访问给定的视图控制器。

我还尝试在类型' ViewController *'的skscene上创建一个属性。它并没有让我从viewcontroller访问该属性(我试图将属性设置为' self',从skscene有效地引用viewcontroller)

1 个答案:

答案 0 :(得分:3)

我对spriteKit并不完全熟悉,但我认为这应该是一样的。

在ViewDidLoad的RootViewController.h中添加:

// Note Notification name:  you should probably use a constant
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(updateBannerView:)
                                             name:@"kNotificationUpdateBannerView"
                                           object:nil];

然后,仍然在RootViewController.h中添加:

- (void) updateBannerView:(NSNotification *)note {
    NSDictionary * info = note.userInfo;
    BOOL shouldHide = [info[@"shouldHide"]boolValue];

    if (shouldHide) {
        NSLog(@"shouldHide");
        [self hideBannerView];
    }
    else {
        NSLog(@"shouldShow");
        [self showBannerView];
    }
}

现在,你已经全部成立了。无论何时你想打电话,都要使用:

BOOL shouldHide = YES; // whether or not to hide

// Update Here!
NSDictionary * dict = [[NSDictionary alloc]initWithObjectsAndKeys:[NSNumber numberWithBool:shouldHide], @"shouldHide", nil];

[[NSNotificationCenter defaultCenter]postNotificationName:@"kNotificationUpdateBannerView" // Better as constant!
                                                   object:self 
                                                 userInfo:dict];

现在,无论您在应用中的哪个位置,都可以隐藏/展示横幅广告!