Step by Step Guide und completion machen mich Wahnsinnig Hilfe!

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Step by Step Guide und completion machen mich Wahnsinnig Hilfe!

    Servus Leute,


    ich hab hier ein (für mich) sehr schwieriges Problem. Ich will die hier in Objektiv-C geschriebene Step by Step Guide in Swift lösen. Und zwar der Teil mit dem XMMContentBlocks.
    github.com/xamoom/xamoom-ios-sdk/wiki/Step-by-Step-Guide

    Aber das will einfach nicht ?( . Ich hab letzte Woche eine Mail an den Machern geschrieben ob die mir vielleicht da behilflich sein könnten. Bekommen habe ich den selben Code wie auf Github. Ich fühl mich hier allein gelassen und komme nicht mehr weiter und weiß nicht mehr weiter. Ich hoffe jemand kann mir hier helfen.


    Python-Quellcode

    1. import UIKit
    2. class ViewController: UIViewController, XMMContentBlocksDelegate {
    3. func didClickContentBlock(_ contentID: String!) {
    4. print("")
    5. }
    6. @IBOutlet weak var tableView: UITableView!
    7. let api = XMMEnduserApi(apiKey: "XXXXXXXXXXX")
    8. override func viewDidLoad() {
    9. super.viewDidLoad()
    10. let contentBlocks = XMMContentBlocks(tableView: tableView, api: api)
    11. api.content(withID: "XXXXXXXXXX") { (content, error) in
    12. contentBlocks?.delegate = self
    13. contentBlocks?.display(content, addHeader: false)
    14. }
    15. }
    16. override func viewWillAppear(_ animated: Bool) {
    17. // contentBlocks?.viewWillAppear()
    18. }
    19. override func didReceiveMemoryWarning() {
    20. super.didReceiveMemoryWarning()
    21. // Dispose of any resources that can be recreated.
    22. }
    23. }
    Alles anzeigen
    Ich hab das Problem das ich den Content nicht anzeigen kann. Ich vermute sehr das ich den Code einfach an der falschen Stelle platziert habe.
    Dann wäre noch das Problem mit der Completion. Ich weiß wozu der gut sein soll, aber ich weiß nicht wie zum Teufel ich den wichtigen content raushole :evil: . Wo die ganzen Daten sich befinden. So ziemlich alle Methoden in der API geben void aus und haben nur completions.

    In Endeffekt kann ich nur in den completions arbeiten und nichts außerhalb.

    Ich weiß einfach nicht was ich machen soll, damit es endlich läuft. ;(

    Wenn es euch hilft mir zu helfen, dann kann ich gerne mein kleines Test-Projekt senden.

    Gruß
  • Diese XMM-API kenne ich nicht. Kann ich nichts spezifisches zu sagen.
    Ein kleines abgespecktes Demo-Projekt wäre aber generell nicht verkehrt.

    Swiffer schrieb:

    Dann wäre noch das Problem mit der Completion. Ich weiß wozu der gut sein soll, aber ich weiß nicht wie zum Teufel ich den wichtigen content raushole :evil: . Wo die ganzen Daten sich befinden. So ziemlich alle Methoden in der API geben void aus und haben nur completions.

    In Endeffekt kann ich nur in den completions arbeiten und nichts außerhalb.

    Du kannst aber doch die in die Closure übergebenen Parameter (hier bei Dir content) dort als Instanzvariablen Deiner Klasse abspeichern.

    Beispiel:

    Quellcode

    1. func functionCompleting(predicate: (Int) -> Void) {
    2. predicate(9)
    3. }
    4. class Foo {
    5. var bar = 0
    6. func doSomething() {
    7. functionCompleting() { bar in
    8. self.bar = bar
    9. }
    10. }
    11. }
    12. var foo = Foo()
    13. print(foo.bar) // 0
    14. foo.doSomething()
    15. print(foo.bar) // 9
    Alles anzeigen
    Ich weiß nicht, ob Du das meinst.

    Ach ja. print("") gibt einfach nur einen leeren String aus. Da sieht man nicht wirklich viel von. Im Effekt das gleiche wie print(). ;)
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von torquato () aus folgendem Grund: Kompilierendes Beispiel

  • Hey,

    die print Zeile war nur damit Xcode nicht meckert, weil ich das XMMContentBlocksDelegate Protocol oben hab und die Methode haben musste.

    Gemeint habe ich das ich in der completion api.content(withID: "XXXXXXXXXX") die variable "content" gerne auch in andere Methoden nutzen möchte und sie nicht raus bekomme. Ansonsten kann ich ja nur dort "drinnen arbeiten"

    Ich hab mal ein kleines Projekt mit angehängt.

    Die eigentliche Frage oder das Problem von mir ist, ob ich das hier so richtig gelöst habe wie hier in Objectiv-C in Github (The fastest way to display content...)
    Dateien
    • XMMTableTest.zip

      (617,81 kB, 201 mal heruntergeladen, zuletzt: )
  • Swift ist und bleibt kryptisch für mich.

    Wenn ich Deinen Code richtig verstehe, dann sehe ich folgende Fehler:

    - contentBlocks ist eine lokale Konstante und kein Property der Klasse. Somit kannst Du in viewWillAppear() nicht darauf zugreifen.
    - contentBlocks?.delegate = self gehört nicht in den Completion Block von api.content(), sondern davor.
  • Swiffer schrieb:

    Das wär auch mein Problem, diesen contentBlocks oder den content aus dem Completion Block raus zu bekommen.

    Genau das habe ich doch oben ausführlich mit meinem Beispielcode demonstriert. @MCDan weist zurecht darauf hin. Du hast den gar nicht verstanden, oder?

    Swiffer schrieb:

    Die Klasse an sich wird später nicht instanziert.

    Natürlich wird die Klasse, aka Dein ViewController, instantieiert. Allerdings nicht per Hand im Code, sondern im Storyboard.
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • @torquato Nicht wirklich, ich versuche gerade den code zu verstehen und wie genau ich das machen soll, dann wollte ich auf den Beispielcode nochmal drauf zu kommen.

    Sagt mir bitte ob ich das richtig verstanden habe oder nicht.

    Ich erstelle eine Klasse oder vielleicht ein Struct, hinterlege eine Variable bar und schreibe den content in meiner clousure in die bar Variable wie im Beispielcode.

    Dann erstelle ich eine Instanz davon in der Klasse in der ich damit arbeiten möchte.

    So, dann habe ich nun das Problem, dass wenn ich hier in meinem Fall der content vom Typ XMMContent ist, dass der nicht nil sein darf. Und ich weiß nicht wie ich den deklarieren soll oder hab ich da ein Denkfehler?
  • Swiffer schrieb:

    Ich erstelle eine Klasse oder vielleicht ein Struct, hinterlege eine Variable bar und schreibe den content in meiner clousure in die bar Variable wie im Beispielcode.

    Dann erstelle ich eine Instanz davon in der Klasse in der ich damit arbeiten möchte.

    Nein, meine Beispielklasse Foo steht stellvertretend für Deine ViewController-Klasse. Einfach da die entsprechende Instanzvariable deklarieren, z.B. mit var xmmContent: XMMContent?. Und wie @Michael richtig anmerkt muß das dann natürlich ein Optional sein.
    Dann kannst Du in der Closure mit xmmContent = content der Instanzvariable einen echten Wert mitgeben und später überall im ViewController über xmmContent darauf zugreifen.
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • Ich hab das jetzt folgendermaßen gemacht:


    Python-Quellcode

    1. import UIKit
    2. class ViewController: UIViewController, XMMContentBlocksDelegate {
    3. func didClickContentBlock(_ contentID: String!) {
    4. print("")
    5. }
    6. @IBOutlet weak var tableView: UITableView!
    7. let api = XMMEnduserApi(apiKey: "XXX")
    8. var xmmContent: XMMContent?
    9. override func viewDidLoad() {
    10. super.viewDidLoad()
    11. api.content(withID: "XXX") { (content, error) in
    12. self.xmmContent = content
    13. }
    14. }
    15. override func viewWillAppear(_ animated: Bool) {
    16. let contentBlocks = XMMContentBlocks(tableView: tableView, api: api)
    17. contentBlocks?.delegate = self
    18. contentBlocks?.display(xmmContent, addHeader: false)
    19. contentBlocks?.viewWillAppear()
    20. }
    21. override func didReceiveMemoryWarning() {
    22. super.didReceiveMemoryWarning()
    23. }
    24. }
    Alles anzeigen
    Okay, dann hätte ich das Problem mit dem Clousure gelöst, jedoch bekomme ich auf meiner TableView nichts angezeigt. Ich erhalte diese Fehlermeldung die mir nach langer Google suche nichts sagt "nw_proxy_resolver_create_parsed_array PAC evaluation error: NSURLErrorDomain: -1003" compilen und ausführen der Klasse gelingt problemlos.

    Vom Namen her lasse ich mal daraus schließen das irgendeine eine Verbindung nicht erfolgreich war.

    PS: Wieso gibt es im Code Editor keine Objektiv-C/Swift highlight zur Auswahl? Ist doch ein OSX Forum :)
  • Swiffer schrieb:

    Okay, dann hätte ich das Problem mit dem Clousure gelöst

    Okay. Danke für die Blumen. Da haben jetzt drei Leute mehrfach hinterhergehächelt, sogar Code und Links geliefert, und DU hast dieses Problem jetzt gelöst. Echt jetzt?

    Swiffer schrieb:

    jedoch bekomme ich auf meiner TableView …

    Klingt eher danach, daß da gar nichts gelöst ist, oder? o_O

    Im Eingangspost klang es danach, daß es ein Problem wäre, Obj-C-API in Swift-Sytax zu transferieren. Statdessen fehlt es offensichtlich an den Basics… So sad…
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • torquato schrieb:

    Swiffer schrieb:

    Okay, dann hätte ich das Problem mit dem Clousure gelöst
    Okay. Danke für die Blumen. Da haben jetzt drei Leute mehrfach hinterhergehächelt, sogar Code und Links geliefert, und DU hast dieses Problem jetzt gelöst. Echt jetzt?
    :thumbsup:

    Und das auch noch an einem Feiertag, wo Draußen – das ist die Welt hinter den Mauern, wo man i.d.R. vor dem Rechner sitzt – die Sonne scheint und man einfach mal $wasanderesmachen könnte, als Code zu schreiben oder darüber zu brüten ....

    Und btw. dazu noch die Leute, die hier im "Kino" das Ganze einfach nur konsumiert haben ...
  • torquato schrieb:

    Okay. Danke für die Blumen. Da haben jetzt drei Leute mehrfach hinterhergehächelt, sogar Code und Links geliefert, und DU hast dieses Problem jetzt gelöst. Echt jetzt?

    Klingt eher danach, daß da gar nichts gelöst ist, oder? o_O

    Im Eingangspost klang es danach, daß es ein Problem wäre, Obj-C-API in Swift-Sytax zu transferieren. Statdessen fehlt es offensichtlich an den Basics… So sad…
    Sorry wenn es so rüber kam, natürlich wäre ich ohne euch aufgeschmissen gewesen und hätte es sicher nicht weit gebracht. Ich kenne Swift erst einen knappen Monat und hab den einen oder anderen Basics wohl verpasst oder vergessen^^ Deswegen fällt es mir schwer noch Objectiv-C parallel zu verstehen.

    Nunja, dass Problem mit der Clousure, dass ich hatte, hätten wir gelöst. Das mit der TableView ist immer noch mein Hauptproblem bzw. so wie du es bereits geschrieben hast, die Objectiv-C API in Swift zu transferieren.

    @MCDan ich schau es mir heute Mittag mal an, wenn ich wieder daheim bin!

    Nochmals vielen lieben Dank an euch die bereit waren mir zu helfen.

    lg
  • Swiffer schrieb:

    Das mit der TableView ist immer noch mein Hauptproblem bzw. so wie du es bereits geschrieben hast, die Objectiv-C API in Swift zu transferieren.
    Das hat aber nichts mit Swift zu tun, du hast doch einen Error-Code, wenn ich den bei einer Suchmaschine meiner Wahl reinwerfe, bekomme ich zumindest schon mal ein paar Hinweise denen ich nachgehen würde.
  • DBocksteger schrieb:

    Swiffer schrieb:

    So es funktioniert! Ich danke euch für eure Unterstützung!
    Wie wärs denn, wenn du deine Lösung und die Info, was das Problem war, hier auch für alle teilst? ;)
    Es hat zu einem hat der Tipp von torquato geholfen und der Link von MCDan zum verstehen.

    Ich hab eine neue Funktion definiert wo ich nur dort den download anstoße einschließlich die Methode die den contentBlock anzeigt auf dem TableView das ich nutze(contentBlocks.display()). Dann wie auch im GitHub Beispiel die Befehle in Swift form in den viewWill... viewDid... hinzugefügt und dann war ich glücklich :)