UIWebView+BlocksKit.m 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //
  2. // UIWebView+BlocksKit.m
  3. // BlocksKit
  4. //
  5. #import "A2DynamicDelegate.h"
  6. #import "NSObject+A2BlockDelegate.h"
  7. #import "UIWebView+BlocksKit.h"
  8. #pragma mark Custom delegate
  9. @interface A2DynamicUIWebViewDelegate : A2DynamicDelegate <UIWebViewDelegate>
  10. @end
  11. @implementation A2DynamicUIWebViewDelegate
  12. - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
  13. BOOL ret = YES;
  14. id realDelegate = self.realDelegate;
  15. if (realDelegate && [realDelegate respondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)])
  16. ret = [realDelegate webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
  17. BOOL (^block)(UIWebView *, NSURLRequest *, UIWebViewNavigationType) = [self blockImplementationForMethod:_cmd];
  18. if (block)
  19. ret &= block(webView, request, navigationType);
  20. return ret;
  21. }
  22. - (void)webViewDidStartLoad:(UIWebView *)webView {
  23. id realDelegate = self.realDelegate;
  24. if (realDelegate && [realDelegate respondsToSelector:@selector(webViewDidStartLoad:)])
  25. [realDelegate webViewDidStartLoad:webView];
  26. void (^block)(UIWebView *) = [self blockImplementationForMethod:_cmd];
  27. if (block) block(webView);
  28. }
  29. - (void)webViewDidFinishLoad:(UIWebView *)webView {
  30. id realDelegate = self.realDelegate;
  31. if (realDelegate && [realDelegate respondsToSelector:@selector(webViewDidFinishLoad:)])
  32. [realDelegate webViewDidFinishLoad:webView];
  33. void (^block)(UIWebView *) = [self blockImplementationForMethod:_cmd];
  34. if (block) block(webView);
  35. }
  36. - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
  37. id realDelegate = self.realDelegate;
  38. if (realDelegate && [realDelegate respondsToSelector:@selector(webView:didFailLoadWithError:)])
  39. [realDelegate webView:webView didFailLoadWithError:error];
  40. void (^block)(UIWebView *, NSError *) = [self blockImplementationForMethod:_cmd];
  41. if (block) block(webView, error);
  42. }
  43. @end
  44. #pragma mark Category
  45. @implementation UIWebView (BlocksKit)
  46. @dynamic bk_shouldStartLoadBlock, bk_didStartLoadBlock, bk_didFinishLoadBlock, bk_didFinishWithErrorBlock;
  47. + (void)load
  48. {
  49. @autoreleasepool {
  50. [self bk_registerDynamicDelegate];
  51. [self bk_linkDelegateMethods:@{
  52. @"bk_shouldStartLoadBlock": @"webView:shouldStartLoadWithRequest:navigationType:",
  53. @"bk_didStartLoadBlock": @"webViewDidStartLoad:",
  54. @"bk_didFinishLoadBlock": @"webViewDidFinishLoad:",
  55. @"bk_didFinishWithErrorBlock": @"webView:didFailLoadWithError:"
  56. }];
  57. }
  58. }
  59. @end