Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用swift在QLPreviewController中隐藏共享按钮?_Ios_Swift_Qlpreviewcontroller_Rightbarbuttonitem - Fatal编程技术网

Ios 如何使用swift在QLPreviewController中隐藏共享按钮?

Ios 如何使用swift在QLPreviewController中隐藏共享按钮?,ios,swift,qlpreviewcontroller,rightbarbuttonitem,Ios,Swift,Qlpreviewcontroller,Rightbarbuttonitem,我正在使用下面的代码使用QLPreviewcontroller在我的应用程序中显示一些文档 let ql = QLPreviewController() ql.dataSource = self //ql.navigationItem.rightBarButtonItems = nil ql.navigationItem.rightBarButtonItem = nil presentViewController(ql, animated: true, completion: nil) 我不希

我正在使用下面的代码使用QLPreviewcontroller在我的应用程序中显示一些文档

let ql = QLPreviewController()
ql.dataSource = self
//ql.navigationItem.rightBarButtonItems = nil
ql.navigationItem.rightBarButtonItem = nil
presentViewController(ql, animated: true, completion: nil)
我不希望共享按钮位于QLViewController的右上方。我曾尝试将
rightbarbuttonim
设置为零,但不起作用


我怎么能隐瞒呢?

我知道这是一个老问题,但我花了这么多时间寻找解决方案,并想出了一些可行的办法

所以,对于任何一个想和我一样的人来说。这是我的解决办法

代码在objective-c中,但它只是简单地转换成Swift

首先,我们创建QLPreviewController的子类,并在子类中重写以下方法

编辑

斯威夫特:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationItem.rightBarButtonItem = nil
    //For ipads the share button becomes a rightBarButtonItem
    self.navigationController?.toolbar?.isHidden = true
    //This hides the share item
    self.navigationController?.toolbar?.addObserver(self, forKeyPath: "hidden", options: NSKeyValueObservingOptionPrior, context: nil)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.toolbar?.removeObserver(self, forKeyPath: "hidden")
}

override func observeValue(forKeyPath keyPath: String, ofObject object: Any, change: [AnyHashable: Any], context: UnsafeMutableRawPointer) {
    var isToolBarHidden: Bool? = self.navigationController?.toolbar?.isHidden
    // If the ToolBar is not hidden
    if isToolBarHidden == nil {
        DispatchQueue.main.async(execute: {() -> Void in
            self.navigationController?.toolbar?.isHidden = true
        })
    }
}

self.navigationController?.pushViewController(qlPreviewController, animated: true)
目标C:

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.navigationItem.rightBarButtonItem = nil; //For ipads the share button becomes a rightBarButtonItem
    [[self.navigationController toolbar] setHidden:YES]; //This hides the share item
    [[self.navigationController toolbar] addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionPrior context:nil];
}
移除ViewWill上的观察者将消失

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[self.navigationController toolbar] removeObserver:self forKeyPath:@"hidden"];
}
观察者方法:必需,因为当您单击图像以隐藏导航栏和工具栏时,单击时共享按钮将再次可见

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

    BOOL isToolBarHidden = [self.navigationController toolbar].hidden;
    // If the ToolBar is not hidden
    if (!isToolBarHidden) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [[self.navigationController toolbar] setHidden:YES];
        });
    }
}
并且必须从现有的navigationController中推送PreviewController

[self.navigationController pushViewController:qlPreviewController animated:YES];

而且我们还必须使用子类而不是QLEVIEWCONTROLLER。

在iOS 10的Swift 3中,这些解决方案都不适用于我。问题是共享按钮是在ViewDidDisplay方法之后创建的

以下是我删除共享按钮的步骤:

1) 子类化我的QLPreviewController

[self.navigationController pushViewController:qlPreviewController animated:YES];
2) 创建了在此子类中打开我的文档的方法:

func show(controller: UIViewController, url: NSURL) {
    // Refreshing the view
    self.reloadData()
    // Printing the doc
    if let navController = controller.navigationController {
        navController.pushViewController(self, animated: true)
    }
    else {
        controller.show(self, sender: nil)
    }
}
3) 在我的ViewDidLayoutSubView中,我创建了一个虚拟按钮项来替换共享按钮:

 override func viewDidLayoutSubviews() {
    navigationItem.rightBarButtonItems?[0] = UIBarButtonItem()
}
4) 当我想在另一个VC中打开一个文档时,我这样称呼它:

 QLSubclass().show(controller: self, url: path as NSURL)
注意:总是这样调用它,而不是使用您实例化的全局变量,因为在它消失之前,您总是会看到share按钮。这对我很有用

   class QLSPreviewController : QLPreviewController {

        override func viewDidLoad() {
            super.viewDidLoad()



        }
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)

        }
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(true )
            //This hides the share item
            let add =  self.childViewControllers.first as! UINavigationController
            let layoutContainerView  = add.view.subviews[1] as! UINavigationBar
             layoutContainerView.subviews[2].subviews[1].isHidden = true

        }
    }

如果仍然有人想要删除共享选项或想要自定义
qlviewcontroller
的导航栏,那么他们可以尝试创建
UIViewController
并根据需要自定义它,然后创建
qlviewcontroller
对象并将其添加为子视图控制器

这将使你摆脱共享按钮,你自定义导航栏颜色等。这是我的工作

要了解如何添加子视图控制器,请参考

  • 创建
    qlviewcontroller

  • 向其中添加以下代码

  • Swift:

    var toolbars: [UIView] = []
    
    var observations : [NSKeyValueObservation] = []
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            navigationItem.setRightBarButton(UIBarButtonItem(), animated: false)
    
        }
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
    
            navigationController?.toolbar.isHidden = true
    
            if let navigationToobar = navigationController?.toolbar {
                let observation = navigationToobar.observe(\.isHidden) {[weak self] (changedToolBar, change) in
    
                    if self?.navigationController?.toolbar.isHidden == false {
                         self?.navigationController?.toolbar.isHidden = true
                    }
                }
                observations.append(observation)
            }
    
            toolbars = toolbarsInSubviews(forView: view)
    
            for toolbar in toolbars {
    
                toolbar.isHidden = true
    
                let observation = toolbar.observe(\.isHidden) { (changedToolBar, change) in
                    if let isHidden = change.newValue,
                        isHidden == false {
                        changedToolBar.isHidden = true
                    }
                }
    
                observations.append(observation)
            }
        }
    
        private func toolbarsInSubviews(forView view: UIView) -> [UIView] {
    
            var toolbars: [UIView] = []
    
            for subview in view.subviews {
                if subview is UIToolbar {
                    toolbars.append(subview)
                }
                toolbars.append(contentsOf: toolbarsInSubviews(forView: subview))
            }
            return toolbars
        }
    

    Swift 5解决方案:

    var toolbars: [UIView] = []
    
    var observations : [NSKeyValueObservation] = []
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            navigationItem.setRightBarButton(UIBarButtonItem(), animated: false)
    
        }
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
    
            navigationController?.toolbar.isHidden = true
    
            if let navigationToobar = navigationController?.toolbar {
                let observation = navigationToobar.observe(\.isHidden) {[weak self] (changedToolBar, change) in
    
                    if self?.navigationController?.toolbar.isHidden == false {
                         self?.navigationController?.toolbar.isHidden = true
                    }
                }
                observations.append(observation)
            }
    
            toolbars = toolbarsInSubviews(forView: view)
    
            for toolbar in toolbars {
    
                toolbar.isHidden = true
    
                let observation = toolbar.observe(\.isHidden) { (changedToolBar, change) in
                    if let isHidden = change.newValue,
                        isHidden == false {
                        changedToolBar.isHidden = true
                    }
                }
    
                observations.append(observation)
            }
        }
    
        private func toolbarsInSubviews(forView view: UIView) -> [UIView] {
    
            var toolbars: [UIView] = []
    
            for subview in view.subviews {
                if subview is UIToolbar {
                    toolbars.append(subview)
                }
                toolbars.append(contentsOf: toolbarsInSubviews(forView: subview))
            }
            return toolbars
        }
    
    子类QLPreviewController:

    final class CustomQLPreviewController: QLPreviewController {
        override func viewDidLoad() {
            super.viewDidLoad()
            navigationItem.rightBarButtonItem = UIBarButtonItem()
        }
    
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            (children[0] as? UINavigationController)?.setToolbarHidden(true, animated: false)
        }
    
        override func viewDidLayoutSubviews() {
            super.viewDidLayoutSubviews()
            (children[0] as? UINavigationController)?.setToolbarHidden(true, animated: false)
        }
    }
    
    然后在您想要的地方呈现此子类,如下所示:

    let previewController = QLVideoController()
    present(controller, animated: true, completion: nil)
    
    • 使用此方法,您可以使用“共享”按钮片刻


    也许这些能帮上忙:?对我好,对我好。你是否也找到了隐藏整个工具栏的方法?这只会隐藏共享图标。这里有一个帖子。删除工具栏,但“共享”按钮变为可见。检查它,如果你提出了一个解决方案,也请发布你的解决方案。这似乎只是ios 10中的一个问题,可能是一个将被修复的bug。在ios 11中,当用户点击导航栏时隐藏,当您再次点击时,它会显示为“共享”按钮!有什么解决方案吗?虽然这在iPad上非常有效。。iPhone上的“共享”按钮不在屏幕上,而是在底部。你知道怎么去掉吗?我试图删除工具栏按钮,但共享按钮仍然存在。另一个对我来说非常有效的解决方案是创建您自己的VC,并将QLPreviewController的视图作为子视图添加到其中,这样您就可以在ios 11中删除共享按钮:),当用户点击导航栏时隐藏,当再次点击时,它会显示为共享按钮!有什么解决办法吗?为什么要传递url?好像哪里都没用过!对于所有新的AR Quicklook,如何在iOS12.0中隐藏它?使用子视图索引引用视图对于前向兼容性是非常不鼓励的。我认为它们试图传达的是,如果您将
    RightBarButtonim
    分配给
    UIBarButtonim
    的新实例(无需任何进一步配置)这是一个很好的答案!不起作用。如果您应用此代码,QLVeviewController将在底部显示一个工具栏,与您刚从导航栏右上角删除的共享按钮相同。6s、iOS 13.5、
    子项[0]
    将崩溃,因此我将其更改为
    子项。首先
    ,但它似乎没有执行代码,并且工具栏显示不起作用,共享按钮仍然可见&如果您希望iOS13隐藏rightBarButtonItem,则需要在“override func viewDidLoad()”覆盖func viewWillLayoutSubviews(){super.viewWillLayoutSubviews()中添加此
    navigationItem.rightBarButtonItem=UIBarButtonItem()
    navigationController?.toolbar.isHidden=true navigationItem.rightBarButtonItem=nil}欢迎来到SO,感谢您的贡献!如果您在代码片段周围提供一些额外的上下文来解释它们的作用和/或它们如何回答问题,这通常会很有帮助。源代码或引用的链接也有助于那些试图使代码适应稍微不同的情况的人。这个答案是无效的。