Pausen-Menü realisieren

G

GENETIC4

Mitglied
Thread Starter
Dabei seit
01.08.2013
Beiträge
47
Reaktionspunkte
0
Grüß euch! Ich bins mal wieder. :)

Ich habe nun ein Spiel entwickelt, bei welchem mir noch ein Pausen-Menü fehlt. Das ist sollte auch kein wirkliches Problem darstellen, außer: Angenommen man stoppt das Spiel und das Pausen-Menü erscheint - Wie bekomme ich es hin, dass Steuerelemente im Hintergrund nicht mehr bedienbar sind?

Danke im Voraus! Euch ein angenehmes Wochenende!

Mit freundlichen Grüßen
GENETIC4
 
Ein Modales popup?
 
Hat sich schon erledigt... Hab schon eine Idee wie ich das machen kann. Trotzdem danke! Eine Frage habe ich aber trotzdem: Wie kann man hier Themen schließen?
 
Hab doch noch eine Frage... :D Und zwar: Das Pausen-Menü soll ja erscheinen sobald die AppDelegate-Methode applicationWillResignActive aufgerufen wurde. Dazu soll am besten eine Methode aus dem ViewController aufgerufen werden, welche das Menü erscheinen lassen soll. Dazu muss ich ja soweit ich weiß eine Instanz des ViewControllers erstellen... Das macht man so (ODER?):

RNViewController
* viewController = [[RNViewController alloc] init];

Die Methode rufe ich dann wie folgt auf:

[viewController pause];

Nur leider wird die Methode überhaupt nicht ausgeführt. :( Könnt ihr mir sagen woran das liegt? Die Methode an sich funktioniert einwandfrei.

DANKE!
 
Das Pausen-Menü soll ja erscheinen sobald die AppDelegate-Methode applicationWillResignActive aufgerufen wurde.
RNViewController
* viewController = [[RNViewController alloc] init];

Hallo,
du hast also die von mir zitierte Zeile eins zu eins in deiner applicationWillResignActive: Methode des AppDelegate stehen?
Das kann nicht funktionieren. Der Grund ist folgender: Du legst damit einen neuen RNViewController an, der von dem, der im Moment auf dem Bildschirm ist, völlig unabhängig ist. Was du tatsächlich möchtest, ist dass das AppDelegate mit dem aktuell sichtbaren RNViewController arbeitet. Das kannst du zum Beispiel erreichen, indem du im Header deines AppDelegate ein @property für den RNViewController anlegst und sobald viewDidAppear: im RNViewController aufgerufen wird, dieses @property auf self - sprich dem gerade sichtbar gewordenen View Controller - setzt. Analog setzt du die RNViewController Referenz in der viewDidDisappear: Methode wieder auf nil, damit das AppDelegate nicht versucht damit zu arbeiten, wenn der RNViewController schon gar nicht mehr sichtbar ist.

Gruß Jörg
 
Also nachvollziehen warum das nicht funktionieren kann, kann ich nun. Aber was soll ich denn jetzt mit der viewDidAppear: und der viewDidDisappear:? Die werden doch insgesamt nur einmal aufgerufen... Es geht ja darum, dass wenn die Anwendung inaktiv/aktiv wird etwas passieren soll. Die Frage mal anders gestellt: Wie kann ich auf einen gerade aktiven/sichtbaren ViewController zugreifen?

LG GENETIC4
 
Also nachvollziehen warum das nicht funktionieren kann, kann ich nun. Aber was soll ich denn jetzt mit der viewDidAppear: und der viewDidDisappear:? Die werden doch insgesamt nur einmal aufgerufen... Es geht ja darum, dass wenn die Anwendung inaktiv/aktiv wird etwas passieren soll. Die Frage mal anders gestellt: Wie kann ich auf einen gerade aktiven/sichtbaren ViewController zugreifen?

LG GENETIC4
Du würdest bei meiner Lösung dafür sorgen, dass das Pausenmenü immer nur dann aufgerufen wird, wenn die view auch tatsächlich auf dem Screen ist. Logischerweise ist das die Zeit zwischen viewDidAppear: und viewDidDisappear:. So sorgst du dafür, dass immer nur der RNViewController der @property vom AppDelegate zugewiesen ist, der auch tatsächlich gerade sichtbar ist.

Wie du auf den gerade sichtbaren View Controller zugreifen kannst? Erst mal gar nicht. Wenn du selbst die ViewController austauschst, musst du auch selbst herausfinden, welcher VC gerade sichbar ist. Lässt du dir die Arbeit VCs zu tauschen aber von irgendeiner dafür gemachten Klasse abnehmen (NavigationController, TabBar, etc.), dann bietet diese meist auch die Möglichkeit den aktuell sichtbaren VC zu erfragen. Ein UIViewController bietet dir bspw. folgendes an:
@property(nonatomic, readonly, retain) UIViewController *visibleViewController
Diesen kannst du dann leicht erfragen und hast deinen VC.
 
Danke, dass ihr euch so bemüht, aber es funktioniert einfach nichts. :( Ich gehe jetzt schon seit 2 Stunden alle Möglichkeiten durch, aber es funktioniert einfach nichts. Ich habe mich auch schon bei StackOverflow durchgearbeitet, aber davon funktioniert auch nichts. Dabei möchte ich doch eigentlich nur eine Methode einer eigenen Klasse in einer anderen Klasse aufrufen. Das kann doch nicht so schwer sein!!!??? :( Wenn die Sprache wirklich logisch wäre, dann müsste das doch einfach so aussehen oder?:

[RNViewController pause];

Wenn ich eine Methode in der eigenen Klasse aufrufe sieht das doch auch so einfach aus:

[self pause];

Wieso klappt das einfach nicht? :(
 
Ich möchte von euch ja auch keinen fertigen Code haben. Sonst lerne ich dabei ja nichts. Mir macht es ja auch Spaß selbst zu experimentieren. Umso mehr freut man sich wenn man es später selbst geschafft hat. Außerdem wird man das dann auch nicht mehr so schnell vergessen. Aber hier weiß ich wirklich nicht weiter. :(
 
Wenn die Sprache wirklich logisch wäre, dann müsste das doch einfach so aussehen oder?:

[RNViewController pause];

;)

Was du da geschrieben hast ist, dass du versuchst eine Methode für die Klasse RNViewController aufzurufen, was du möchtest ist aber eine Methode für ein bestimmtest Objekt vom Typ RNViewController aufzurufen.

Der Code dazu sähe dann in etwa so aus:

[myVC pause];

Dabei müsstest du myVC vorher als RNViewController deklarieren und myVC einen sinnvollen RNViewController zuweisen.
 
Nochmal.
Das hat in der AppDelegate nichts zu suchen.

Verschicke eine Notification
Die Klasse Viewcontroller als observer und wenn eine notification verschickt wird, bekommt der VC das mit und kannst du dann per [self pause] was machen.
 
Nochmal.
Das hat in der AppDelegate nichts zu suchen.
Verschicke eine Notification
Das die Notification die elegantere Lösung ist, ist mir auch klar, aber irgendwas schien ja für ihn dagegenzusprechen (wenn ich auch nicht weiß, was). Von daher hatte ich nach einer alternativen Lösung gesucht.

Mittlerweile tippe ich da aber eher auf etwas lückenhafte Objective-C Kenntnisse (nicht böse gemeint - wir haben ja alle mal angefangen ;) ).
 
das war auch nicht auf dich bezogen,

ich hab das gleiche nur schonmal in einem anderen Thread geschrieben der auch von ihm war
 
Gut, dann werde ich es nochmal mit der Notification versuchen. Ihr werdet schon wissen, was ihr da sagt.
Wird das dann so geschrieben??:


[[
NSNotificationCenterdefaultCenter] addObserver : self selector : @selector (pause) name : @"Was kommt hier rein?" object : nil];

Und in welche Methode kommt das dann?

LG. GENETIC4

 
in den ViewController in dem du die methode pause hast kommt , am besten in die Init

[[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(notificationApplicationWillResignActive: ) name:mad:"applicationWillResignActive" object:nil];

selector ist dann
- (void)notificationApplicationWillResignActive: (NSNotification *)notification
{
[self pause];
}

und in der AppDelegate in der methode applicationWillResignActive, verschickst du die Notification

[[NSNotificationCenter defaultCenter] postNotificationName:mad:"applicationWillResignActive" object:nil];

und fertig, kein unnötiges rumgehampel mit ViewControllern im AppDelegate
 
Tatsächlich... Es funktioniert! :D Ich kann es gar nicht glauben. DANKE! So schnell vergesse ich das nicht wieder.

Vielen Dank!
 
Zurück
Oben Unten