Slide 87
Slide 87 text
-‐
(void)pspdf_addWillDismissAction:(dispatch_block_t)dismissAction
{
@synchronized(self)
{
//
First
try
to
get
an
already
defined
block
and
add
chain
the
blocks
if
set.
dispatch_block_t
currentDismissBlock
=
objc_getAssociatedObject(self,
&PSPDFViewControllerWillDismissActionKey);
if
(currentDismissBlock)
{
currentDismissBlock
=
^{
currentDismissBlock();
dismissAction();
};
objc_setAssociatedObject(self,
&PSPDFViewControllerWillDismissActionKey,
currentDismissBlock,
OBJC_ASSOCIATION_COPY_NONATOMIC);
}else
{
SEL
origSEL
=
@selector(viewWillDisappear:);
//
Prepare
the
new
method.
id
block
=
^(UIViewController
*_self,
BOOL
animated)
{
//
Call
[super
viewWillDisappear:animated]
void
(*superIMP)(id,
SEL,
BOOL)
=
(void
*)[_self.class.superclass
instanceMethodForSelector:origSEL];
superIMP(_self,
_cmd,
animated);
//
Execute
the
dismiss
action
if
we're
being
dismissed.
dispatch_block_t
dismissBlock
=
objc_getAssociatedObject(_self,
&PSPDFViewControllerWillDismissActionKey);
if
(_self.isBeingDismissed
&&
dismissBlock)
dismissBlock();
};
//
If
the
class
is
lying
about
their
class,
it's
most
likely
KVO.
if
(self.class
!=
object_getClass(self))
{
SEL
newSEL
=
NSSelectorFromString([NSString
stringWithFormat:@"pspdf_%@",
NSStringFromSelector(origSEL)]);
if
(PSPDFReplaceMethodWithBlock(self.class,
origSEL,
newSEL,
block))
{
objc_setAssociatedObject(self,
&PSPDFViewControllerWillDismissActionKey,
dismissAction,
OBJC_ASSOCIATION_COPY_NONATOMIC);
}
}else
{
//
Make
a
dynamic
subclass
so
we
can
hook
onto
viewWillDisappear.
const
char
*prefix
=
"PSPDF_";
NSString
*className
=
NSStringFromClass(self.class);
if
(strncmp(prefix,
className.UTF8String,
strlen(prefix))
==
0)
{
return;
}
//
Error!
NSString
*subclassName
=
[NSString
stringWithFormat:@"%s%@",
prefix,
className];
Class
subclass
=
NSClassFromString(subclassName);
if
(subclass
==
nil)
{
subclass
=
objc_allocateClassPair(self.class,
subclassName.UTF8String,
0);
if
(subclass
!=
nil)
{
IMP
viewWillDisappearIMP
=
imp_implementationWithBlock(block);
class_addMethod(subclass,
origSEL,
viewWillDisappearIMP,
method_getTypeEncoding(class_getInstanceMethod(self.class,
origSEL)));
objc_registerClassPair(subclass);
}
}
if
(subclass)
{
object_setClass(self,
subclass);
objc_setAssociatedObject(self,
&PSPDFViewControllerWillDismissActionKey,
dismissAction,
OBJC_ASSOCIATION_COPY_NONATOMIC);
}
}
}
}