Frage

Normalerweise habe ich in Init -Methoden eine Variable übergeben, das diesmal jedoch nicht tun kann Bar wird gedrückt. Mein Verständnis war, dass Sie mit @Property auf Vars zugreifen können, aber es funktioniert jetzt, also mache ich etwas falsch. Hier ist was ich habe:

Class 1 Header file

@interface DailyViewController : UIViewController <UIActionSheetDelegate> {

NSDate *today;

}

@property (readwrite, nonatomic, retain) NSDate *today;



Class 2 implementation file:


- (void)viewWillAppear:(BOOL)animated{

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterLongStyle];
[formatter setTimeStyle:NSDateFormatterNoStyle];
DailyViewController *otherClass = [[DailyViewController alloc] init];   

NSString* todayString = [formatter stringFromDate:otherClass.today];
r_todayLabel.text = todayString;
[otherClass release];
[formatter release];

}

War es hilfreich?

Lösung

Sie müssen das DailyViewController* -Objekt von Ihrem AppDelegate (oder wo immer es gespeichert) abrufen und das Datum daraus abrufen.

Sie erstellen ein neues DailyViewController* -Objekt, initialisieren Sie es nicht mit seinem Datum und greifen dann auf das Feld "Datum" (das standardmäßig nicht null ist).

Etwas wie

MyAppDelegate* appDelegate = [[UIApplication sharedApplication] delegate];
DailyViewController *otherClass = appDelegate.dailyViewController;
NSDate* dailyViewToday = otherClass.today;

Allerdings ist alles, was gegen viele Regeln für eine gute Programmierung verstößt.

Erstens sollten Sie MVC (Modellansichts -Controller) anstreben, sodass Ihr "Today" -Datum in Ihrem Modell gespeichert werden sollte. Dann könnten beide Klassen heute aus dem Modell als aus dem Controller einer Ansicht zugreifen. Anschließend wäre es nicht erforderlich, dass Klasse 2 auf den DailyViewController zugreifen muss, und daher müssen keine Verweise darauf in der AppDelegate speichern, was eine schlechte Idee ist Da es nichts mit Delegation für die UIApplication zu tun hat und wirklich nur eine globale Variable in Verkleidung ist.

Andere Tipps

Ohne zu haben

@synthesize today;

In Ihrer "class1.m" -Datei werden die Getter- und Setter -Methoden für heute nie erstellt. Dies bedeutet, dass Ihr Eigentum von außen nicht geändert oder gesehen werden kann.

In der Quelldatei "class1.m" haben Sie

@synthesize today;

Sie müssen heute initialisieren, zum Beispiel im Konstruktor von DailyViewController Folgendes Hinzufügen:

self.today = [NSDate date];

Wenn Sie sich die Antwort von Peter ansehen ("Erstens sollten Sie MVC (Modellansichts -Controller) anstreben, also sollte Ihr" Today "-Datum in Ihrem Modell gespeichert werden. Dann können beide Klassen heute nicht vom Modell und nicht aus dem Controller und dem Controller einer Ansicht und dem Controller und dem Controller einer Ansicht zugreifen können. Dann wäre es nicht erforderlich, dass Klasse 2 überhaupt auf den DailyViewController zugreift, und daher müssen keine Verweise darauf im AppDelegate gespeichert werden, was eine schlechte Idee ist, da es nichts mit Delegation für die UIApplication zu tun hat und wirklich nur eine ist Globale Variable in Verkleidung. ") Ich habe eine Frage.

Wie greifen beide Klassen auf das Modell zu? Würde der Init -Aufruf für jeden Ansichtscontroller in einen Zeiger an das Modell übergeben werden? (dh das AppDelegate erstellt das Modellobjekt und übergibt dann den Zeiger an die Init -Methoden des Ansichtskontrollers?)

Sal

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top