Search code examples
iosswiftuisplitviewcontroller

Is this a bug or am I missing something? (Casting UISplitViewController)


class DocumentNavigationController: UINavigationController {
    public var documentSplitViewController: DocumentSplitViewController? {
        return splitViewController as? DocumentSplitViewController
    }
}

Accessing it in a subclass that also implements UISplitViewControllerDelegate.

func primaryViewController(forExpanding splitViewController: UISplitViewController) -> UIViewController? {
    ...
    print("Before:  Split- \(splitViewController) DocSplit- \(documentSplitViewController)")
    if let docSplit = splitViewController as? DocumentSplitViewController {
        print("Cast successful")
    } else { print("Cast failed")}
    print("After:  Split- \(splitViewController) DocSplit- \(documentSplitViewController)")
    ...
}

Output:

Before:  Split- <PDF_Express.DocumentSplitViewController: 0x7fcf9050fc60> DocSplit- nil

Cast successful

After:  Split- <PDF_Express.DocumentSplitViewController: 0x7fcf9050fc60> DocSplit- nil

My expected results would be that DocSplit is not nil in the print statements. I don't understand why the function is not properly casting, but my local optional binding is.


Solution

  • In primaryViewController the splitViewController referred to is the one passed into the method where as the documentSplitViewController refers to the property of the class. I would guess they are not actually the same thing.