2016-02-01 5 views
2

Недавно мне был предоставлен частный аппаратный SDK для интеграции в мобильное приложение моей компании. Все работает отлично, за исключением того, что они используют UIAlertView в результате некоторого непрозрачного вызова метода, и моя команда разработчиков хочет заклеймить это. У меня нет доступа к исходному коду SDK. Есть ли способ, которым я могу безопасно swizzle UIAlertView, чтобы сохранить все функциональные возможности и просто изменить внешний вид UIAlertView, так что он более заклеймен/совместим с внешним видом приложения? Если это так, я бы перегрузил drawRect или что-то еще, и как бы я понял, что имена ярлыков в UIAlertView так, чтобы я мог рисовать их с размером, формой и цветом, которые я хочу?Изменить UIAlertView с swizzling

для дополнительной информации, приложение в настоящее время не использует UIAlertView или UIAlertViewController, поэтому теоретически swizzling повлияет только на то, что происходит с этим SDK с закрытым исходным кодом.

+0

Вы знакомы с другими элементами alertViews в своем приложении, или вы используете 'UIAlertController' и бренд? – Avi

+0

@Avi Мы не используем UIAlertController, кроме как через этот API (и не планируем, как мы делаем пользовательские представления). – helloB

+0

Я бы рекомендовал создать пользовательский контроллер, а затем попробовать swizzle. – uchiha

ответ

2

Это совсем не так.


Если SDK использует UIAlertView, то попробуйте swizzling причем способ show.

Ваша реализация должна сделать примерно следующее:

1) Не позволяйте оригинальной UIAlertView показать - это очень трудно настроить его.

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

3) Создайте свой собственный UIView и используйте [[UIApplication sharedApplication].keyWindow addSubview:myCustomAlertView];.

4) Я считаю, что вы можете получить все предыдущие переменные UIAlertView (т.е. названия кнопки, текстовые поля и т.д.), используя его свойства, такие как

@property(nonatomic,copy) NSString *title; 
@property(nullable,nonatomic,copy) NSString *message; 
- (nullable NSString *)buttonTitleAtIndex:(NSInteger)buttonIndex; 
@property(nonatomic,readonly) NSInteger numberOfButtons; 
@property(nonatomic) NSInteger cancelButtonIndex; 

5) Создайте свой собственный дизайн и соответствующий вызов методов делегирования при необходимости.


Другой подход заключается в использовании частного API Apple, но это может привести к плохим результатам.

Это ОЧЕНЬ ХАЙКИЙ подход. Во-первых, у вас нет гарантий, что он будет работать. Во-вторых, ваше приложение может быть отклонено. Поэтому, я бы не рекомендовал его ...

Однако, если вы действительно хотите, чтобы пойти с этим подходом, то попробуйте сделать следующее:

После [myAlertView show]; взгляд на его свойства после некоторой задержки (т.е. 0,01 сек достаточно):

enter image description here

Теперь посмотрим на наличие подозрительных свойств (вероятно класса UIView), которые могли бы иметь информацию пользовательского интерфейса связанной. Например, __representer выглядит довольно интересно - у него есть ограничения, у него есть labelContainerView ... Попробуйте сыграть с этими свойствами.

Для получения этого __representer используйте KVC и KVO (то есть начните с id theAlertController = [myAlertView valueForKey:@"_alertController"];). Затем погрузитесь глубже и глубже.

Надеюсь, вы сможете найти полезные свойства и сможете изменять их значения через KVC.

+0

Спасибо за этот очень тщательный ответ. Я попробую это и дам вам знать, что произойдет. – helloB

+0

Вы также должны проверить, использует ли частный SDK 'UIAlertView' или' UIAlertViewController'. Надеюсь, не оба ... В случае, если они используют оба варианта, вам придется применять метод swizzling для обоих классов ... – OlDor

Смежные вопросы