Speicheradressen Problem

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

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • Speicheradressen Problem

    Hallo Leute,

    folgendes: Ich habe ein TableView und lade darauf meine TableViewCell, auf meiner TableViewCell gibt es ein textfield. Trag ich nun etwas in das textfield ein, so ist der eitrig auch in einem anderen, in diesem Moment nicht sichtbaren, textfield eingetragen. Ich habe die Speicher Adressen überprüft und tatsächlich ist es so das gerade diese 2 die selbe Speicheradresse haben. Bei einer Tabelle mit 7 cellen sind die speicheradressen so aufgebaut:

    121298704 <---Sichtbar
    144067440 <---Sichtbar
    123016176 <---Sichtbar
    12133378 <---Sichtbar
    144173472 <---Sichtbar
    121298704 <---bei scrollen Sichtbar
    144067440 <---bei scrollen Sichtbar

    was auffällt ist, das die ersten 2 und die letzten 2 Adressen gleich sind daher meine Theorie: Da ich ARC benutze gibt er den Speicher der celle frei sobald sie aus dem view verschwindet die neue cell schnappt sich diese Adresse gleich und hat so die gleiche. Ein hin und her wenn man es so möchte. Meine Lösungsidee: ich speier die Adressen in ein Array. Geh in durch wenn eine neue cell erstellt wird und überprüfe ob diese speieradresse schon vorhanden ist. Wenn ja weiß ich ihr eine andere Speicheradresse zu ?? Wie weiß ich ihr eine andere zu?? ja ich weiß das ist keine optimale Lösung und eher schlecht als recht aber die kommt aus tiefster Verzweiflung. Kennt ihr eine andere Lösung? und kann ich das Projekt von ARC wider in die Manuelle Speicherverwaltung umschalten?? Bitte Helft mir

    Danke schon im Voraus

    Liebe Grüße
  • Wenn ich das richtig verstehe, willst du ja die Textfelder später nutzen bzw. dessen Einträge. Richtig?

    Wenn ja kannst du auch einfach ein NSMutableArray machen und immer die Inhalte, wenn sie in den Textfelder eingetragen werden dort speichern. Ist sicher auch nicht die schönste oder sauberste Lösung, dürfte aber dafür sehr schnell gehen, falls du unter Zeitdruck stehst.
  • ok da geb ich dir recht. allerdings kann ich die textfelder ja nicht im einzelnen ansprechen. ich habe die celle ja einmal gestaltet und die wird nun 7 mal gezeichnet die Labels auf der celle kann ich beim erstellen ändern im Nachhinein also wenn sie mal erstell sind, kann ich Elemente nichtmehr im einzelnen ansprechen
  • yannig7 schrieb:

    was auffällt ist, das die ersten 2 und die letzten 2 Adressen gleich sind daher meine Theorie: Da ich ARC benutze gibt er den Speicher der celle frei sobald sie aus dem view verschwindet die neue cell schnappt sich diese Adresse gleich und hat so die gleiche.

    Schöne Theorie, hat aber mit der Realität nichts zu tun. ;) ARC hat damit auch nichts zu tun. Apple hat der UITableView einen Mechanismus mitgegeben, der die Zellen wiederverwendet. Das spart Speicherplatz. In Deiner Datasource hast Du sicher eine Zeile wie die folgende drin:

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    In dem Methodennamen ist das Wort „Reusable“ (wiederverwendbar) enthalten. Wenn nun eine Zelle nach oben raus gescrollt wird, dann gibt Dir diese Codezeile eben diese herausgescrollte Zelle zur Wiederverwendung am unteren Ende der Tabelle. Die gleichen Speicheradressen kommen also daher, dass es sich bei den Zellen um ein und das selbe Objekt handelt. Deshalb haben scheinbar zwei Zellen den gleichen Inhalt.

    Michael
  • yannig7 schrieb:

    was auffällt ist, das die ersten 2 und die letzten 2 Adressen gleich sind daher meine Theorie: Da ich ARC benutze gibt er den Speicher der celle frei sobald sie aus dem view verschwindet die neue cell schnappt sich diese Adresse gleich und hat so die gleiche.

    Wie Michael schon schrieb stimmt deine Theorie nicht: die Zellen werden nicht freigegeben und Andere belegen den Platz, es sind dieselben Zellen.
    Works as designed. ;)

    Warum möchtest du dieses Verhalten unterbinden? Apple hat sich etwas dabei gedacht.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Lucas de Vil schrieb:

    Warum möchtest du dieses Verhalten unterbinden? Apple hat sich etwas dabei gedacht.
    Ich möchte wie gesagt den Inhalt jeder textfelder auslesen können. Ja bei mir gibt es diese Methode :

    Quellcode

    1. UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    . Gibt es denn eine Möglichkeit dies trotz

    diesem "Reusable" zu machen. Ich müsste eine Möglichkeit finden mit der ich jedes Textfeld einzeln ansprechen kann. Sorry mach noch nicht so lange Objc komm von Java
  • yannig7 schrieb:

    Sorry mach noch nicht so lange Objc komm von Java

    Ich glaube, das ist das Problem.

    Ich nerve dich jetzt so lange mit den 'Warum's, bis du feststellst, dass dein Vorhaben doof ist. ;)

    Also: warum willst du jedes Textfeld einzeln ansprechen?
    Dies Unterfangen ist recht sinnlos, man sieht sie ja eh nicht.

    Denn:
    Trag ich nun etwas in das textfield ein, so ist der eitrig auch in einem anderen, in diesem Moment nicht sichtbaren, textfield eingetragen.

    Das sieht nach einer weiteren Fehlinterpretation aus.

    Du haust vermutlich alle Dinge bezüglich der Textfelder in deinen 'if(cell == nil)' Zweig.
    Durch das Reusable ist cell aber manchmal halt != nil - und dann behält sie auch ihre alten Textfeld-Inhalte, weil du sie nicht überschreibst.

    iPhone ist nicht Samsung, iOS ist nicht Android.
    Mit Java-Ansätzen wirst du in Objective-C leider nicht allzu weit kommen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • ok ich hab mir jetzt überlegt ein delegate auf mein textfeld zu setzen und rufe die Methode
    -(BOOL)textFieldShouldReturn:(UITextField *)textField
    auf, dann Speicher ich den string in ein Array an der stelle indexPath.row. Allerdings kenn ich indexPath.row garnicht in diesem Moment. Wie bekomm ich den aktuellen indexPath.row in meine -(BOOL)textFieldShouldReturn:(UITextField *) ?
  • Ins Auge.
    Durch die Brust.
    Von Hinten.

    Wie wäre es, wenn du einmal umreißen würdest, was du genau vor hast anstatt zu fragen wie du deinen Ansatz durchgeprügelt bekommst?
    So habe ich jedenfalls keine Lust dir zu helfen.

    Du änderst deine Strings nicht in dem Textfeld. Nie nicht und in keinster Weise.

    Du hast ein Objekt, welches diesen String als Property hat.
    Du selektierst in deinem TableView dieses Objekt.
    Du reichst dieses Objekt an dein Detail View weiter.

    Also ändere deinen verdammten String dort, wo es logisch und sinnvoll ist: im Objekt!
    Dafür (und nur dafür) brauchst du dein Textfeld dann. Ein einziges Mal und dafür dann immer wieder.

    Übrigens schuldest du mir immer noch eine Antwort:
    "Warum willst du jedes Textfeld einzeln ansprechen?"

    Dein aktueller Ansatz macht genau dasselbe wie dein vorheriger: neben 'alles falsch' jedes Textfeld einzeln ansprechen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Also noch mal von vorne: Ich habe eine Tabelle mit cellen auf den cellen sind angaben zum Beispiel eine namens "Bestellte menge" dann gibt es ein textfeld namens "verfügbare mange" dort soll man nun eine zahl eingeben. Diese möchte ich dann auf einem server speichern. es sind 7 Spalten. Der Benutzer soll erst überall eine zahl eintragen und dann auf ok klicken. Dann möchte ich die zahlen in den textfeldern in einem Array speichern. ALLERDINGS ändert sich ja der text der celle da sie, wie wir ja rausgefunden haben, teilweiße die selbe Speicher Adresse haben. Aus diesem Grund möchte ich sobald in ein Textfeld geschrieben wurde, die geschriebene Zahl in ein Array speichern.

    Lucas de Vil schrieb:

    Übrigens schuldest du mir immer noch eine Antwort:
    "Warum willst du jedes Textfeld einzeln ansprechen?"
    Da die tastatur beim schreiben die textfelder verdegt möchte ich mit einer animation den View hochschieben. Allerdings nicht beim ersten textfeld, denn sonst würde das textfeld aus dem View verschwinden