2009-05-05 3 views
1

Ich mache eine einfache Tab-Leiste iPhone-Anwendung. Es hat zwei Registerkarten, eine mit einem UIWebView und die andere mit ein paar Textfeldern, um Einstellungen zu speichern, und eine Schaltfläche, um die Einstellungen zu speichern.iPhone-Anwendung - Wie kann eine View eine Methode in einer anderen View aufrufen?

Was ich tun möchte, ist die UIWebView nachladen, wenn der Benutzer klickt auf die Registerkarte Einstellungen/Ansicht speichern. Ich habe bereits die Einstellungen gespeichert, ich muss nur herausfinden, wie man einen Anruf einleitet, um das UIWebView selbst zu aktualisieren.

Ich bin verwirrt darüber, wie eine Ansicht, Nachrichten an eine andere Ansicht senden.

Antwort

4

Was ich getan habe ist haben sie über die AppDelegate miteinander reden.

Zum Beispiel:

Ansicht1 wird eine Funktion haben, das tut:

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    [appDelegate myFunction]; 

MyAppDelegate eine Funktion namens myFunction hat, die entweder etwas tun, oder rufen Sie:

[viewController myViewFunction]; 

I‘ Sie haben ein ziemlich nettes System eingerichtet, um mehrere Ansichten zu laden (und navigieren Sie hin und her, als wären sie verschiedene Bildschirme). Ich habe einfach nicht die Zeit gemacht, dies zu schreiben und es Post an pushplay.net - aber ich werde versuchen, so in den nächsten paar Tage zu tun ...

===

EDIT: Okay, ich habe gepostet, was ich habe. Irgendwelche Kommentare würden geschätzt.

http://pushplay.net/blog_detail.php?id=27

Ich verstehe, was die commen unten sagen, aber ich habe noch ein Beispiel zu sehen, die sich nahtlos funktioniert, basierend auf mehreren Viewcontrollers, die zwischen miteinander navigieren zu müssen.

+0

Danke, das Sinn macht. Achten Sie darauf, hier zu posten, wenn Sie Ihren Beitrag im Detail zeigen. – Greg

+0

Sie sollten den Anwendungsdelegaten nicht verwenden müssen, um Nachrichten in andere Ansichten zu übertragen. Dafür sind View Controller zuständig. –

+0

Dies ist der richtige _Kode_ des Codes, aber Sie sollten es in der ViewController tun, wie Nathan sagt. Versuchen Sie, dem appDelegate nicht mehr als nötig hinzuzufügen. Es wird groß genug, nur mit dem Zeug, das es besitzen muss. –

5

Die Tatsache, dass Sie diese beiden Ansichten in den Rahmen eines UITabBarController verwenden, um den Kern des Problems nicht relevant ist; dass Sie möchten, dass einem Teil Ihrer Bewerbung mitgeteilt wird, dass in einem anderen Teil etwas passiert ist. Der typische Weg, dies zu tun, ist mit KVO oder durch die NSNotificationCenter mit etwa so:

// Register interest in finding out when the settings are changed 
[[NSNotificationCenter defaultCenter] addObserver:myWebViewController 
    selector:@selector(refreshWebView:) name:@"settingsSaved" object:nil]; 

// Notify interested parties that the settings have changed 
[[NSNotificationCenter defaultCenter] postNotificationName:@"settingsSaved" object:nil]; 
+0

Richtig, außer ich denke, KVO und Benachrichtigungen klingt wie Overkill für dieses Problem –

1

Es ist auf der Komplexität der jeweiligen Anwendung abhängt und das Objektmodell in dieser Anwendung:

  • Wenn Die Sichten sind miteinander verknüpft und die Nachrichten, die nur für die Sichten relevant sind, können sich gegenseitig Nachrichten direkt senden. Zum Beispiel kann (und sollte) eine Ansicht Nachrichten direkt an ihre Unteransichten senden und sie können Nachrichten direkt an ihre Eltern senden.

  • Wenn die Ansichten nicht zusammengehören, aber Daten über die gleichen Informationen zeigen, sollten Sie die Meldungen über den viewController proxy - das ist genau, warum Sie einen View-Controller haben.

  • Wenn Sie eine komplizierte Anwendung mit einer starken MVC-Architektur haben, sollte die Kommunikation indirekt erfolgen, indem Sie die Modellobjekte aktualisieren und über ViewControllers in die Ansichten kaskadieren.

1

In diesem Fall sind Sie wahrscheinlich besser dran AppDelegate die Steuerung der Web-Ansicht als Delegierter des anderen View-Controller beim Programmstart halten zuweisen mit - Blick in ein Protokoll, sie sauber zu machen, aber Für etwas Einfaches können Sie den Delegattyp immer als Webansicht definieren, die den View-Controller enthält.

Benachrichtigungen sind auch eine gute Idee, und es gibt keine Aufgabe zu klein für sie - aber Sie sollten sich bewusst sein, dass es wichtig ist, Benachrichtigungen von Orten wie dealloc abzubestellen. Für die oberste Ebene eines Tab-View-Controllers, der aber eigentlich keine Rolle spielt.

0

Sie können in Ihrem Registerkartencontroller, der auf die Webansicht verweist, immer eine Instanzvariable einrichten. Stellen Sie es einfach als IBOutlet ein, verbinden Sie es im Interface Builder und rufen Sie dann Ihre Methode für die Instanzvariable auf.

.h-Datei:

IBOutlet UIWebView *webView; 

@property (nonatomic, retain) UIWebView *webView; 

.m-Datei:

@synthesize webView; 

//Then later in your method 
[webView refresh]; //or however you do it 

Grüße,

Kyle

Verwandte Themen