PDFViewController Controller State in Swift for iOS
Shows the default, empty, error, and locked states of the PDFViewController. Get additional resources by visiting our PSPDFViewController API guide.
//// Copyright © 2015-2025 PSPDFKit GmbH. All rights reserved.//// The Nutrient sample applications are licensed with a modified BSD license.// Please see License for details. This notice may not be removed from this file.//
import PSPDFKitimport PSPDFKitUI
private enum ControllerState: String { case normal case empty case error case locked
func nextState() -> ControllerState { switch self { case .normal: return .empty case .empty: return .error case .error: return .locked case .locked: return .normal } }}
// MARK: CustomStringConvertible
extension ControllerState: CustomStringConvertible {
var description: String { return "State: \(rawValue)" }}
class ControllerStateExample: Example {
// MARK: Properties
private weak var pdfController: PDFViewController? private var toggleButton: UIBarButtonItem!
private var displayState: ControllerState = .normal { didSet { guard let pdfController else { return } switch displayState { case .normal: pdfController.document = AssetLoader.document(for: .welcome) case .empty: pdfController.document = nil case .error: pdfController.document = Document(dataProviders: [DataContainerProvider(data: Data())]) case .locked: pdfController.document = AssetLoader.document(for: "Password-Protected.pdf") } toggleButton.title = String(describing: displayState) } }
override init() { super.init()
title = "Controller States" contentDescription = "Shows default, empty, error, and locked states." category = .controllerCustomization toggleButton = UIBarButtonItem(title: "", style: .plain, target: self, action: #selector(ControllerStateExample.toggleButtonPressed(_:))) }
@objc private func toggleButtonPressed(_ sender: UIBarButtonItem) { // If pressed, toggle to the next state. displayState = displayState.nextState() }
override func invoke(with delegate: ExampleRunnerDelegate) -> UIViewController { let items = [toggleButton!] let document = AssetLoader.document(for: .welcome)
pdfController = { let pdfController = PDFViewController(document: document) for viewMode: ViewMode in [.document, .documentEditor, .thumbnails] { pdfController.navigationItem.setRightBarButtonItems(items, for: viewMode, animated: false) } pdfController.barButtonItemsAlwaysEnabled = items return pdfController }()
// Set displayState to trigger toggleButton title change displayState = .normal
return pdfController! }}
This code sample is an example that illustrates how to use our SDK. Please adapt it to your specific use case.