2010-12-15 8 views
4

Grundsätzlich habe ich eine WebView auf SecondViewController und ich wünsche, dass die WebView auf jeder Ansicht wie eine Tab-Leiste sichtbar und in jeder Ansicht vollständig steuerbar ist.Gleiches WebView auf jeder Ansicht

Bitte beachten Sie die WebView auf einer Webseite mit einer Online-Diashow wird, so kann ich nicht einfach auf jede Ansicht nachladen

Auch im SecondViewController Ich habe

- (void)webViewDidFinishLoad:(UIWebView *)YouTubePlayer { 

Antwort

1

Ich würde gerade ein Singleton UIWebView einrichten und es zu jeder View-Controller-Ansicht hinzufügen, wenn dieser View-Controller im Begriff ist, sichtbar zu werden. Hier ist eine Möglichkeit, es zu tun:

//.h 

@interface SharedWebView : UIWebView 
{ 
} 

+ (SharedWebView*) shared; 

@end 

//.m 

SharedWebView* g_sharedWebView; 

@implementation SharedWebView 


+ (SharedWebView*) shared 
{ 
    if (g_sharedWebView == nil) 
    { 
     g_sharedWebView = [[SharedWebView alloc] init]; 

     // ... any other intialization you want to do 
    } 

    return g_sharedWebView; 
} 

@end 


// in your view controller(s) 

@property (readonly) UIWebView* webView 

- (UIWebView*) webView 
{ 
    return [SharedWebView shared]; 
} 

- (void) viewWillAppear: (BOOL) animated 
{ 
    [super viewWillAppear: animated]; 

    [self.view addSubview: self.webView ]; 
    self.webView.frame = CGRectMake(10, 10, 300, 300); 

    // want to re-set the delegate? 
    // self.webView.delegate = self; 
} 
+0

Ich bekomme einen Fehler mit der - (UIWebView *) webView { zurück [SharedWebView freigegeben]; } in .h – user393273

+0

Was ist der Fehler? – TomSwift

0

Klingt wie Sie versuchen Blick auf platzieren oben in dieser Ansicht, aber nicht modal. Es gab diesen Blogeintrag, den ich einmal gesehen habe und der beschrieben hat, wie man so etwas machen würde. Ich denke, es sollte auch für Ihren Fall gelten: semi-modal-transparent-dialogs-on-the-iphone

+0

Ich verwende Registerkarten in der Ansicht, wenn dies einen Unterschied macht – user393273

-1

Könnten Sie nicht zwei Webviews auf Ihrer Anwendung verwenden und einfach die oberste Webansicht mit Ihren dynamischen Inhalten ändern?

+0

nein, das ist nicht das, was benötigt wird – user393273

0

In iOS wird von UIViewControllern erwartet, dass sie einen ganzen "Bildschirm" Inhalt verwalten, so dass es nicht normal ist, eine einzelne Ansicht über viele View-Controller zu teilen. Der Versuch, UIViewControllers zu verwenden, deren Ansichten nur einen Teil ihres Fensters verwalten, ist problematisch und wird zu einem unerwarteten Verhalten führen, da UIKit keine Nachrichten wie -viewWillAppear an alle View-Controller mit sichtbaren Ansichten sendet. Stattdessen würden Sie normalerweise einen einzelnen UIViewController erstellen, dessen Ansicht diese Webansicht und alle anderen Ansichten enthält, aus denen Ihre Registerkarte besteht. Alternativ könnten Sie eine Hierarchie von vielen View-Controllern haben und eine einzelne Web-Ansicht als Unteransicht von allen hinzufügen. Sie würden dann das Verhalten Ihres Web-View-Delegierten in eine Nicht-UIViewController-Controller-Klasse ziehen, um das Verhalten der Web-Ansicht zu verwalten.

0

Sie können alle Ihre Ansichten nehmen einen Teil des Bildschirms und lassen Sie Ihre UIWebView den Rest aufnehmen. Die Logik zum Umschalten zwischen den anderen Ansichten sollte gleich bleiben.

Zum Beispiel in Ihrem viewDidLoad Methode für Ihre UIViewController s, könnten Sie so etwas wie haben:

self.view.frame = CGRectMake(0, 100, 320, 380); 

Und in Ihrem (sagen wir) AppDelegate, würden Sie Ihren normalen Anruf haben die Haupt UIViewController zu zeigen (in Ihr Fall, es klingt wie ein UITabBarController?) und haben auch einen Anruf, um die UIWebView hinzuzufügen. Sagen Sie, so etwas wie:

myWebView.view.frame = CGRectMake(0, 0, 320, 100); 

Die View-Controller und UIWebView wäre unabhängig voneinander.

Sie sehen dieses Muster, glaube ich, mit Apps, die iAds haben. Ich habe so etwas mit einer meiner kostenlosen Apps gemacht.

Hoffe, das hilft!

+0

Die Stammansicht eines UIViewControllers (die als 'view'-Eigenschaft verfügbar gemacht wird) wird voraussichtlich das Fenster ausfüllen und automatisch skalieren. Das Erstellen eines Controllers mit einer Ansicht, die nur einen Teil des Bildschirms ausfüllt, ist problematisch und kann zu einem unerwarteten Verhalten führen, wenn UIKit die Lifecycle-Nachrichten für den Controller-Normalansicht-Controller nicht senden kann. – Jonah

1

Der einfachste Ansatz besteht darin, alle View-Controller auf diese zusätzliche Ansicht aufmerksam zu machen (machen Sie die Ansicht über einen Singleton PinedViewController oder was auch immer verfügbar). Während jede Ansicht des Controllers -viewWillAppear, gerade dies tun:

[self addSubview:[[PinnedViewController sharedController] view]]; 

Dies wird die Ansicht bewegen, wer gerade aktiv ist (was eine Ansicht automatisch Ihr Subview Sie von Ihrer alten Hierarchie entfernt).

Wenn das umständlich oder nicht durchführbar ist, gibt es zwei andere Optionen. Zuerst können Sie die Unterklasse UITabViewController (ich nehme an, dass Sie das hier aus Ihrer Frage verwenden) und Ihre zusätzliche Ansicht injizieren (Größe der Inhaltsansicht ändern, um Platz zu schaffen). Dies ist nicht dokumentiert und wird nicht unterstützt. Aber es ist nicht unglaublich schwierig, wenn du nicht zu viele andere Tricks machst.

Die andere knifflige Lösung ist eine zweite UIWindow, die Sie über das Haupt UIWindow (oder die Größe des Haupt UIWindow Raum für sie zu machen) schweben zu erstellen. Dies ist nur halb dokumentiert und wird auch nicht wirklich unterstützt. Dieser Ansatz kann jedoch funktionieren, wenn Sie beispielsweise versuchen, die zusätzliche Ansicht unterhalb der Tableiste zu platzieren.

Aber wenn Ihr System einfach genug ist, empfehle ich, dass Ihre View-Controller alle die fixierte Ansicht manuell verwalten. Auf diese Weise sparen Sie eine Menge Code-Spelunking und Sie müssen sich nicht auf irgendwelche nicht dokumentierten internen Ansichtshierarchien verlassen.

3

Ich würde vorschlagen, die webView auf Sie Fenster nach dem Hinzufügen fügen Sie die tabbarcontroller.view gerade mag:

[window addSubview:tabbarController.view]; 
[window addSubview:webview]; 
[window makeKeyAndVisible]; 

und zunächst nicht machen es sichtbar machen. Sie sollten alle webview-bezogenen Methoden im App-Delegaten behandeln. Jetzt, wann immer Sie es nicht brauchen, können Sie es verstecken, indem Sie die Methoden aufrufen, die Sie in den Anwendungsdelegaten von Ihren View-Controllern geschrieben haben.

Hoffe, das hilft.

0

bekam ich die gleiche Wirkung, indem sie einfach auf die Navigation Zugabe selbst (wenn Sie noch kein Konto haben, dann fügen Sie einfach es). funktioniert gut für mich in einer meiner Apps.

Verwandte Themen