#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 несколько раз — я добавил уточнение к ответу.