• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Dynamische Auswahlliste -> iPhone-Problem

Mein aktuelles Projekt ist nach langer, langer Vorbereitungszeit nun endlich im Outdoor-Test. Garmin und Android funktioniert schon stabil, aber auf dem iPhone habe ich noch ein Problem.

In der Story gibt es zwei Pferderennen. Die nötigen Infos dazu habe ich mir in zwei Tables gepackt, für das erste Rennen sieht das so aus:
Tabelle-Rennen.jpg

An verschiedenen Stellen ist es dann nötig, dass dem Spieler eine dynamische Auswahlliste der Pferde für das aktuelle Wettrennen zur Verfügung gestellt wird (z.B. beim Abschliessen einer Wette am Wettschalter). Dynamisch heisst hier: Abhängig von der Nummer des aktuellen Rennens die richtige Table durchlaufen und die Liste erstellen.

Dafür habe ich mir eine Funktion "initRaceChoice" geschrieben:
Racechoice.jpg

Ein Aufruf der ganzen Sache (hier kann man sich ein Pferd vorführen lassen) sieht dann so aus:
Pferd-anschauen.jpg

Resultat: Leider wird auf dem iPhone keine Auswahlliste ausgegeben. Auf Android und Garmin funktioniert das bestens.

Kann sich irgendwer vorstellen, was hier das Problem ist? Und noch besser: Weiss jemand eine Lösung?

Danke schon jetzt für eure Hilfe!
 
OP
W

whiterussian_ch

Geocacher
Ich kenne den iPhone-Player nicht und kann deshalb nicht interpretieren, ob das eine leere Liste oder keine Liste ist:
Screenshot.jpg

Ich habe mal beim Tester nachgefragt.
 

Charlenni

Geomaster
Ich würde auf leere Liste tippen. Vermutlich kann das iPhone kein table.insert. Versuche doch mal, dieses zu umgehen, indem Du einen Zähler i einbaust und immer liste = element.name setzt. Spart auch die innere for Schleife, die nicht nötig ist.
 

Charlenni

Geomaster
So, jetzt von einem PC mit richtiger Tastatur ;)

Code:
function initRaceChoice(rececount)
  local liste = {}
  local tbl = {}

  if racecount = 1 then
    tbl = tbl_race_1
  else
    tbl = tbl_race_2
  end

  for i=1,#tbl do
    liste[i] = tbl[i].name
  end

  return liste
end
Dies überträgt Dir alle Namen in die Tabelle liste. Und das war es wohl, was Du wolltest. Oder nicht?
 
OP
W

whiterussian_ch

Geocacher
Ganz genau. Ich probiere das heute so aus.

(Warum eigentlich einfach, wenn es auch kompliziert geht? Was habe ich mir da bloss gedacht?)

Dann hoffe ich doch mal, dass das iPhone das so schluckt...
 
OP
W

whiterussian_ch

Geocacher
Da waren noch zwei Tippfehler drin (racecount und == bei der Tabelleninitialisierung), aber im Emulator funktioniert es jetzt schon mal.

Ich warte mal gespannt auf meinen Beta-Tester...

So sieht es jetzt aus:
Code:
function initRaceChoice(racecount)
    local liste = {}
    local tbl = {}
    local i

    if racecount == 1 then
        tbl = tbl_race_1
    elseif racecount == 2 then
        tbl = tbl_race_2
    end

    for i=1,#tbl do
        liste[i] = tbl[i].name
    end

    return liste
end
 
OP
W

whiterussian_ch

Geocacher
Ach übrigens: Es scheint nicht an table.insert zu liegen.

Diese Funktion liefert auf dem iPhone auch einen leeren String:
Code:
function PrintRaceProg(tbl,renn_nr)
    local text = ""
    local quotentext = ""

    if renn_nr == 1 then
        text = "Die Wettquoten fuer das erste Rennen sind:"..cr
    else
        text = "Die Wettquoten fuer das zweite Rennen sind:"..cr
    end

    for num,element in pairs(tbl) do  -- Hier musst Du auch die Tabelle von tbl in fruechte_table umbenennen
        -- num ist nach jedem Durchgang die Nummer des Tabellenelements (1, 2, 3...),
        -- element is fruechte_table[1], fruechte_table[2] usw.
        for index, inhalt in pairs(element) do
            if index == "quote" then
                quotentext = inhalt
            end
            if index == "name" then
                text = text..inhalt..": ".." 1:"..quotentext..cr
                quotentext = ""
            end
        end
    end
    return text
end

Ich baue das auch mal kurz um...
 
OP
W

whiterussian_ch

Geocacher
Obiges mache ich jetzt so:
Code:
function PrintRaceProg(tbl,renn_nr)
    local text = ""
    -- local quotentext = ""

    if renn_nr == 1 then
        text = "Die Wettquoten fuer das erste Rennen sind:"..cr
    else
        text = "Die Wettquoten fuer das zweite Rennen sind:"..cr
    end

    for i=1,#tbl do
        text = text..tbl[i].name..": ".." 1:"..tbl[i].quote..cr
    end

    return text
end

Könnte es an den "in pairs"-Schleife liegen?
 

Charlenni

Geomaster
Nein. Ich habe heute morgen etwas getestet und den Fehler gefunden.

Zuerst die gute Nachricht, es liegt nicht an Deinem Code :D .

Jetzt aber die schlechte Nachricht. Und da dürfen wieder alle aufpassen. Der iPhone Player kommt nicht mit Einträgen in Tabellen zurecht, die Namen haben. Ein einfaches Beispiel. Man hat eine Tabelle tbl, die mehrere Einträge hat. Diese ist so definiert
Code:
local tbl = {}
tbl.name = "Hans"
tbl.abd = "abd"
tbl.alter = 56
tbl.abc = "abc"
Nun möchte man diese durchnudeln um alle Felder zu bekommen. Dies geschieht so
Code:
local text = ""
for index,inhalt in pairs(tbl) do
  text = text..index.." = "..inhalt..", "
end
Jetzt erwarten wir als Ergebnis für text den string "name = Hans, abd = abd, alter = 56, abc = abc, ". Das dürften auch alle Player liefern, außer dem iPhone Player. Der liefert "1 = abc, 2 = abd, 3 = 56, 4 = Hans, ". Was ist passiert? Der iPhone Player liefert für die Variable index nicht den Namen des Feldes sondern einfach eine Zahl zurück, was natürlich falsch ist. Die Zahl entspricht der alphabetischen Position des Eintrags (abc < abd < alter < name).

Um das Ganze nun abzuschließen: Deine Funktion würde das gewünschte Ergebnis liefern, wenn Du sie folgendermaßen umschreiben würdest:
Code:
function PrintRaceProg(tbl,renn_nr)
    local text = ""
    local quotentext = ""

    if renn_nr == 1 then
        text = "Die Wettquoten fuer das erste Rennen sind:"..cr
    else
        text = "Die Wettquoten fuer das zweite Rennen sind:"..cr
    end

    for num,element in pairs(tbl) do  -- Hier musst Du auch die Tabelle von tbl in fruechte_table umbenennen
        -- num ist nach jedem Durchgang die Nummer des Tabellenelements (1, 2, 3...),
        -- element is fruechte_table[1], fruechte_table[2] usw.
        for index, inhalt in pairs(element) do
            -- Mit name < quote < wsk gilt (iPhone Bug): name = 1, quote = 2, wsk = 3
            if index == "quote" or index == 2 then
                quotentext = inhalt
            end
            if index == "name" or index == 1 then
                text = text..inhalt..": ".." 1:"..quotentext..cr
                quotentext = ""
            end
        end
    end
    return text
end
Womit das nun auch geklärt ist. Vielleicht sollte man ja mal eine Liste machen, was auf dem iPhone alles nicht läuft :roll: .
 

schnuefelis

Geonewbie
Ach du meine Güte.. :zensur: :motz: :kopfwand: :irre:
Cherlenni, ich hoffe schwer, dass dein WF / WIG2.0-Projekt bald so richtig durchstartet ;) . Diese Inkopatibilitäten zwischen den einzelnen Platformen (ja, auch Android hat ein paar Macken...) können einen ja richtig auf den :zensur: gehen...
Also bei iPhone gäbe es da noch:
- vararg (nicht unterstützt)
- string.gsub() (nicht richtig implementiert)
- rawset (gar nicht implementiert)
 
OP
W

whiterussian_ch

Geocacher
Herzlichen Dank!
Charlenni schrieb:
Vielleicht sollte man ja mal eine Liste machen, was auf dem iPhone alles nicht läuft.
Wäre der Aufwand nicht geringer eine Liste zu machen, was auf dem iPhone-Player läuft? :lachtot:

Und ja: Ich freue mich auch schon auf die neuen Player! Klar: Auch Garmin und Android haben ihre Macken. Aber mir scheint wieder mal, dass der iPhone-Player alle an mangelhafter Implementation um Längen schlägt.
 
Oben