这有点笨拙,但您可以通过观察editButtonItem
's来解决这个问题title
。
[self.viewControllerToObserve addObserver:self forKeyPath:@"editButtonItem.title" options:0 context:kMyViewControllerKVOContext];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == kMyViewControllerKVOContext) {
// editing changed
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
仅供参考,这就是我声明上下文的方式(上图@implementation
):
static void * const kMyViewControllerKVOContext = (void *)&kMyViewControllerKVOContext;
使用Hopper,我们可以看到它在UIViewController
's期间setEditing
创建了一个新editButtonItem
的标题,该标题取决于正在更改的编辑内容。
/* @class UIViewController */
-(void)setEditing:(bool)arg2 animated:(bool)arg3 {
rdx = arg2;
rdi = self;
rax = *ivar_offset(_viewControllerFlags);
rcx = *(rdi + rax);
if (((rcx & 0x4) >> 0x2 ^ rdx) == 0x1) {
stack[-8] = rbp;
stack[-16] = r15;
stack[-24] = r14;
stack[-32] = r13;
stack[-40] = r12;
stack[-48] = rbx;
rsp = rsp - 0x38;
r12 = rdi;
*(rdi + rax) = (rcx & 0xfffffffffffffffb) + (rdx & 0xff) * 0x4;
r15 = [UIBarButtonItem alloc];
r14 = [__UIKitBundle() retain];
if ((rdx & 0xff) != 0x0) {
rax = [r14 localizedStringForKey:@"Done" value:rcx table:@"Localizable"];
rax = [rax retain];
r13 = rax;
rcx = 0x2;
rdi = r15;
rdx = rax;
}
else {
rax = [r14 localizedStringForKey:@"Edit" value:rcx table:@"Localizable"];
rax = [rax retain];
r13 = rax;
rdi = r15;
rdx = rax;
rcx = 0x0;
}
rbx = [rdi initWithTitle:rdx style:rcx target:0x0 action:0x0];
[r13 release];
[r14 release];
[r12->_editButtonItem _setItemVariation:rbx];
[rbx release];
}
return;
}
更多感兴趣的人:
/* @class UIBarButtonItem */
-(void)_setItemVariation:(void *)arg2 {
rdx = arg2;
rdi = self;
rax = *ivar_offset(_barButtonItemFlags);
if ((*(int8_t *)(rdi + rax) & 0x10) == 0x0) {
rax = [rdx retain];
r15 = rax;
rax = [rax title];
rax = [rax retain];
[rdi setTitle:rax];
[rax release];
rbx = [r15 style];
[r15 release];
[rdi setStyle:rbx];
}
return;
}