Программирование iOS: предварительный просмотр документа, изменение кнопки «Готово» - PullRequest
0 голосов
/ 02 мая 2011

Я использую класс UIDocumentInteractionController для предварительного просмотра документов.Можно ли заменить готовую кнопку закрытия предварительного просмотра другой?Например, я хотел бы установить другое название: «Закрыть» вместо «Готово».

Ответы [ 2 ]

2 голосов
/ 29 августа 2018

Я использовал QLPreviewController вместо UIDocumentInteractionController и смог изменить кнопку «Готово» (QLPreviewController также вызывается UIDocumentInteractionController).После представления QLPreviewController я нашел его контроллер навигации в качестве дочернего контроллера представления с индексом 0, а затем заменил элемент левой кнопки.Укажите ваш URL для QLPreviewController, используя делегат источника данных.

См. Также эту ссылку

В моем viewcontroller.h:

#import <UIKit/UIKit.h>
#import <QuickLook/QuickLook.h>

@interface MyViewController : UIViewController<QLPreviewControllerDataSource>
{    
    // Video preview
    QLPreviewController *_qlPreviewController;
    NSURL *_currentUrl;
}

В моем viewcontroller.m:

#import "MyViewController.h"

@implementation MyViewController

/*
    ........
*/

-(void)showDocument
{
    _currentUrl = [NSURL fileURLWithPath:@"path to your document here"];
    _qlPreviewController = [[QLPreviewController alloc] init];
    _qlPreviewController.dataSource = self;
    [self presentViewController:_qlPreviewController animated:true completion:^(void){
        if ([self->_qlPreviewController.childViewControllers count] > 0) {
            UINavigationController *nav = (UINavigationController*) self->_qlPreviewController.childViewControllers[0];
            UIBarButtonItem *origDoneButton = nav.navigationBar.items[0].leftBarButtonItem;
            nav.navigationBar.items[0].leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"MyTitle" style:UIBarButtonItemStyleDone target:origDoneButton.target action:origDoneButton.action];
        }
    }];

}


#pragma mark - QLPreviewControllerDatasource

-(NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller {
    return 1;
}

-(id<QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index {
    return _currentUrl;
}


@end
2 голосов
/ 24 января 2013

Изменение кнопки «Готово» с помощью кнопки «Готово» Пример:

Я прочитал, что вы можете получить элемент навигации из lastObject и изменить левую или правую кнопки.

НаДля изменения кнопки «Готово» необходимо дождаться завершения отображения представления контроллера UIDocumentInteractionController.К сожалению, нет способа узнать это, но есть:

  • (void) documentInteractionControllerWillBeginPreview: (UIDocumentInteractionController *) controller

это сообщит вам, когда оно начнется.1013 *

Что я делаю: добавьте таймер и, когда контроллер будет готов, затем получите кнопку элемента панели навигации и замените ее новой.

1) в .h добавьте этот делегат и таймер

.. UIViewController <UIDocumentInteractionControllerDelegate>
@property (nonatomic, strong) NSTimer *timer;

2) в .m

#import "UIView+BK.h"

- (void)documentInteractionControllerWillBeginPreview:(UIDocumentInteractionController *)controller{
        //Start timer
        _timer = [NSTimer scheduledTimerWithTimeInterval:.05
                                                  target:self
                                                selector:@selector(checkNavigationBar)
                                                userInfo:_timer
                                                 repeats:YES]; //YES TO CYCLE
    }

- (void) checkNavigationBar
    {
        //get the last view open (the UIDocumentInteractionController View)
        UIView *lastWindow = [[[[UIApplication sharedApplication] keyWindow ] subviews] lastObject];

        //Find the controller the view belongs too. 
        UIViewController *controller = [lastWindow findViewController];

        if (controller) {
            //find navigation bar using a category
            UINavigationBar *bar = [controller.view navigationBarFromView];

            //get the navigationItem
            UINavigationItem *item = bar.topItem;

            //get the done button
            UIBarButtonItem *doneButton = item.leftBarButtonItem ;

            //Creates the new button
            UIBarButtonItem *newDoneButton = [[UIBarButtonItem alloc ]
                                            initWithTitle:@"Finished"
                                            style:UIBarButtonItemStylePlain
                                            target:doneButton.target
                                            action:doneButton.action];

            //change done button
            item.leftBarButtonItem = newDoneButton;

            //Stop timer
            [_timer invalidate];
            _timer = nil;
        }
    }

3) вам нужна эта категория

категория заголовка:

import

@interface UIView (BK)

- (UIViewController *)findViewController;

- (UINavigationBar *)navigationBarFromView;
@end

категория реализации:

#import "UIView+BK.h"

@implementation UIView (BK)
- (UIViewController *)findViewController {
    Class vcc = [UIViewController class];    // Called here to avoid calling it iteratively unnecessarily.
    UIResponder *responder = self;
    while ((responder = [responder nextResponder])) if ([responder isKindOfClass: vcc]) return (UIViewController *)responder;
    return nil;
}

- (UINavigationBar *)navigationBarFromView {

    for (UIView *subview in self.subviews) {
        if ([subview isKindOfClass:[UINavigationBar  class]]) {
            return (UINavigationBar *)subview;
        }

        UIView *result = [subview navigationBarFromView];
        if (result) {
            return (UINavigationBar *)result;
        }

    }
    return nil;
}
@end
...