一个基于块的 UIMenuItem 子类。
UIMenuItem 中的基于@selector的不可灵活方法让我很烦恼。我花了一些时间去寻找基于块的UIMenuItem,但找不到。所以最后,我坐下来为我自己的iOS PDF框架PSKit实现了自己的实现。
如果您像我一样对缺失的目标/动作模式感到烦恼,您会非常喜欢这个。请阅读我的网站上的深入文章。
PSMenuItem *actionItem = [[PSMenuItem alloc] initWithTitle:@"Action 1" block:^{
[[[UIAlertView alloc] initWithTitle:@"Message" message:@"From a block!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
}];
PSMenuItem *submenuItem = [[PSMenuItem alloc] initWithTitle:@"Submenu..." block:^{
[UIMenuController sharedMenuController].menuItems = @[
[[PSMenuItem alloc] initWithTitle:@"Back..." block:^{
[self buttonPressed:button];
}],
[[PSMenuItem alloc] initWithTitle:@"Sub 1" block:^{
NSLog(@"Sub 1 pressed");
}]];
[[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
}];
[UIMenuController sharedMenuController].menuItems = @[actionItem, submenuItem];
[[UIMenuController sharedMenuController] setTargetRect:button.bounds inView:button];
[[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
PSMenuItem使用ARC,并已在Xcode 4.4和4.5DP3(iOS 4.3+)上测试。
代码看起来有点吓人,并涉及交换某些方法,但实际上并不那么糟糕。没有使用私有API,并且苹果不太可能更改如此基本的东西如 UIResponder链。
如果您觉得这个有用,请发个感谢的tweet。
PSMenuItem可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。