2016-02-22 1 views
0

У меня есть два контроллера вида imageViewController и InfoViewController. я хочу, чтобы мое объявление отображалось, когда пользователь нажимает на кнопку назад от InfoViewControllershow Admob interstitial, когда с кнопкой навигации назад нажмите iOS Swift

class imageViewController: UIViewController , GADInterstitialDelegate { 
    var interstitial: GADInterstitial! 
override func viewDidLoad() { 

     self.interstitial = self.createAndLoadInterstitial() 
     super.viewDidLoad() 
} 
func createAndLoadInterstitial() -> GADInterstitial { 
     let interstitial: GADInterstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910") 
     interstitial.delegate = self 
     let request = GADRequest() 
     interstitial.loadRequest(request) 
     print("req sent") 
     return interstitial 
    } 
    func interstitialDidReceiveAd(ad: GADInterstitial!) { 
     if (interstitial.isReady) { 
      print("ad ready") 
      interstitial.presentFromRootViewController(self) 
     }} 
    func interstitialDidDismissScreen(interstitial: GADInterstitial) { 
    } 

Как я должен вызвать его обратно нажатием кнопки из infoViewController в ImageViewCroller. Я также не смог решить эту проблему с глобальной переменной, так как я новичок в iOS

ответ

0

Я бы порекомендовал его назвать одним из методов UIViewController. Например:

isMovingFromParentViewController() 

См. documentation.

EDIT:

На самом деле, если вы хотите иметь VC в качестве делегата, вы должны вызвать его из родительского VC, в противном случае вы потеряете делегат, выталкивая его с помощью кнопки назад.

Вы можете сделать это несколькими путями. Можно было бы использовать closure. Здесь, вы бы положить ваши методы обратного вызова в первом VC и имеют свойство в вашем втором VC, как так:

var onBack:()->()? 

И вам нужно будет установить это значение при отображении второго VC (например, в prepareForSegue методом) :

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let destination = segue.destinationViewController as? InfoViewController { 
     destination.onBack = {()->() in 
      self.createAndLoadInterstitial() 
     } 
    } 
} 

Затем, во втором контроллере представления это сделать:

override func isMovingFromParentViewController() -> Bool { 
    onBack?() 
} 

это не тестируется кстати :)

+0

Спасибо Konrad за ваш повтор. я звоню self.interstitial = self.createAndLoadInterstitial() при создании кнопки выхода в infoVC, но все же я столкнулся с одной и той же проблемой, может ли я направить меня более конкретно? –

+0

Хорошо, так что, вероятно, это не сработает, потому что нажатием кнопки «Назад» вы вводите свой VC и в то же время делегат для вашего интерстициального. Таким образом, либо у вас есть глобально доступный класс, где вы обрабатываете межстраничные объявления, либо вы вызываете его из родительского VC. Позвольте мне отредактировать мой ответ. –

+0

Я получаю сообщение об ошибке «Класс infoViewController» не имеет инициализатора « –

1

он будет показывать объявление только на заднем пресс

var interstitial: GADInterstitial! 
    var showAd = true 
viewdidload { 
self.createandLoadInterstitial() 
} 
func createAndLoadInterstitial() { 
     interstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910") 
     interstitial.delegate = self 
     let request = GADRequest() 
     interstitial.loadRequest(request) 

    } 
override func viewDidAppear(animated: Bool) { 
     if (interstitial.isReady && showAd) { 
      showAd = false 
      print("iterstitalMain is ready") 
      interstitial.presentFromRootViewController(self) 
      self.createAndLoadInterstitial() 
     } 
     else{ 
     showAd = true 
     } 

    } 
2

Простейшие способа для меня, чтобы обнаружить ИОС назад прессованный и показать AdMob интерстициального объявление на backPressed это с помощью willMoveToParentViewController или didMoveToParentViewController в моем childViewController, в вашем случае InfoViewController.

Я создаю межстраничный экземпляр interstitial admob на appDelegate. Таким образом, я могу использовать его во всем мире и использовать только один экземпляр/общий экземпляр (я думаю)

тогда просто позвоните по телефону willMoveToParentViewController или didMoveToParentViewController вот так. Оба они почти одинаковы. (willMoveToParentViewController будет просто назвать вперед (мое наблюдение: объявление будет показано во время перехода обратно) из didMoveToParentViewController (мое наблюдение: объявление будет показано, когда полностью перешли обратно))

override func willMoveToParentViewController(parent: UIViewController?) { 
    super.willMoveToParentViewController(parent) 
    if parent == nil { 
     appDelegate.showInterstitialAd() 
    } 
} 

или

override func didMoveToParentViewController(parent: UIViewController?) { 
    super.didMoveToParentViewController(parent) 
    if parent == nil { 
     appDelegate.showInterstitialAd() 
    } 

} 

Получили идея из этого ответа. https://stackoverflow.com/a/17551952

PS. вызов interstitial.presentFromRootViewController(self) on interstitialDidReceiveAd` - это не лучший способ позвонить, так как у вас нет контроля, когда он покажет.

+0

Спасибо, i будет использовать это в следующий раз –

0

совершенный проверенный код для добавления межстраничных объявлений. в задней кнопке. добавьте этот код во второй канал контроля. не нужно ничего добавлять в FirstViewcontroller.

func createAndLoadInterstitial() { 
    interstitial = GADInterstitial(adUnitID: "your id") 
    interstitial.delegate = self 
    let request = GADRequest() 
    interstitial.loadRequest(request) 

} 
override func viewWillDisappear(animated: Bool) { 
    if (interstitial.isReady && showAd) { 
     showAd = false 
     print("iterstitalMain is ready") 
     interstitial.presentFromRootViewController(parentViewController!) 
     self.createAndLoadInterstitial() 
    } 
    else{ 
    } 
} 
Смежные вопросы