Это о том, сколько безопасности типов Вы хотите наложить.
, Когда Вы пишете (bar) foo
(который эквивалентен reinterpret_cast<bar> foo
, если Вы не обеспечили оператор преобразования типов) Вы говорите компилятору игнорировать безопасность типов, и просто делать, как это сказано.
, Когда Вы пишете static_cast<bar> foo
, Вы просите, чтобы компилятор, по крайней мере, проверил, что преобразование типов имеет смысл и, для целочисленных типов, вставлять некоторый код преобразования.
РЕДАКТИРОВАНИЕ 26.02.2014
я записал этот ответ больше чем 5 лет назад, и я понял его превратно. (См. комментарии.), Но это все еще получает upvotes!
// MyView.h
@interface MyView : UIView {
IBOutlet UITextField * textField_;
}
@end
// MyView.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"show menu");
[textField_ becomeFirstResponder];
// [self.window becomeFirstResponder];
UIMenuController * menu = [UIMenuController sharedMenuController];
[menu setTargetRect: CGRectMake(0, 0, 100, 10) inView: self];
[menu setMenuVisible: YES animated: YES];
NSLog(@"menu width %f, visible %d", menu.menuFrame.size.width, menu.menuVisible);
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
return YES;
}
Вам нужно добавить больше кода в canPerformAction: withSender: - он должен проверить монтажный стол и состояние вашего выбора. Руководство Apple по программированию приложений для iPhone содержит несколько фрагментов кода.
Разве вам не нужно добавлять меню UIMenuController *
в главное или дополнительное представление, например self.view
?
Я думаю, это что-то вроде [self.view addSubView: menu.view];
Или мне не хватает сути вашего вопроса. Вы также можете установить рамку просмотра меню.
UIMenuController не имеет представления. Я только что поискал код из руководства по программированию приложений iPhone Apple: Обработка событий :
Листинг 3-4 Отображение меню редактирования
- (void) touchesEnded: (NSSet *) касается withEvent: (UIEvent *)событие { UITouch * theTouch = [касается любого объекта]; if ([theTouch tapCount] == 2 && [self статьFirstResponder]) { // код управления выбором идет сюда ... // вызываем меню редактирования. UIMenuController * theMenu = [UIMenuController sharedMenuController]; CGRect selectionRect = CGRectMake (currentSelection.x, currentSelection.y, SIDE, SIDE); [theMenu setTargetRect: selectionRect inView: self]; [theMenu setMenuVisible: ДА, анимация: ДА]; } }
Если вы реализуете настраиваемое представление, и это представление должно быть ответчиком (в отличие от некоторых другое представление, например UITextField), вам нужно переопределить функцию canBecomeFirstResponder в вашем представлении и вернуть YES:
- (BOOL)canBecomeFirstResponder {
return YES;
}
тогда, когда вы открываете меню, вы должны сделать что-то вроде следующего:
- (void)myMenuFunc {
if (![self becomeFirstResponder]) {
NSLog(@"couldn't become first responder");
return;
}
UIMenuController *theMenu = [UIMenuController sharedMenuController];
CGRect selectionRect = CGRectMake(0, 0, 0, 0);
[theMenu setTargetRect:selectionRect inView:self];
[theMenu setMenuVisible:YES animated:YES];
}
для отображения UIMenuController необходимо добавить следующее
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(cut:))
return NO;
else if (action == @selector(copy:))
return YES;
else if (action == @selector(paste:))
return NO;
else if (action == @selector(select:) || action == @selector(selectAll:))
return NO;
else
return [super canPerformAction:action withSender:sender];
}