Я признаю, что здесь, на S.O., уже есть вопрос именно в этом направлении, но в нем отсутствуют детали реализации, рабочий ответ, и я хотел бы быть более конкретным, поэтому я думаю, что новый вопрос в порядке. Очевидно, дайте мне знать, если я ошибаюсь, и мы можем попытаться перезапустить поток там .
По сути, я хочу скопировать текст в 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
Итак, что еще нужно сделать, чтобы это произошло?
Для тех, кто следит и пытается сделать это, вам также необходимо установить «Взаимодействие с пользователем включено» для метки
Edit:
Для ясности позвольте мне добавить, что это должно быть похоже на маленький пункт меню [Копировать], который появляется над изображением в некоторых видах экрана iPhone, когда вы удерживаете его нажатым. -B