• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Werte eines NSArrayController in ein NSDictionary laden?

FabKir

Alkmene
Registriert
26.01.14
Beiträge
30
Hallo,

ich drehe mich leider seit Tagen auf der Stelle.

Ich würde gerne Werte eines NSArrayController in ein NSDictionary laden und aus dem NSDictionary später die werte in einen WebView um diese drucken zu können.

Ich schaffe es aber nicht die einzelnen Werte des NSArrayController in das Dic zu laden.

Das ist mein derzeitiger Code

Code:
-(void)drucken
{
        NSString *druckstring = @"<head><body>";
    [self.arrayControllerEintrag setContent:self.array];
    NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
   
    for (int i = 0; i<=[_array count]; i++)
    {
        [dic setValue:_array[i] forKey:_array[i]];
    }
   
        for (NSString* key in [dic allKeys])
    {
        NSString *druckKey = [NSString stringWithFormat:@"<br>%@<br>",key];
        [druckstring stringByAppendingString:druckKey];
       
    }
   
        [[webview mainFrame]loadHTMLString:druckstring baseURL:nil];
}

Würde mich um jede Hilfe freuen.
 
Zuletzt bearbeitet:

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.560
Es sind einige Merkwürdigkeiten in diesem Code und welchen Sinn es hat, ein Array in ein Dictionary zu packen, wird auch nicht klar.

Der Hauptfehler ist aber die Zeile "[druckstring stringByAppendingString:druckKey]", die überhaupt keine Wirkung hat. Gemeint ist wohl

Code:
druckstring = [druckstring stringByAppendingString:druckKey];

was aber zu irrwitzigem Speicherverbrauch im Autorelease-Pool führt. Besser wäre

Code:
NSMutableString *druckstring = [NSMutableString string];
...
for (NSString* key in _array)
    [druckstring appendFormat: @"<br>%@<br>",key];
 

FabKir

Alkmene
Registriert
26.01.14
Beiträge
30
Vielen Dank für die schnelle Antwort.

In meinem NSArrayController befinden sich Klassen mit Eigenschaften wie zB. Menge, Preis etc.
Der NSArrayController übergibt dem NSArray(mit der Methode die ich gewählt habe) doch nur die Klasse,
nicht die einzelnen Werte?
Weil mein WebView bleibt leer.

Sry wenn es zum teil dumme Fragen sind ich programmiere noch nicht so lange Objektive C.

Code:
-(void)drucken
{
    NSMutableString *druckstring = [[NSMutableString alloc]initWithString:@"<heady><body>"];
    [self.arrayControllerEintrag setContent:self.array];
   
        for (NSString* key in _array )
    {
        [druckstring appendFormat:@"<br>%@<br>",key];
       
    }
   
    [druckstring stringByAppendingString:@"<body><head>"];
   
        [[webview mainFrame]loadHTMLString:druckstring baseURL:nil];
}
 

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.560
Weil mein WebView bleibt leer.

Es gibt noch weitere Fehler und es sind jetzt noch neue hinzugekommen:

1) Der berechnete HTML-Code ist ungültig. Ein WebView ignoriert zwar jede Menge Fehler, aber darauf darf man sich nicht verlassen.
2) Ein HTML-Tag "<heady>" gibt es nicht.
3) "[druckstring stringByAppendingString : @"<body><head>"];" hat keinerlei Wirkung. Du lässt das System eine neue Zeichenkette berechnen, verwendest aber das Ergebnis überhaupt nicht. Das ist wieder dasselbe Problem wie oben.

Der NSArrayController hat für dieses Programmstück überhaupt keine Bedeutung.
 
Zuletzt bearbeitet:

FabKir

Alkmene
Registriert
26.01.14
Beiträge
30
Ohh ja da war ich wohl etwas überhastet, habe die html Fehler denke ich alle behoben.
Ich habe in der for-Schleife mal per nslog den jeweiligen "key" ausgeben lassen und es passiert nichts, das heißt das Array ist leer.
 

FabKir

Alkmene
Registriert
26.01.14
Beiträge
30
Ich habe mal zum Test nach der fortschleife ein "Test" ausgeben lassen was auch funktioniert.

Code:
-(void)drucken
{
    NSMutableString *druckstring = [[NSMutableString alloc]initWithString:@"<body>"];
    [self.arrayControllerEintrag setContent:self.array];
   
        for (NSString *key in _array )
    {
        [druckstring appendFormat:@"<br><p>%@</p><br>",key];
    }
   
        [druckstring appendString:@"<p>test</p></body>"];
   
        [[webview mainFrame]loadHTMLString:druckstring baseURL:nil];
}

Mein Problem ist nun dass das Array leer ist soweit ich das testen konnte ist weder ein String noch ein Objekt darin enthalten.
Ich habe die for-schleife abgewandelt um zu testen ob Objekte darin enthalten sind:
Code:
for (Eintrag *key in _array )
 

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.560
Mein Problem ist nun dass das Array leer ist

Nun ja, mit Werten füllen muss man es schon irgendwo.

Außerdem wird jetzt offensichtlich, dass _array offenbar keine NSStrings, sondern Objekte der Klasse "Eintrag" enthält. Dann ist die for-Schleife, so wie sie da steht, eigentlich auch falsch. Sie läuft zwar, weil das System wegen des Format-Strings intern den Wert von "key" in Wirklichkeit durch einen Aufruf [key description] ersetzt, aber das würde nur dann vernünftige Ergebnisse liefern, wenn in der Klasse Eintrag die Methode -description so überschrieben wird, dass sie eine HTML-Beschreibung des jeweiligen Objekts als NSString liefert.
 

FabKir

Alkmene
Registriert
26.01.14
Beiträge
30
In meinem NSArrayController befinden sich Klassen mit Eigenschaften wie zB. Menge, Preis etc.
Der NSArrayController übergibt dem NSArray(mit der Methode die ich gewählt habe) doch nur die Klasse,
nicht die einzelnen Werte?

Das war ja meine Frage: 1. Ob die folgende Methode richtig gewählt ist?
Code:
    [self.arrayControllerEintrag setContent:self.array];

2. Ob ich in dem Array (wenn es die richtige Methode ist) nur Objekte aus dem ArrayController übergebe oder ob ich mit der for-Schleife diereckt auf die Werte in dem Objekt zugreifen kann?
 

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.560
Das war ja meine Frage: 1. Ob die folgende Methode richtig gewählt ist?

Das kann niemand beantworten, da keiner weiß, wozu das gut sein soll. Für den Code-Ausschnitt, um den es hier geht, hat diese Methode überhaupt keine Bedeutung, da der ArrayController (der sich wahrscheinlich in "arrayControllerEintrag" befindet, richtig?) im weiteren Code nicht mehr verwendet wird.

Ob ich in dem Array (wenn es die richtige Methode ist) nur Objekte aus dem ArrayController übergebe

Ich ahne jetzt, dass Du möglicherweise denkst, diese Methode würde irgendwelche Objekte in "array" ablegen. Diese Methode bewirkt allerdings eher das Gegenteil: Du sagst damit dem ArrayController, dass er seinen bisherigen Inhalt wegwerfen soll und ab sofort für die Präsentation des Arrays "self.array" zuständig ist. Falls der Controller auch vorher bereits für das Array "array" zuständig war, ist die Wirkung gleich Null. Wie gesagt ist die Wirkung aber sowieso völlig egal, da der Controller ja (zumindest in diesem Programmausschnitt) überhaupt nichts tut.

Ein ArrayController wird üblicherweise dazu verwendet, damit ein Objekt der grafischen Oberfläche (z.B. ein NSTableView) per KVO-Binding ohne weitere Programmierarbeit an eine Reihung von Objekten (z.B. ein NSArray) gebunden werden kann. Vielleicht verwendest Du diese Dinge an irgendeiner anderen Stelle im Programm?

Zum eigentlichen Problem:
Angenommen, Du hättest ein NSArray in der Property "eintraege", in dem sich (ausschließlich) Objekte der Klasse "Eintrag" befinden und diese Klasse definiert die beiden Properties "menge" und "preis". Dann könntest Du den HTML-Code für den WebView wie folgt erzeugen:

Code:
-(void) drucken
{
    NSMutableString *druckstring = [[NSMutableString alloc] initWithString:@"<html><head></head><body>"];
  
    for (Eintrag *eintrag in self.eintraege)
        [druckstring appendFormat:@"<p>Menge: %llu Preis: %f</p>", (unsigned long long)eintrag.menge, eintrag.preis];
    [druckstring appendString:@"</body></html>"];
    [[webview mainFrame]loadHTMLString:druckstring baseURL:nil];
}

Falls Du aber aus irgendeinem Grund das Array tatsächlich nicht im Rohzustand ausgeben willst, sondern in der speziellen Form, in der ein ArrayController dieses Array gerade auf der Benutzeroberfläche präsentiert (der Benutzer könnte z.B. gerade einen Suchfilter oder eine spezielle Sortierung auf das präsentierte Array angewendet haben), dann wäre die for-Zeile wie folgt zu ersetzen:

Code:
for (Eintrag *eintrag in [self.arrayControllerEintrag arrangedObjects]) ...
 
Zuletzt bearbeitet: