Raw*_*Raw 6 objective-c uimenucontroller uicollectionview ios7
我正在使用a UIMenuItem在UICollectionView单元长按中执行自定义操作.这与iOS 6完美配合,但现在我将我的应用程序转换为iOS 7和Xcode 5,但它无法正常工作.自定义项目未显示.
UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Unfavorite"
action:@selector(unFavorite:)];
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:menuItem]];
[UIMenuController sharedMenuController].menuVisible = YES;
- (BOOL)collectionView:(UICollectionView *)collectionView canPerformAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender;
{
//do not show default itens like copy, paste....
[self becomeFirstResponder];
return NO;
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
// The selector(s) should match your UIMenuItem selector
if (action == @selector(unFavorite:)) {
return YES;
}
return NO;
}
- (void)collectionView:(UICollectionView *)collectionView
performAction:(SEL)action
forItemAtIndexPath:(NSIndexPath *)indexPath
withSender:(id)sender {
}
- (BOOL)collectionView:(UICollectionView *)collectionView
shouldShowMenuForItemAtIndexPath:(NSIndexPath *)indexPath {
myIndexPath = indexPath;
return YES;
}
Run Code Online (Sandbox Code Playgroud)
我不知道iOS 6,但在iOS 7中它非常简单.您只需要三个标准集合视图委托菜单处理方法,以及单元子类中的操作方法.没有必要与第一响应者或类似的东西一起玩.因此,例如(在此示例中,Copy是标准项目,但Capital是我添加到菜单中的内容):
// collection view delegate:
- (BOOL)collectionView:(UICollectionView *)collectionView
shouldShowMenuForItemAtIndexPath:(NSIndexPath *)indexPath {
UIMenuItem* mi = [[UIMenuItem alloc] initWithTitle:@"Capital"
action:NSSelectorFromString(@"capital:")];
[[UIMenuController sharedMenuController] setMenuItems:@[mi]];
return YES;
}
- (BOOL)collectionView:(UICollectionView *)collectionView
canPerformAction:(SEL)action
forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {
return (action == NSSelectorFromString(@"copy:") ||
action == NSSelectorFromString(@"capital:"));
}
- (void)collectionView:(UICollectionView *)collectionView
performAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath
withSender:(id)sender {
// in real life, would do something here
NSString* state = (self.sectionData)[indexPath.section][indexPath.row];
if (action == NSSelectorFromString(@"copy:"))
NSLog(@"copying %@", state);
else if (action == NSSelectorFromString(@"capital:"))
NSLog(@"fetching the capital of %@", state);
}
// cell subclass:
-(void)capital:(id)sender {
// find my collection view
UIView* v = self;
do {
v = v.superview;
} while (![v isKindOfClass:[UICollectionView class]]);
UICollectionView* cv = (UICollectionView*) v;
// ask it what index path we are
NSIndexPath* ip = [cv indexPathForCell:self];
// talk to its delegate
if (cv.delegate &&
[cv.delegate respondsToSelector:
@selector(collectionView:performAction:forItemAtIndexPath:withSender:)])
[cv.delegate collectionView:cv performAction:_cmd
forItemAtIndexPath:ip withSender:sender];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9047 次 |
| 最近记录: |