Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I add a custom UIMenuItem to the UIMenuController in a UITextView?

I'm trying to add a menu item next to the "copy", "paste" items in a UITextView. I've created a subclass of UITextView and copied the example from apple's docs here:

http://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/Text/Text.html#//apple_ref/doc/uid/TP40009370-CH8-SW28

I simply created a UiTextView in IB and set its class to my CustomTextView class. Unfortunately this didn't work. Although, if I set my CustomTextView to a subclass of UIView, it works great. Any help here?

I've also made a very simple example project of my situation here:

apps.popsweet.com/TextViewTrial.zip

like image 718
Kyle Zaragoza Avatar asked Jul 16 '10 17:07

Kyle Zaragoza


1 Answers

So I ended up using the following with results that I wanted, I placed the following block in the viewDidLoad method of my view controller as Alex hinted to:

- (void)viewDidLoad {
    [super viewDidLoad];

    UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Change Color" action:@selector(changeColor:)];
    [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:menuItem]];
    [menuItem release]; 
}

Then I added the following to the view controller to show the item conditionally when text is selected within the UITextView which I named "textView":

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    if (action == @selector(changeColor:)) {
        if (textView.selectedRange.length > 0) {
            return YES;
        }
    }
    return NO;
}

I chose to place the canPerformAction:withSender: method in the view controller instead of a custom UITextView class because this way the other options (e.g. copy, cut, paste, etc.) behave as they normally would since the method is called on every object up the responder chain.

like image 157
Kyle Zaragoza Avatar answered Sep 18 '22 13:09

Kyle Zaragoza