UIMenuController/UIPasteboard(2) UITableView上实用剪贴板

在UITableView上实用剪贴板有两种方法:

一、在tableView的代理方法中直接有三个有关剪贴板的方法。

//某行是否允许show菜单
-(BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
//show菜单中能使用的功能
-(BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
{
if (action == @selector(cut:)){ return YES; } else if(action == @selector(copy:)){ return YES; } else if(action == @selector(paste:)){ return YES; } else if(action == @selector(select:)){ return NO; } else if(action == @selector(selectAll:)){ return YES; } else { return [super canPerformAction:action withSender:sender]; }
} //点击菜单中调用
-(void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
{ if (action ==@selector(copy:)) {
//to do ,然后刷新tableView } if (action ==@selector(cut:)) { } if (action ==@selector(paste:)) { } }

UIMenuController/UIPasteboard(2) UITableView上实用剪贴板

效果棒棒嗒。

二、自定义tableViewCell中的粘贴板

在tableViewCell中实现

-(BOOL) canPerformAction:(SEL)action withSender:(id)sender {
return (action == @selector(copy:) || action == @selector(test:));
} -(BOOL)canBecomeFirstResponder {
return YES;
} /// this methods will be called for the cell menu items
-(void) test: (id) sender { } -(void) copy:(id)sender { }

不过还有最重要的一步,激发copy菜单,有多种方式。

1.

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {

[[self delegate] performSelector:@selector(showMenu:)

withObject:self afterDelay:0.9f];

[super setHighlighted:highlighted animated:animated];

}

//delegate  中

- (void)showMenu:(id)cell {

if ([cell isHighlighted]) {

[cell becomeFirstResponder];

UIMenuController * menu = [UIMenuController sharedMenuController];

[menu setTargetRect: [cell frame] inView: [self view]];

[menu setMenuVisible: YES animated: YES];

}

}

2. 设置一个手势用来激发 ps:为了让菜单显示,目标视图必须在 responder 链中,很多 UIKit 视图默认并无法成为一个 responder ,因此你需要之类这些视图重载 canBecomeFirstResponder 方法范围 YES

在cell中加一个手势:和delegate原理是一样的。

// CGRect  popoverRect = [tableView convertRect:[tableView rectForRowAtIndexPath:indexPath] toView:[tableView superview]];

//
// FXCell.m
// FeixunUniversal
//
// Created by zpz on 15/10/11.
// Copyright (c) 2015年 zpz. All rights reserved.
// #import "FXCell.h" @implementation FXCell - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
[self addGestureRecognizer:longPressGesture];
self.userInteractionEnabled = YES;
self.backgroundColor = [UIColor yellowColor]; }
return self;
} //实现长按
- (void)longPress:(UILongPressGestureRecognizer *)longPress
{
if (longPress.state == UIGestureRecognizerStateBegan) {
[self becomeFirstResponder];
//自定义方法 系统方法在
UIMenuItem *flagItemA = [[UIMenuItem alloc] initWithTitle:@"A就是我" action:@selector(methodA:)];
UIMenuItem *flagItemB = [[UIMenuItem alloc] initWithTitle:@"我是方法B" action:@selector(methodB:)];
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuItems:@[flagItemA,flagItemB]];
[menu setTargetRect:self.frame inView:self.superview];
[menu setMenuVisible:YES animated:YES];
}
} //系统自带的方法 不实现canPerformAction: withSender:默认为return NO
/*
- (void)cut:(id)sender NS_AVAILABLE_IOS(3_0);
- (void)copy:(id)sender NS_AVAILABLE_IOS(3_0);
- (void)paste:(id)sender NS_AVAILABLE_IOS(3_0);
- (void)select:(id)sender NS_AVAILABLE_IOS(3_0);
- (void)selectAll:(id)sender NS_AVAILABLE_IOS(3_0);
- (void)delete:(id)sender NS_AVAILABLE_IOS(3_2);
- (void)makeTextWritingDirectionLeftToRight:(id)sender NS_AVAILABLE_IOS(5_0);
- (void)makeTextWritingDirectionRightToLeft:(id)sender NS_AVAILABLE_IOS(5_0);
- (void)toggleBoldface:(id)sender NS_AVAILABLE_IOS(6_0);
- (void)toggleItalics:(id)sender NS_AVAILABLE_IOS(6_0);
- (void)toggleUnderline:(id)sender NS_AVAILABLE_IOS(6_0); - (void)increaseSize:(id)sender NS_AVAILABLE_IOS(7_0);
- (void)decreaseSize:(id)sender NS_AVAILABLE_IOS(7_0);
*/
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
if (action == @selector(cut:)){
return NO;
}
else if(action == @selector(copy:)||action == @selector(paste:)){
return YES;
}else if(action == @selector(methodA:) || action == @selector(methodB:)){ return YES;
}
else{
return [super canPerformAction:action withSender:sender];
}
} - (BOOL)canBecomeFirstResponder
{
return YES;
} - (void)copy:(id)sender {
UIPasteboard *gpBoard = [UIPasteboard generalPasteboard]; NSString *theTile = self.textLabel.text; gpBoard.string = theTile; }
- (void)paste:(id)sender
{
[super paste:sender];
//从UIPasteboard 单例中读取内容 操作
// UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; } - (void)cut:(id)sender
{
[super cut:sender]; }
- (void)methodA:(id)sender
{
NSLog(@"我是A");
} - (void)methodB:(id)sender
{
NSLog(@"我是B");
} //- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
// [[self delegate] performSelector:@selector(showMenu:)
// withObject:self];
// [super setHighlighted:highlighted animated:animated];
//} - (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
} - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated]; // Configure the view for the selected state
} @end

效果图如下:

UIMenuController/UIPasteboard(2) UITableView上实用剪贴板

如需了解更多iOS 复制粘贴理论知识请移步我的另一篇文章:

http://www.cnblogs.com/zpz5789/p/4870798.html

上一篇:input 属性


下一篇:《PHP精粹:编写高效PHP代码》——1.5节public、private以及 protected