2012-04-06 9 views
1

Ich habe einige Tests mit einem kühlen Charts-Framework (http://www.shinobicontrols.com/shinobicharts/) und bis jetzt habe ich sie arbeiten an meinem Projekt. Sie sehen großartig aus!Arbeiten mit self.view nach Refactoring-Code

Wie bei jedem Test, implementiere ich die Beispiele so einfach wie ich kann und dann, wenn es funktioniert, gehe ich weiter, um die Dinge ein wenig in der Code-Organisationsabteilung zu verbessern.

Nachdem ich mich mit dem, was ich hatte, wohl fühlte, fing ich an, den Code ein wenig zu überarbeiten. Jetzt kann ich die Charts nicht aus meiner Sicht ziehen. Ich habe die Aufrufe von Methoden mit NSLog getestet und alles wird wie erwartet aufgerufen. Es ist die Sichtweise, mit der ich mich hier gedreht habe. Lassen Sie mich erklären, was ich hatte (als es funktionierte) und was ich tat (um es zu brechen).

Arbeits Szenario:

  • ReportsViewController 1) Imported chartLibrary.h 2) Importierte chartDatasource.h 3) Erstellt Ansicht und fügte mit [self.view addSubview:chart];

alle an der gleichen Stelle. Alles gut.

Was ich getan habe meinen Code zu organisieren:

1) eine neue Klasse „ChartReports“ geführt (Zuerst dachte ich, es NSObject sein sollte, aber dann konnte ich nicht mit Ansichten arbeiten, damit ich UIViewController geändert) 2) Alle Importe und Zeichencodes wurden in diese neue Klasse verschoben. Erstellen Sie Zeichenmethoden für jeden Diagrammtyp. 3) Importierte "ChartReports" in "ReportsViewController" 4) Neues Objekt (vom Typ ChartReports) erstellt und die neue Methode an "drawChartX" genau an der Stelle aufgerufen, an der ich zuvor den ganzen Code hatte (innerhalb von "ReportsViewController")

Es ging alles Süden :(

die Sache ist, dass der Anruf richtig ist, die Methode „drawChartX“ genannt wird, und ich NSLog von Anfang bis Ende des Code, um sicherzustellen, ausgeführt wird, aber nichts ist in der Unentschieden . Bildschirm

schaffe ich es und es so nennen:

ChartReports *chart = [[ChartReports alloc] init]; 

[chart drawChartX]; 

Wenn ich den Code sehe, den ich verschoben habe (von "ReportsViewController" zu "ChartReports"), merke ich, dass überall "self.view" steht. Ich denke, das ist der Ort, an dem die Zeichnung bricht. "self" bezieht sich ursprünglich auf "ReportsViewController" und bedeutet nun "ChartReports".

Also, nach all dem: Wie kann ich "ChartReports" auf "ReportsViewController" .view und nicht auf eine eigene Sicht zeichnen?

Ich versuchte Variablen und Eigenschaften ohne Glück. Soll ich den Namen der Ansicht als Methodenparameter angeben?

Es tut mir leid, eine so lange Erklärung zu posten, aber ich habe keine Ideen zu versuchen. Jeder allgemeine Tipp wäre mehr als hilfreich, um wieder auf den richtigen Weg zu kommen.

Dank wie üblich,

Antwort

1

Ihre ChartReports Objekt sollte auf Ihrem ReportsViewController nicht ziehen, würde dies grundlegenden MVC Prinzipien brechen. Stattdessen sollten Sie Ihren Code so organisieren, dass das ChartReports-Objekt eine Ansicht erstellt und zurückgibt (d. H.das Diagramm), das Ihr ReportsViewController dann unter Verwendung von addSubview zu seiner Ansicht hinzufügt.

Auf diese Weise können Sie immer noch die Erstellung der Diagramme in einem separaten Objekt (ChartReports) kapseln, aber Sie verlassen die Arbeit der Anzeige des Diagramms zu Ihrem View-Controller, der seine Aufgabe ist.

+0

Hallo @jonkroll. Ich verstehe was du sagst. Ich werde versuchen, es umzusetzen (ich bin neu darin), aber ich habe eine andere Frage, die von Ihrer scharfen Beobachtung des MVC abgeleitet ist. "Zeichnen" bezieht sich hier nur auf den "addSubview" -Teil oder Dinge wie initWithFrame, autoresizingMask und Label-Zuweisung sind ebenfalls enthalten? Ich würde nein sagen, aber wenn du bestätigen kannst, werde ich all das auf dem ChartsReport-Objekt hinterlassen. –

+0

Ich würde sagen, es ist in Ordnung für ChartsReport, alle Aspekte des Erstellens und Konfigurierens der Diagrammansicht zu behandeln, die all die Dinge enthält, die Sie erwähnen: die init, autoresizingMask, Zuweisen von Eigenschaftswerten usw. So wird Ihr View-Controller nicht benötigt kennen die Details zum Einrichten der Ansicht, und das ChartsReport-Objekt muss nichts darüber wissen, wie die Ansicht nach der Einrichtung verwendet wird. – jonkroll

Verwandte Themen