Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
BigDanceMouse
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
#1

Как сделать принятие классом протокола только при определенных условиях? - Objective-C

12.10.2014, 00:14. Просмотров 638. Ответов 14
Метки нет (Все метки)

Доброго, всем, времени суток.
В iOS 8 был "деприкейтед" UIAlertView. Вместо него теперь UIAlertController, которы не требует предварительного принятия протокола UIAlertViewDelegate. Но, чтобы сделать поддержку iOS7 и ниже, этот протокол должен быть в случае если [[UIDevice currentDevice] systemVersion] < 8.
В связи с этим появился вопрос: как добавить принятие этого протокола только под старые версии iOS? Я подозреваю что это должно быть реализованно через директивы компилятору, но как точно это сделать - не представляю. По этому прошу подсказать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2014, 00:14     Как сделать принятие классом протокола только при определенных условиях?
Посмотрите здесь:

Как сделать листание под ipad Objective-C
Как сделать многоуровневую игру? Objective-C
Objective-C Как сделать, чтобы методы выполнялись последовательно
сделать циклическую программу для любых чисел,чтобы при вводе числа получалось например так: 512=(5+1+2)3 Objective-C
Objective-C Как сделать, чтобы текст букв изменялся как в караоке?
Objective-C Как сделать адаптацию интерфейса к альбомной ориентации экрана
Как сделать асинхронную загрузку картинок в UITableView не останавливая главный поток? Objective-C
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
12.10.2014, 10:25     Как сделать принятие классом протокола только при определенных условиях? #2
В iOS 8 был "деприкейтед" UIAlertView
На UINavigationController Положить программно UIView из *.xib которая будет выполнять функции UIAlertView
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
12.10.2014, 11:22     Как сделать принятие классом протокола только при определенных условиях? #3
BigDanceMouse, Если вы реализуете это через директивы компилятора - ничего хорошего не выйдет.
Вам нужна ведь поддержка обеих версий...
Проверяйте во время выполнения на наличие [UIAlertController class] или на версию iOS запущенную в данный момент.
BigDanceMouse
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
12.10.2014, 11:30  [ТС]     Как сделать принятие классом протокола только при определенных условиях? #4
zulkis, Вот что я сдел:
определил проверку в компиляторе
Objective-C
1
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)
затем в самом методе поставил
Objective-C
1
2
3
4
5
6
if(SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(@"7.1.2")){
// UIAlertView
}
else{
// UIAlertController
}
Вот думаю теперь как подключить протокол если SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(@"7.1.2")
Думаете это не лучший вариант?
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
12.10.2014, 13:14     Как сделать принятие классом протокола только при определенных условиях? #5
BigDanceMouse, Что значит подключить протокол?
Ну есть у вас реализация, и есть.
Не нужно ничего с этим делать.

И проверку сделайте только "Меньше 8".
А лучше наоборот:
Objective-C
1
2
3
4
5
6
if(SYSTEM_VERSION_MORE_THAN_OR_EQUAL_TO(@"8.0")){
// UIAlertController
}
else{
// UIAlertView
}
Так более читабельно на мой взгляд

P.S
Цитата Сообщение от BigDanceMouse Посмотреть сообщение
определил проверку в компиляторе
Это вы бред написали.
Разбирайтесь что такое define.
В данном случае у вас вызывается конкретно:
Objective-C
1
[[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending
где v - это аргумент "версии" типа NSString который вы передаете.
И ничего более.
И все это работает во время исполнения. И никак не во время сборки.
BigDanceMouse
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
12.10.2014, 13:29  [ТС]     Как сделать принятие классом протокола только при определенных условиях? #6
zulkis, Я просто был всегда уверен что #define это как раз для компилятора.
Цитата Сообщение от zulkis Посмотреть сообщение
Разбирайтесь что такое define.
Давно уже искал где бы про это поподробнее прочитать. Может подскажете?
Цитата Сообщение от zulkis Посмотреть сообщение
Что значит подключить протокол?
Мне нужно обработать нажатие кнопки на Алерте. "Подключить протакол" я имею в виду объявить принятие классом этого протокола
Objective-C
1
@interface DJAllertAccept () [B]<UIAlertViewDelegate>[/B]
Как это правильно называется? Это как раз и есть суть моей проблемы - как сделать что бы UIAlerViewDelegate подключался только в случае если ОС ниже 8ой.
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
12.10.2014, 15:22     Как сделать принятие классом протокола только при определенных условиях? #7
можно заюзать кастомный алерт вью, типа такого https://github.com/wimagguc/ios-custom-alertview
а вот про принятие протокола я и сам не понял.
Цитата Сообщение от BigDanceMouse Посмотреть сообщение
Давно уже искал где бы про это поподробнее прочитать. Может подскажете?
если я правильно понял, он про #ifdef
BigDanceMouse
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
12.10.2014, 18:11  [ТС]     Как сделать принятие классом протокола только при определенных условиях? #8
residentkms, Кастомный алерт - хорошая идея. Такой вариант не требует принятия протокола. Но все же хотел обойтись стандартным алертом. Если не получится - буду использовать ваш метод.
Цитата Сообщение от residentkms Посмотреть сообщение
если я правильно понял, он про #ifdef
что именно он про #ifdef?
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
12.10.2014, 18:20     Как сделать принятие классом протокола только при определенных условиях? #9
BigDanceMouse, попробуйте это.
Вот вы пытались воспользоваться макросом. Он бы в конечном итоге заменился бы препроцессором.

residentkms,
#ifdef как раз таки и обрабатывается препроцессором.
И эти директивы используются для построения непосредсвенно текстового файла, который будет компилироваться.
А ТС-у нужно проверять на какой версии OS происходит действие либо существует ли такой класс(UIAlertController).
Небо и земля, собственно.
Одно дело проверить что-то во время сборки на собирающей машине, другое - во время исполнения...
Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
12.10.2014, 19:48     Как сделать принятие классом протокола только при определенных условиях? #10
UIAlertView хоть и deprecated, но из SDK никуда не делся. И не денется в ближайшие пару лет. Пока нужна поддержка iOS 7 можно использовать только его и забыть об UIAlertController.

Сам UIAlertView очень ограничен и UIAlertController не очень далеко от него ушел в плане возможностей. Возможно действительно лучше использовать кастомный класс или написать свой. А городить проверки на версию только из-за deprecated мне видится не лучшим решением.
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
13.10.2014, 15:39     Как сделать принятие классом протокола только при определенных условиях? #11
я правда так и не понял, зачем тсу принимать протокол uialertview, если он принимается по дефолту, если я не ошибаюсь?
Цитата Сообщение от zulkis Посмотреть сообщение
#ifdef как раз таки и обрабатывается препроцессором.
прошу прощения, чушь сморозил.
BigDanceMouse
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
13.10.2014, 15:46  [ТС]     Как сделать принятие классом протокола только при определенных условиях? #12
residentkms, На сколько мне известно - для того что бы назначить self делегатом алерта требуется принятие протокола UIAlertViewDelegate. Подозреваю что в классе алерта будет стоять проверка на conformToProtocol или что-то подобное.
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
13.10.2014, 15:50     Как сделать принятие классом протокола только при определенных условиях? #13
Цитата Сообщение от BigDanceMouse Посмотреть сообщение
residentkms, На сколько мне известно - для того что бы назначить self делегатом алерта требуется принятие протокола UIAlertViewDelegate. Подозреваю что в классе алерта будет стоять проверка на conformToProtocol или что-то подобное.
сколько программирую и использую UIAlertView, ниразу не принимал протокол UIAlertViewDelegate.
Поэтому, подозреваю, что протоколы некоторых cocoa классов принимаются по дефолту. Поправьте, если не прав.
А проверка в классе, вероятнее всего на respondToSelector.
BigDanceMouse
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
13.10.2014, 16:08  [ТС]     Как сделать принятие классом протокола только при определенных условиях? #14
residentkms, хм... Действительно. Попробовал сейчас - alertView:clickedButtonAtIndex: вызывается без протокола. Ну с другой стороны - протокол это , как я понимаю, всего лишь объявление методов которые нужно/можно использовать в связке с тем или иным объектом. Так что если они не @required - то и протокол тут выступает в качестве простого информирования что мол пользуйтесь такими-то методами.
Спасибо - это многое упрощает. Надеюсь что это не баг какой нибудь который Эпл исправит в последствии.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2014, 16:36     Как сделать принятие классом протокола только при определенных условиях?
Еще ссылки по теме:

Как сделать свой шрифт в приложении? Objective-C
Как сделать offline кэш для браузера? Objective-C
Как сделать, чтобы скрол работал во все стороны? Objective-C
Как сделать пагинацию таблицы? Objective-C
Как сделать доступ к элементам массива по индексу и по литералу индекса? Objective-C

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
13.10.2014, 16:36     Как сделать принятие классом протокола только при определенных условиях? #15
Цитата Сообщение от BigDanceMouse Посмотреть сообщение
Ну с другой стороны - протокол это , как я понимаю, всего лишь объявление методов которые нужно/можно использовать в связке с тем или иным объектом
не совсем. если я не ошибаюсь, это объявление методов класса1, которые должны быть реализованны в классе2.
Yandex
Объявления
13.10.2014, 16:36     Как сделать принятие классом протокола только при определенных условиях?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru