2009-12-07 30 views
7

Cụ thể, nó hoạt động không nhất quán về trọng tâm trường văn bản.LSUIElement hoạt động không nhất quán với activationIgnoringOtherApps

Tôi có một LSUIElement bật lên trình đơn trạng thái. Trong menu đó có một khung nhìn có chứa một trường văn bản. Trường văn bản cần phải được chọn - không nhất thiết được chọn theo mặc định, nhưng tùy theo điều kiện nào.

Khi mục trạng thái được nhấn vào, nó gây nên

[NSApp activateIgnoringOtherApps:YES]; 

Và nó hoạt động, khoảng một nửa thời gian. * Nửa còn lại menu trạng thái dường như để xem xét bản thân "trong nền" và sẽ không cho phép tôi đặt trọng tâm vào trường văn bản ngay cả khi nhấp vào nó. (Tôi biết trình kích hoạt nhấp chuột trạng thái đang kích hoạt b/c có NSLog trên đó.)

Đây có phải là lỗi trong cách Apple xử lý các mục trạng thái này hay tôi xử lý sai kích hoạtIgnoringOtherApps?

* Thực ra, dường như nó không chỉ là lần đầu tiên sau khi một ứng dụng khác được kích hoạt. Sau đó nó hoạt động tốt.

Đoạn hoàn chỉnh:

-(void)statusItemClicked:(id)sender { 
    //show the popup menu associated with the status item. 
    [statusItem popUpStatusItemMenu:statusMenu]; 

    //activate *after* showing the popup menu to obtain focus for the text field. 
    [NSApp activateIgnoringOtherApps:YES]; 

} 

Trả lời

0

tôi biết từ kinh nghiệm mà bạn phải gọi activateIgnoringOtherApps:sau bạn đã hiện lên menu chứa lĩnh vực văn bản của bạn. Vì vậy, bạn sẽ cần phải làm điều đó theo thứ tự này:

- (void)statusItemClicked:sender { 
    [statusItem popUpStatusItemMenu:theMenu]; 
    [NSApp activateIgnoringOtherApps:YES]; // FYI, NSApp is shorthand for [NSApplication sharedApplication] 
} 

Dựa trên những gì bạn đã nói, có vẻ như ứng dụng của bạn được kích hoạt quá muộn, vì vậy mà nó không nhận được kích hoạt lần đầu tiên bạn click vào mục , nhưng nó đã được kích hoạt trên các lần nhấp tiếp theo.

+0

Chắc chắn kích hoạt quá muộn, nhưng mã đã được cấu trúc như bạn đề xuất. Nó gần như có vẻ như phương pháp kích hoạt không nhận được gọi là cho đến khi trình đơn trạng thái đã được miễn nhiệm (NSLog thử nghiệm dường như chịu điều này). Tôi không hiểu tại sao điều đó lại xảy ra. – iconmaster

+0

Vì vậy, 'activateIgnoringOtherApps:' được gọi ngay sau 'popUpStatusItemMenu:', hay phương thức đó không trả lại cho đến khi menu bị loại bỏ? Bạn có thể thử thiết lập một điểm ngắt và chạy qua trình gỡ rối để xem điều gì xảy ra. – Alex

+0

Yup, sử dụng điểm ngắt nó chắc chắn chỉ được gọi sau khi menu bị loại bỏ. Thêm mã của tôi vào bài đăng đầu tiên, mặc dù nó trông gần giống như đề xuất của bạn. – iconmaster

2

Cuối cùng đã đưa ra giải pháp cho việc này.

Thay vì popping menu trong handler nhấp chuột của bạn, kích hoạt các ứng dụng sau đó sắp xếp một NSTimer không có sự chậm trễ đó bật menu:

-(void)pop:(NSTimer *)timer { 
    [statusItem popUpStatusItemMenu:theMenu]; 
} 

-(void)statusItemClicked:sender { 
    [NSApp activateIgnoringOtherApps:YES]; 
    [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(pop:) userInfo:nil repeats:NO]; 
} 

pop: được gọi vào khung tiếp theo nên sự trì hoãn là không thể nhận thấy nhưng dài đủ cho activateIgnoringOtherApps: để làm bất cứ điều gì ngăn nó hoạt động như mong đợi khi bật menu trong cùng một khung.

Các vấn đề liên quan