从另一个类调用函数时,BannerView为Nil

时间:2017-04-03 12:03:30

标签: ios swift

用GADBannerView打开一个可选值时,我得到nil。

我在FlashViewController.swift中设置了这样的广告横幅..

class FlashViewController: UIViewController { 
@IBOutlet weak var bannerView: GADBannerView!

然后在ViewDidLoad中:

  func initAdMobBanner() {
  bannerView.adUnitID = "ca-app-pub-3940256099942544/2934735716"
   bannerView.rootViewController = self
   bannerView.load(GADRequest())
  }

bannerView在故事板中有一个出口到Root View Controller,它是类FlashViewController。

然后在TableViewController.swift中我有我的购买按钮。购买按钮运行:

 FlashViewController().HideMyBanner();

函数HideMyBanner位于FlashViewController中,将运行此代码:

if bannerView != nil {
        print("bannerview Contains a value!")
        bannerView.isHidden = true

    } else {
        print("bannerview Doesn’t contain a value.")
    }

问题是,如果我直接在FlashViewContorller.swift中创建一个按钮并运行相同的函数,bannerView包含一个值并且可以隐藏..如果我从TableViewController.swift调用该函数,它将返回nil,(或崩溃)如果我试图隐藏bannerView ...我觉得我在这里错过了一些简单的东西,但已经花了很长时间试图找出它......

3 个答案:

答案 0 :(得分:0)

使用此行FlashViewController().HideMyBanner();即可创建FlashViewController的新对象。所以它会崩溃。你需要使用已经创建并加载到内存中的FlashViewController对象。

我认为您需要将FlashViewContorller的引用传递给TableViewController

如果您TableViewController的加载时间比FlashViewContorller FlashViewContorller加载TableViewController,则需要class TableViewController: UIViewController { var objFlashViewContorller : FlashViewContorller? override func viewDidLoad() { super.viewDidLoad() //This is the UILabel } func purchasebuttonClick() { objFlashViewContorller?.HideMyBanner(); } } 加载let tableViewController = self.storyboard!.instantiateViewController(withIdentifier: "TableViewController") as! TableViewController tableViewController.objFlashViewContorller = self self.navigationController?.pushViewController(tableViewController, animated: true)

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "TableViewController" {
            let vc = segue.destinationViewController as! TableViewController
            vc.objFlashViewContorller = self
        }

设置导航FlashViewContorller到TableViewController时需要传递参考。

class Count
{
    public static int sum(int add1, int add2)
    {
        int result = add1 + add2;
        return result;
    }
}

class Program
{
   static void Main(String[] args)
    {
        Console.WriteLine("Adding: \nPlease enter the first number");
        int num1 = int.Parse(Console.ReadLine());
        Console.WriteLine("Please enter the second number");
        int num2 = int.Parse(Console.ReadLine());

        Count add = new Count();
        int total = add.sum(num1, num2);
        Console.WriteLine("The sum is {0}.", total);
        Console.ReadLine();
    }
}

{{1}}

答案 1 :(得分:0)

请勿使用FlashViewController().HideMyBanner();

我认为你需要在TableViewController.swift中使用它 - >我的购买按钮方法。

self.revealViewController.frontViewController.HideMyBanner()

答案 2 :(得分:0)

我使用通知最终解决了这个问题......控制器2发出购买通知,并且Controller 1观察并等待此通知,然后负责将控制台1中的横幅隐藏起来。

https://blog.bobthedeveloper.io/pass-data-with-nsnotification-in-swift-3-73743723c84b