2016-04-28 9 views
2

Ich erstelle eine App, die jeden Tag ein anderes Angebot generiert. Ich wollte dem Benutzer die Möglichkeit geben, teilen mit Twitter das Zitat, das gegeben wurde. Ich konnte Twittern mit der Tweet Box erscheinen lassen, aber das Zitat wurde nicht angezeigt. Ich habe versucht, dass zu bekommen passieren und jetzt bekomme ich einen konstanten Fehler:Fehlendes Argument für Parameter # 1 in Anruf // Twitter

Missing argument for parameter for parameter #1 in call

Problem: Ich mag würde in der Lage sein das Angebot erhalten den Tweet-Box zu füllen, wie es nach dem Benutzer erscheint tippt der twitter-Taste

Hier ein Screenshot mit dem Fehler ist enter image description here

Hier ist der Code:

@IBAction func shareTweet(sender: AnyObject) { 
    if SLComposeViewController.isAvailableForServiceType(SLServiceTypeTwitter) { 
     Share(text:Quote).shareTwitter().characters.count{ sheet in self.presentViewController(sheet, animated: true, completion: nil)}; 
     let tweetShare:SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeTwitter) 

     self.presentViewController(tweetShare, animated: true, completion: nil) 

    } else { 

     let alert = UIAlertController(title: "Accounts", message: "Please login to a Twitter account to tweet.", preferredStyle: UIAlertControllerStyle.Alert) 

     alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil)) 

     self.presentViewController(alert, animated: true, completion: nil) 
    } 

} 

Hier ist die share.swift Klasse:

import Social 
struct Share { 
let text: String 

init(text: String) { 
    self.text = text 
} 

typealias ShareSheet = SLComposeViewController 

func shareTwitter(count: Int, action: (ShareSheet ->()), error: (UIAlertController ->())) { // Returns either tweetSheet or alert view 
    if (count < 140) { 
     if (SLComposeViewController.isAvailableForServiceType(SLServiceTypeTwitter)) { 
      // Tweets Quote 
      let sheet: SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeTwitter) 
      sheet.setInitialText(text) 
      action(sheet) 
     } else { 
      // Not logged into Twitter 
      let alert = UIAlertController(title: "Accounts", message: "Please login to a Twitter account to share", preferredStyle: UIAlertControllerStyle.Alert) 
      alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)) 
      error(alert) 
     } 
    } else { 
     // Character Count is greater then 140 
     let alert = UIAlertController(title: "Character Count", message: "Sorry this is too long to tweet", preferredStyle: UIAlertControllerStyle.Alert) 
     alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil)) 
     error(alert) 
    } 
} 

Hilfe würde sehr geschätzt werden. Vielen Dank im Voraus. Wenn Sie weitere Referenzen benötigen, um zu antworten, kommentieren Sie, was ich zur Frage hinzufügen soll. Vielen Dank.

Antwort

2

Ihre shareTwitter(count: action:) Funktion benötigt zwei Parameter. Sie rufen es ohne Parameter an. Sie versuchen dann, den abschließenden Verschlussparameter unter characters.count aufzurufen. Ich gehe davon aus, dass, was Sie meinen, dies zu tun ist:

Share(text:Quote).shareTwitter(Quote.characters.count) { sheet in self.presentViewController(sheet, animated: true, completion: nil)}; 

Ich glaube nicht, dass Sie tatsächlich benötigen die count Parameter auf Ihrer shareTwitter() Funktion though. Die Share Struktur hat bereits die text in einer Eigenschaft gespeichert. Warum nicht einfach das benutzen?

func shareTwitter(action: (ShareSheet ->()), error: (UIAlertController ->())) { // Returns either tweetSheet or alert view 
    if (text.characters.count < 140) { 
     // Code removed for brevity 

    } else { 
     // Code removed for brevity 
    } 
} 

Dann können Sie Ihre Funktion Aufruf wie folgt machen:

Share(text:Quote).shareTwitter() { sheet in self.presentViewController(sheet, animated: true, completion: nil)}; 

Zusätzlich Sie scheinen nicht einen anderen Verschluss in Ihrem action Verschluss Rückkehr zu werden. Ich denke, Sie meinen, dass Ihr Schließungsparameter Void zurückgibt.

Auf einer anderen Anmerkung, da Sie zwei Verschluss Parameter verwenden, einen für action und eine andere für error, ich glaube nicht, Ihr Code auch mit dieser Änderung kompilieren wird. Sie müssten dies tun:

Share(text:Quote).shareTwitter(action: { sheet in 
    self.presentViewController(sheet, animated: true, completion: nil) 

}) { error in 

} 

Wenn ein Verschluss mit, dass der beste Weg, dies zu tun, kann einen Fehler haben, ist eine Result Monade zu verwenden. Es ist nicht schwer, dies für sich selbst zu implementieren, aber Sie können einen Blick auf antitypical/Result für eine Bibliothek werfen, die Ihnen eine Result Monad Out of the Box gibt.

Mit diesen beiden Änderungen sieht Ihr shareTwitter() Funktion wie folgt aus:

func shareTwitter(action: (Result<ShareSheet, NSError> -> Void)) { // Returns either tweetSheet or alert view 
    if (text.characters.count < 140) { 
     // Code removed for brevity 

    } else { 
     // Code removed for brevity 
    } 
} 

Und ist es so genannt:

Share(text:Quote).shareTwitter() { result in 
    switch result { 
    case .Success(let sheet): 
     self.presentViewController(sheet, animated: true, completion: nil)}; 

    case .Failure(let error): 
     // Do something with your error 
    } 
} 
+1

Sorry, Ich habe es nur in –

+0

Okay, denke ich. Ich verstehe die volle Absicht dessen, was du jetzt versuchst zu tun. Meine Antwort wurde überarbeitet und sollte Ihr Problem mehr als nur beheben. – AnthonyM

+1

Vielen Dank für die Lösung und Erklärung. Der Fehler wurde sofort behoben. Du bist unglaublich! Bleib großartig! –

Verwandte Themen