Я признаю, что здесь, на SO, уже есть вопрос именно такого рода, но ему не хватает деталей реализации, рабочего ответа, и я хотел бы быть более конкретным, поэтому я думаю, что новый вопрос в порядке. Очевидно, дайте мне знать, если я ошибаюсь, и мы можем попытаться перезапустить ветка там.
По сути, я хочу скопировать текст в UILabel на монтажный стол, когда пользователь удерживает метку. Не сложно, честное слово. Тем не менее, я думаю, что лучший способ обеспечить визуальную обратную связь — предложить пользователю пункт меню «Копировать» из UIMenuController
.
Согласно разделу «Обработка событий» Руководства по программированию приложений для iPhone, в частности разделу Операции копирования, вырезания и вставки должна быть предусмотрена возможность выполнения операций копирования, вырезания и/или вставки из пользовательский вид.
Итак, я создал подкласс UILabel со следующей реализацией, как описано в руководстве, но UIMenuController не появится. В руководстве нет указаний на то, что для этого требуется что-то еще, и оператор NSLog действительно выводит на консоль, указывая, что селектор выполняется, когда я удерживаю метку:
//
// CopyLabel.m
// HoldEm
//
// Created by Billy Gray on 1/20/10.
// Copyright 2010 Zetetic LLC. All rights reserved.
//
#import "CopyLabel.h"
@implementation CopyLabel
- (void)showCopyMenu {
NSLog(@"I'm tryin' Ringo, I'm tryin' reeeeal hard.");
// bring up editing menu.
UIMenuController *theMenu = [UIMenuController sharedMenuController];
// do i even need to show a selection? There's really no point for my implementation...
// doing it any way to see if it helps the "not showing up" problem...
CGRect selectionRect = [self frame];
[theMenu setTargetRect:selectionRect inView:self];
[theMenu setMenuVisible:YES animated:YES]; // <-- doesn't show up...
}
// obviously, important to provide this, but whether it's here or not doesn't seem
// to change the fact that the UIMenuController view is not showing up
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
BOOL answer = NO;
if (action == @selector(copy:))
answer = YES;
return answer;
}
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self performSelector:@selector(showCopyMenu) withObject:nil afterDelay:0.8f];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showCopyMenu) object:nil];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showCopyMenu) object:nil];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showCopyMenu) object:nil];
}
@end
Итак, что еще нужно сделать, чтобы это произошло?
Для тех, кто следит за вами и пытается сделать то же самое, вам также потребуется установить для ярлыка "Взаимодействие с пользователем включено"
Редактировать:
Для ясности позвольте мне добавить, что это должно быть похоже на маленький пункт меню [Копировать], который появляется поверх изображения в некоторых представлениях iPhone, когда вы удерживаете его. -Б