UIWebView and define dictionary

寵の児 提交于 2019-12-21 03:42:12

问题


I had the copy and define option built in with the UIWebView. It worked just fine on the iPad but on the iPhone, it only works once when I highlight the text and use the dictionary and the second time I tried it, it doesn't show up the popover. Any idea?

UPDATE: I am getting the following error as well when dismissing the dictionary on the iPhone: Unbalanced calls to begin/end appearance transitions for UIFallbackPresentationViewController

UPDATE: When I present a UIAlertView and cancel's it the dictionary works again. Wonder why?


回答1:


At the moment there are 52 other questions on stackoverflow mentioning this error..

From reading a few i think the code apple is using is calling presentModalViewController: before the actual dictionary view is fully loaded.

I think this is just a bug which apple has to solve, Rudolf Adamkovic's sample made it clear:

  • Create "Single View Application"
  • Add UITextView
  • Run it
  • Select a word in the text view
  • Choose Define

  • Debug console tell's you something like this:

    Unbalanced calls to begin/end appearance transitions for 
    <_UIFallbackPresentationViewController: 0x74c1660>
    

I filed the bug at: https://bugreport.apple.com

Sample code: https://github.com/tiemevanveen/DefineBugDemoProject




回答2:


Without seeing your code it is going to be really hard to give an answer to this question. It would be much easier if you would show your logic.

That being said, here are a couple of tips that might help:

  1. Make sure you are calling all appropriate super methods in your class. For example, if you override viewDidAppear:animated or viewDidLoad, make sure you call the super methods.
  2. Checkout this thread...maybe you are doing some sort of animation in an inappropriate place?



回答3:


I am able to reproduce the error (shows up in console), but for me the popover works every time. So I wouldn't worry about it since it doesn't seem to be causing any crashes.

The only "work around" is to disable/replace the "Define" menu item. But the only way to do that is by writing a category for a private class (which is forbidden):

@interface UIWebBrowserView : UIView

@end

@interface UIWebBrowserView (Add)


@end

@implementation UIWebBrowserView (Add)
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if(action == @selector(_define:))
        return NO;
    return [super canPerformAction:action withSender:sender];
}
@end

There are more "clever" ways of doing this without writing a category (method swizzling), but they are more dangerous.

If it's working I would just leave it alone. I have ARC enabled, so I'm not sure if that makes a difference.




回答4:


All credit for this solution goes to @acue. Please see here.

Now, here's how I solved it. Printed [UIApplication sharedApplication].keyWindow after the dictionary had been presented to find out which subview was being given focus.

In that subview, registered for UIWindowDidBecomeKeyNotification

And. when the notification got posted, called the following method :-

- (void) makeKeyWindow {
  AppDelegate * appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
  [appDelegate.window makeKeyAndVisible];
}

Even though, I still see the error, the UIMenu & the Dictionary both continue to work as expected.



来源:https://stackoverflow.com/questions/8751680/uiwebview-and-define-dictionary

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!