2017-11-18 2 views
1

Hintergrund:Zugang UIViewController von Utility-Klasse

Ich versuche, meinen Code für die Wiederverwendung zu organisieren. Ich möchte eine Utility-Klasse behalten, die alle meine Logik zum Anklicken von Schaltflächen auf Android verarbeitet, und ich versuche, etwas ähnliches mit iOS zu tun.

Ich habe eine Datei namens ButtonClicks mit einer statischen Methode ClickAction.

Von einer benutzerdefinierten UIButton, die ich erweitert, um einige Daten hinzuzufügen, verwende ich die #selector innerhalb der UIViewController.

Inside View Controller:

button.addTarget(self, action: #selector(onClick(sender:)), for: .touchUpInside) 

// ...

@objc func onClick(sender: Button){ 
    ButtonClicks.ClickAction(Button: sender) 
} 

Das funktioniert ziemlich viel wie erwartet, mit Ausnahme neuer UIViewControllers des Übergangs, wenn nötig.

Frage:

Wie kann ich eine neue modale UIViewController von einer Utility-Klasse öffnen?

ich zur Zeit eine Ansicht Objekt übergeben, so habe ich versucht, die folgenden in der ButtonClicks Klasse:

Class ButtonClicks { 

static func ClickAction(Button: Button) { 

... 
// logic for sorting out which action to take 
... 

     let modalViewController = ModalViewController() 
     modalViewController.modalPresentationStyle = UIModalPresentationStyle.formSheet 
     modalViewController.modalTransitionStyle = UIModalTransitionStyle.coverVertical 

     Button.superview?.window?.rootViewController?.present(modalViewController, animated: true, completion: nil) 

Dieser Code startet einen View-Controller, der den gesamten Bildschirm in schwarz deckt, die .formSheet Parameter ignoriert und Verlassen der App auf einem schwarzen Bildschirm. Es tut print() Logik von der ModalViewController zum Debug-Bereich obwohl.

Ändern der presentationtyle zu .partialCurl gibt diesen Fehler:

Application tried to present UIModalTransitionStylePartialCurl to or from non-fullscreen view controller

+0

was über Ihren aktuellen View-Controller in die Funktion, so dass es vorbei Kann zum Präsentieren verwendet werden? – hakkurishian

+0

so übergeben (Button: Button, UIViiewController: View) oder etwas zur Funktion? Ich werde es versuchen. Haben UI-Komponenten keinen Verweis auf ihre View-Controller? – SQLiteNoob

+0

UIViews behalten diesen Verweis nicht (und sollten ihn nicht behalten), da sie kontextunabhängig sein sollen. Siehe https://stackoverflow.com/questions/1372977/given-a-view-how-do-i-get-its-viewcontroller – hakkurishian

Antwort

1

Sie können Ihre UIViewController auf die Onclick-Funktion wie passieren:

static func ClickAction(Button: Button, viewController: UIViewController) { 
    //... 
    viewController.present(... 
}