Есть ли простой способ реализовать меню копирования при нажатии на ячейку вместо создания подкласса UITableViewCell?
Благодарность,
RL
Есть ли простой способ реализовать меню копирования при нажатии на ячейку вместо создания подкласса UITableViewCell?
Благодарность,
RL
Да!
Вызов [[UIMenuController sharedMenuController] setMenuVisible:YES animated:ani]
(где ani
– это BOOL
, определяющий, следует ли анимировать контроллер) из - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
(метод делегата UITableView)
Редактировать: команда «копировать» на UIMenuController
по умолчанию не копирует текст detailTextLabel.text
. Однако есть обходной путь. Добавьте следующий код в свой класс.
-(void)copy:(id)sender {
[[UIPasteboard generalPasteboard] setString:detailTextLabel.text];
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if(action == @selector(copy:)) {
return YES;
}
else {
return [super canPerformAction:action withSender:sender];
}
}
tableView:didSelectRowAtIndexPath
, то UIMenuController
появится, когда вы выберете строку обычным способом (я так понимаю, это то, что вы хотите)
- person joshim5; 06.08.2011
В iOS 5 простым способом является реализация методов UITableViewDelegate:
- (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath
- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
Реализуя 3 делегата, он позволит вам вызывать UIMenuController после долгого нажатия. Пример вроде:
/**
allow UIMenuController to display menu
*/
- (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
/**
allow only action copy
*/
- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
{
return action == @selector(copy:);
}
/**
if copy action selected, set as cell detail text
*/
- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
{
if (action == @selector(copy:))
{
UITableViewCell* cell = [tableView cellForIndexPath:indexPath];
[[UIPasteboard generalPasteboard] setString:cell.detailTextLabel.text];
}
}