2017-07-25 6 views
0

Ich habe ein actionSheet mit 3 Optionen erstellt, die an andere View-Controller übertragen und eine Nummer anrufen. Diese Option befindet sich auf einer Schaltfläche in einer Navigationsleiste auf jedem Bildschirm meiner App. Ich versuche einen Weg zu finden, den Code wiederzuverwenden, ohne ihn für jeden Bildschirm neu eingeben zu müssen. Ich verstehe, dass es einen Weg gibt, dies zu tun, indem ich eine UIButton Unterklassenbildung abschneide, aber ich habe Tage gesucht und kann keine definitive Antwort finden, wie man die Unterklasse tatsächlich kodiert. Mein Code jetzt ist die folgende:Wiederverwendbare * Taste * in Xcode

class moreButton: UIButton { 

@IBAction func displayActionSheet(_ sender: Any) { 
    let alertController = UIAlertController(title: nil, message: "Get Your Roast On", preferredStyle: .actionSheet) 
     let followAction = UIAlertAction(title: "Follow Us", style: .default, handler: {(action: UIAlertAction!)->Void in self.performSegue(withIdentifier: "moveSegue", sender: self) 
    }) 
     let shopAction = UIAlertAction(title: "Visit Shop", style: .default, handler: {(action: UIAlertAction!)->Void in self.performSegue(withIdentifier: "shopSegue", sender: self) 
    }) 
     let callAction = UIAlertAction(title: "Call Us Now", style: .default) { _ in 
      let url:URL = URL(string: "tel://number")! 
      UIApplication.shared.open(url, options: [:], completionHandler: nil) 

    } 

    let cancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 

    alertController.addAction(followAction) 
    alertController.addAction(shopAction) 
    alertController.addAction(callAction) 
    alertController.addAction(cancel) 


    self.present(alertController, animated: true, completion: nil) 
} 
} 

ich den Fehler bekommen:

value of type 'moreButton' has no member 'performSegue'

in beide followAction und shopAction Linien und „Wert vom Typ‚moreButton‘Nein‚anwesend‘Mitglied hat "In der letzten Zeile. Dieser Code funktionierte, als ich eine IBAction direkt von der Schaltfläche erstellt hatte, aber jetzt scheint es Fehler zu haben, von denen ich nicht weiß, wie ich sie korrigieren soll.

+0

Sie versuchen, einen Knopf zu machen funktionieren, das ist eigentlich das Geschäft eines View-Controllers. View-Controller können Segmente ausführen und andere Controller darstellen, aber Schaltflächen können nicht, daher hat das "Selbst" keine Ahnung, wonach Sie fragen. Erwägen Sie, diesen Code in eine Unterklasse von 'UIViewController' zu setzen und dann alle anderen" Bildschirme "von dieser VC zu erben. –

+0

Das ist wirklich hilfreich zu wissen. Ich nahm nur an, dass es mit einer IBAction von einem Button funktionierte, dass es funktionieren würde, wenn ich einen Button subklassenlasse. Ich komme jetzt in ein paar Probleme aus dem untenstehenden Code, aber ich werde sehen, ob es funktioniert – Sprokalero

+0

Die Idee ist, dass eine IBAction ist etwas, das der Knopf in seinem Namen geschieht, nicht etwas, was der Button für sich selbst geschieht. –

Antwort

0

Sie erhalten diese Fehler, weil performSegue und present UIViewController-Methoden sind.

Anstatt Unterklasse UIButton, würde ich eine neue Hilfsklasse mit einer Klassenmethode erstellen, um den UIAlertController für Sie zu erstellen. Die Methode würde einen UIViewController als Parameter akzeptieren, um die UIAlertActions korrekt zu erstellen.

würden Sie diese neue Methode aufrufen aus displayActionSheet wie:

let alertController = ActionSheetBuilder.build(viewController: self) 
present(alert, animated: true, completion: nil) 

Anpassung Ihre Kreation Code in die neue Klasse wäre so etwas wie kommen:

final class ActionSheetBuilder { 
    class func build(viewController: UIViewController) -> UIAlertController { 
     let alertController = UIAlertController(title: nil, message: "Get Your Roast On", preferredStyle: .actionSheet) 
     let followAction = UIAlertAction(title: "Follow Us", style: .default, handler: {(action: UIAlertAction!)->Void in viewController.performSegue(withIdentifier: "moveSegue", sender: viewController) }) 
     let shopAction = UIAlertAction(title: "Visit Shop", style: .default, handler: {(action: UIAlertAction!)->Void in viewController.performSegue(withIdentifier: "shopSegue", sender: viewController) }) 
     let callAction = UIAlertAction(title: "Call Us Now", style: .default) { _ in 
      let url:URL = URL(string: "tel://2845471035")! 
      UIApplication.shared.open(url, options: [:], completionHandler: nil) 
     } 
     let cancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 

     alertController.addAction(followAction) 
     alertController.addAction(shopAction) 
     alertController.addAction(callAction) 
     alertController.addAction(cancel) 

     return alertController 
    } 
} 
+0

Dies funktioniert teilweise. Ich hatte ursprünglich den alertController innerhalb von viewDidLoad platziert, also habe ich ihn jetzt verschoben, aber ich erhalte den Fehler: "kann den Wert des Typs '(NSObject) ->() ->' displayActionSheet 'in den erwarteten Argumenttyp' UIViewController 'nicht konvertieren" " . Ich erhalte auch eine "erwartete Erklärung" über die aktuelle (Alarm ...) Zeile – Sprokalero