Программирование iOS: предварительный просмотр документа, изменение кнопки "Готово"
Я использую UIDocumentInteractionController
класс для предварительного просмотра документов. Можно ли заменить готовую кнопку для закрытия предварительного просмотра другой? Например, я хотел бы установить другое название: "Закрыть" вместо "Готово".
2 ответа
Замена кнопки "Готово" кнопкой "Готово" Пример:
Я прочитал, что вы можете получить элемент навигации из lastObject и изменить левую или правую кнопки.
Чтобы изменить кнопку "Готово", необходимо дождаться завершения отображения представления контроллера UIDocumentInteractionController. К сожалению, нет способа узнать это, но есть:
- (void) documentInteractionControllerWillBeginPreview: (UIDocumentInteractionController *) контроллер
это скажет вам, когда это начнется.
Что я делаю: добавить таймер и когда контроллер будет готов, а затем получить кнопку элемента панели навигации и заменить его на новый.
1) в.h добавить этот делегат и таймер
.. UIViewController <UIDocumentInteractionControllerDelegate>
@property (nonatomic, strong) NSTimer *timer;
2) в.м
#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) вам нужна эта категория
категория заголовка:
Импортировать
@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
Я использовал 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