ฉันจะเพิ่ม UIMenuItem ที่กำหนดเองให้กับ UIMenuController ใน UITextView ได้อย่างไร

ฉันกำลังพยายามเพิ่มรายการเมนูถัดจากรายการ "คัดลอก", "วาง" ใน UITextView ฉันได้สร้างคลาสย่อยของ UITextView และคัดลอกตัวอย่างจากเอกสารของ Apple ที่นี่:

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

ฉันเพิ่งสร้าง UiTextView ใน IB และตั้งค่าคลาสเป็นคลาส CustomTextView ของฉัน น่าเสียดายที่สิ่งนี้ใช้งานไม่ได้ แม้ว่าถ้าฉันตั้งค่า CustomTextView เป็นคลาสย่อยของ UIView มันก็ใช้งานได้ดี ความช่วยเหลือใด ๆ ที่นี่?

ฉันยังได้จัดทำโครงการตัวอย่างง่ายๆ สำหรับสถานการณ์ของฉันที่นี่:

apps.popsweet.com/TextViewTrial.zip


person Kyle Zaragoza    schedule 16.07.2010    source แหล่งที่มา


คำตอบ (2)


ดังนั้นฉันจึงใช้สิ่งต่อไปนี้กับผลลัพธ์ที่ฉันต้องการ ฉันวางบล็อกต่อไปนี้ไว้ในเมธอด viewDidLoad ของตัวควบคุมมุมมองของฉันตามที่ Alex บอกเป็นนัย:

- (void)viewDidLoad {
    [super viewDidLoad];

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

จากนั้นฉันได้เพิ่มสิ่งต่อไปนี้ลงในตัวควบคุมมุมมองเพื่อแสดงรายการตามเงื่อนไขเมื่อเลือกข้อความภายใน UITextView ซึ่งฉันตั้งชื่อว่า "textView":

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

ฉันเลือกที่จะวางเมธอด canPerformAction:withSender: ในตัวควบคุมมุมมองแทนที่จะเป็นคลาส UITextView ที่กำหนดเอง เนื่องจากวิธีนี้ทำให้ตัวเลือกอื่นๆ (เช่น คัดลอก ตัด วาง ฯลฯ) ทำงานตามปกติเนื่องจากมีการเรียกใช้เมธอดนี้ในทุกอ็อบเจ็กต์ ขึ้นห่วงโซ่การตอบสนอง

person Kyle Zaragoza    schedule 20.07.2010
comment
+1 อย่างไรก็ตาม เมื่อฉันทำเช่นนี้ เมธอด changeColor ชี้ไปที่คลาส TableViewCell ที่กำหนดเองของฉัน และขัดข้องเนื่องจากไม่มีอยู่จริง ฉันสามารถชี้สิ่งนี้ไปที่ตัวควบคุมมุมมองได้หรือไม่ - person ingh.am; 08.11.2010
comment
คุณอาจต้องตรวจสอบให้แน่ใจว่า UIWindow เป็นหน้าต่างหลัก และเพื่อใช้วิธีนี้: - (BOOL)canBecomeFirstResponder { return YES; } - person Paul Solt; 28.11.2012

ฉันสามารถสร้างรายการเมนูแบบกำหนดเองที่ปรากฏอยู่เสมอในเมนูป๊อปอัปเท่านั้น โดยทำดังต่อไปนี้:

- (void) setUpCustomMenu {
Class cls1 = NSClassFromString(@"UIMenuController");
Class cls2 = NSClassFromString(@"UIMenuItem");
if (cls1 && cls2)
    if ([UIMenuController instancesRespondToSelector:@selector(setMenuItems:)]) {
            UIMenuItem* item1 = [[UIMenuItem alloc] initWithTitle:@"My Menu Item" action:@selector(myMenuAction:)];
            [UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObjects:item1, nil];;
            [item1 release];
    }
}

สิ่งนี้เรียกว่าใน viewDidLoad ของตัวควบคุมมุมมอง

ฉันยังคงดิ้นรนเพื่อให้แสดงรายการเมนูของฉันตามเงื่อนไขเท่านั้น (เช่น ถ้ามีบางอย่างที่เลือกไว้) โดยการสกัดกั้นเหตุการณ์ที่เรียกตัวควบคุมเมนูขึ้นมา จนถึงตอนนี้ฉันไม่สามารถทำเช่นนี้ได้

person Alex    schedule 19.07.2010