iPhone UIDocumentInteractionController присутствуетOpenInMenuFromRect кнопка отмены не отвечает - PullRequest
2 голосов
/ 10 августа 2011

Я наблюдаю другое поведение, когда «presentOpenInMenuFromRect» выполняется в iPhone4 и iPad2 (оба работают в iOS 4.3.5). В iPad2 показан раскрывающийся список со всеми приложениями, которые могут открывать определенный файл, и он работает нормально; тем не менее, в iPhone4 также отображается раскрывающийся список (и он также работает нормально), но в конце раскрывающегося списка есть кнопка «Отмена», которая кажется неактивной.

В iPad2 эта проблема не возникает, потому что кнопка «Отмена» не появляется, появляется только раскрывающийся список, а когда я касаюсь другой области, отличной от раскрывающегося списка, этот список закрывается; что является желаемым поведением.

То, что я имею в виду, говоря, что кнопка «Отмена» в iPhone / iPhone4, кажется, неактивна, это: когда я касаюсь ее, тогда ничего не происходит! Что ж, если быть более точным, если я коснусь его несколько раз за короткий промежуток времени или времени, то кнопка «Отмена», скорее, чем раньше, откликнется (она меняет цвет с серого на синий), а затем выпадающий список. действительно закрыт; что является желаемым поведением.

Я использую «presentOpenInMenuFromRect» следующим образом: я реализовал кнопку «Сохранить», которая по умолчанию скрыта; однако в методе «- (void) webViewDidFinishLoad: (UIWebView *) webView» я обнаруживаю «расширение пути» URL-адреса, и если оно имеет расширение «.pdf», то я показываю кнопку «Сохранить»; то есть:

-  (void)webViewDidFinishLoad:(UIWebView *)webView
{
    if ([[[myWebViewOL.request.URL.absoluteString pathExtension] lowercaseString] isEqualToString:@"pdf"])
    {
        saveFile0L.hidden = NO;
    }
}

А «действие», связанное с кнопкой «сохранить» (saveFile0L), представляет собой следующий метод «saveFile»:

[saveFile0L addTarget:self action:@selector(saveFile) forControlEvents:UIControlEventTouchUpInside];

где "saveFile" имеет следующий код:

- (void) saveFile
{
    //Do not worry about "FileManager" is only a singleton class
    //which I have defined in order to implement some common methods
    //and one of them is "saveFile:(UIWebView*) withUIView:(UIView*)
    [[FileManager sharedInstance] saveFile:myWebView withUIView:self.view];
}

И "saveFile: (UIWebView *) myWebView withUIView: (UIView *) self.view" имеет следующий код:

- (void) saveFile:(UIWebView*)webView withUIView:(UIView*)view
{
    NSString* fileName  = [[NSFileManager defaultManager] displayNameAtPath:webView.request.URL.absoluteString];
    NSURL* fileurl = [NSURL URLWithString:webView.request.URL.absoluteString];
    NSData* data = [NSData dataWithContentsOfURL:fileurl];
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* docsDirectory = [paths objectAtIndex:0];
    NSString* filePath = [docsDirectory stringByAppendingPathComponent:fileName];
    [data writeToFile:filePath atomically:YES];
    NSURL* url = [NSURL fileURLWithPath:filePath];
    //UIDocInteractionController API gets the list of devices that support the file type
    docController = [UIDocumentInteractionController interactionControllerWithURL:url];
    [docController retain];
    //Note:[docController presentOpenInMenuFromRect:CGRectZero inView:view animated:YES]
    //presents a drop down list of the apps that support the file type,
    //clicking on an item in the list will open that app while passing in the file.
    //Note: [[UIApplication sharedApplication] canOpenURL:fileurl]
    //will return YES if there is an app that can handle the specific file
    BOOL isValid = ([[UIApplication sharedApplication] canOpenURL:fileurl] &&
                    [docController presentOpenInMenuFromRect:CGRectZero inView:view animated:YES]);
    if (!isValid)
    {
        [self showAlertSaveFileError:fileName];
    }
}

В настоящее время я не знаю, как правильно заставить работать кнопку «Отмена», которая появляется только в iPhone (не в iPad) в конце выпадающего списка.

Заранее спасибо,

Ответы [ 2 ]

8 голосов
/ 22 сентября 2011
BOOL isValid = ([[UIApplication sharedApplication] canOpenURL:fileurl] &&
                    [docController presentOpenInMenuFromRect:CGRectZero inView:view animated:YES]);

Попробуйте изменить view inView:view на inView:self.view.window.

0 голосов
/ 18 августа 2011

Это была моя вина; наконец-то я смог решить проблему.

Ошибка заключалась в том, чтобы использовать «self.view» и передавать его в качестве параметра для функции «presentOpenInMenuFromRect»

[docController presentOpenInMenuFromRect: CGRectZero inView: просмотр анимированный: ДА]

Однако этот «вид» (self.view) не был подходящим для обработки событий касания; эта ошибка может быть замечена благодаря следующему предупреждению, которое было показано в консоли Xcode:

2011-08-17 18:12:56.389 MyApplication[287:707] Presenting action sheet clipped by its superview. Some controls might not respond to touches. On iPhone try -[UIActionSheet showFromTabBar:] or -[UIActionSheet showFromToolbar:] instead of -[UIActionSheet showInView:].

Это сообщение дало мне подсказку, и я изменил код следующим образом:

Новый и правильный код:

- (void) saveFile:(UIWebView*)webView
{
    NSString* fileName  = [[NSFileManager defaultManager]  displayNameAtPath:webView.request.URL.absoluteString];
    #if DEBUG
    NSLog(@"<%p %@: %s line:%d> File name:%@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __PRETTY_FUNCTION__, __LINE__, fileName);
    #endif
    NSURL* fileurl = [NSURL URLWithString:webView.request.URL.absoluteString];
    NSData* data = [NSData dataWithContentsOfURL:fileurl];
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* docsDirectory = [paths objectAtIndex:0];
    NSString* filePath = [docsDirectory stringByAppendingPathComponent:fileName];
    [data writeToFile:filePath atomically:YES];
    NSURL* url = [NSURL fileURLWithPath:filePath];
    //UIDocInteractionController API gets the list of devices that support the file type
    docController = [UIDocumentInteractionController interactionControllerWithURL:url];
    [docController retain]; //Very important, if "retain" is not called, the application crashes
    //Present a drop down list of the apps that support the file type,
    //clicking on an item in the list will open that app while passing in the file.
    BOOL isValid = [docController presentOpenInMenuFromRect:CGRectZero inView:webView animated:YES]; //Using "webView" instead of "self.view"
    if (!isValid)
    {
        [self showAlertSaveFileError:fileName]; //Shows an alert message
    }
}

То есть, передавая метод "presentOpenInMenuFromRect: inView: animated:" представление "webView" (которое является UIWebView) вместо "self.view".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...