Размещение ADBannerView поверх UINavigationController

#objective-c #cocoa-touch #ios4 #uinavigationcontroller #iad

#objective-c #cocoa-touch #ios4 #uinavigationcontroller #iad

Вопрос:

Я пытаюсь разместить баннер iAd в приложении, основанном на UINavigationController (это не стандартное навигационное приложение, предложенное xcode, потому что мне не нужен табличный вид). Я хотел бы разместить ADBanner в нижней части, чтобы он всегда был виден, независимо от того, как пользователь нажимает на просмотры.

Я изучил пример iAdSuite в примере кода Apple, но, хотя он входит в число «лучших практик», я не думаю, что это лучшая практика для того, что мне нужно. По сути, он объявляет ADBannerView в классе делегата приложения, а затем реализует методы ADBannerViewDelegate для каждого отдельного представления, необходимого приложению. Это означает реализацию методов ADBannerViewDelegate снова и снова в каждом классе контроллера просмотра, который вам нужен! Это не кажется слишком умным … : (

Я бы предпочел подход, более похожий на то, что сама Apple делает в приложении на основе панели вкладок, где у вас есть часть окна, всегда занятая контроллером вкладок, и все виды, переключающиеся выше, не затрагивая вид панели вкладок ниже. Вы не можете напрямую поместить ADBannerView вместе с контроллером навигации в делегат приложения, потому что ADBanner необходимо поместить в контроллер просмотра (в противном случае вы получите ошибку времени выполнения).

Я попытался создать подкласс из UIViewController, реализовав ADBannerViewDelegate в этом классе, и поместить его в RootViewController вместе с UINavigationController, но мне не повезло с этим подходом…

Кто-нибудь нашел хороший, простой способ для этого? Есть какой-нибудь намек?

Спасибо за любую помощь…

Ответ №1:

У вас может быть только один класс для ADBannerViewDelegate и только один экземпляр ADBanner самого себя. Когда текущее активное представление изменится, удалите ADBanner из старого представления, добавьте его в качестве подвида в новое представление.

Редактировать:

чтобы уточнить, вам не нужно, чтобы каждое представление реализовывало ADBannerViewDelegate . У вас должен быть только один класс, реализующий это (этот класс не обязательно должен быть контроллером представления, если на то пошло).

Вам также нужно будет где-то поддерживать свойство, которое указывало бы на текущее активное представление (например, вы можете обновить это свойство в navigationController:didShowViewController:animated: вашем навигационном контроллере или придумать для этого свой собственный протокол, если ваши представления отображаются более сложным способом).

Затем в вашем ADBannerViewDelegate вы бы просто изменили размер представления, на которое в данный момент указывает это текущее свойство view. Фактическому просмотру даже не нужно знать, что в нем есть реклама 😉

Комментарии:

1. Спасибо за ваш ответ. То, что вы предлагаете, — это именно то, что делает образец Apple. И это имеет смысл, когда вам нужно иметь разные политики управления макетом для каждого из ваших представлений. В каждом представлении реализован делегат для adbanner, а сам баннер добавляется в новейшее представление и удаляется из предыдущего.

2. Но если вы хотите иметь точно такое же управление макетом для каждого представления в вашем приложении (в основном, немного уменьшить ваше представление, чтобы баннер размещался в нижней или верхней части вашего окна), зачем вам беспокоиться о том, чтобы снова и снова внедрять одни и те же методы для делегирования баннера на каждом контроллере представления?

3. Не было бы намного проще разместить в вашем окне два подвида? Один с контроллером представления, который реализует делегирование баннера и находится в нижней части вашего окна, а другой занимает остальную часть вашего окна и управляет навигацией между представлениями. Это то, что я пытаюсь сделать … безуспешно : (Это невозможно?

4. нет, вам не обязательно внедрять делегат ad несколько раз — я добавил уточнение к ответу.