【问题标题】:Change UIAlertView with swizzling使用 swizzling 更改 UIAlertView
【发布时间】:2016-02-01 17:46:21
【问题描述】:

我最近收到了一个私有硬件 SDK,可以集成到我公司的移动应用程序中。一切都很好,除了他们使用UIAlertView 作为一些不透明的方法调用的结果,我的设计团队想给这个打上烙印。我无权访问 SDK 的源代码。有没有办法可以安全地调配UIAlertView 以保留所有功能并简单地修改UIAlertView 的外观,使其与应用程序外观更具品牌/一致?如果是这样,我是否会重载drawRect 或其他东西,我如何弄清楚UIAlertView 中标签的名称是什么,以便我可以用我想要的大小、形状和颜色来绘制它们?

为了补充细节,该应用目前不使用 UIAlertViewUIAlertViewController,因此理论上 swizzling 只会影响这个闭源 SDK 所发生的一切。

【问题讨论】:

  • 你是在你的应用中给其他 alertViews 打上商标,还是使用UIAlertControllers 并给那些打上商标?
  • @Avi 我们不使用 UIAlertController 除了通过这个 API 之外(并且不打算像我们使用自定义视图那样)。
  • 我建议创建一个自定义控制器,而不是尝试调配。
  • @uchiha 在无法访问源代码时如何创建自定义控制器?
  • 我的意思是创建一个自定义控制器,其行为方式类似于警报,但它将完全属于您的类,您不需要访问源代码。如果您仍想使用警报,请通过code.tutsplus.com/tutorials/…

标签: ios objective-c method-swizzling


【解决方案1】:

这根本不简单。


如果 SDK 使用的是UIAlertView,则尝试swizzling show 方法。

您的实现应大致执行以下操作:

1) 不要让原始 UIAlertView 显示 - 很难自定义它。

2) 保留旧.delegate 的引用,以便在需要时通知它。

3) 创建您自己的自定义 UIView 并使用[[UIApplication sharedApplication].keyWindow addSubview:myCustomAlertView];

4) 我相信你可以使用它的属性,例如

@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) 创建您自己的设计并在需要时调用相应的委托方法。


其他方法是使用 Apple 的 Private API,但这可能会导致不好的结果。

这是一种非常 HACKY 的方法。首先,您无法保证它甚至会起作用。其次,您的应用可能会被拒绝。因此,我不会真的推荐它...

但是,如果您真的想采用这种方法,请尝试这样做:

[myAlertView show]; 延迟一段时间后查看其属性(即 0.01 秒就足够了):

现在查找可疑属性(可能属于 UIView 类),这些属性可能包含与 UI 相关的信息。例如,__representer 看起来很有趣——它有约束,它有 labelContainerView...尝试使用这些属性。

为了获得 __representer,请使用 KVC 和 KVO(即以 id theAlertController = [myAlertView valueForKey:@"_alertController"]; 开头)。然后越潜越深。

希望您能够找到有用的属性,并能够通过 KVC 更改它们的值。

【讨论】:

  • 感谢您提供如此详尽的回答。我会试试这个,让你知道会发生什么。
  • 您还应该检查私有 SDK 使用的是 UIAlertView 还是 UIAlertViewController。希望不是两者都...如果他们同时使用两者,您将不得不对两个类应用方法调配...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
相关资源
最近更新 更多