Один и тот же WebView при каждом просмотре - PullRequest
4 голосов
/ 15 декабря 2010

В основном у меня есть WebView на SecondViewController, и я хочу, чтобы WebView был виден на каждом представлении, как панель вкладок, и полностью управляемым на каждом представлении.

Обратите внимание на WebView будет на веб-странице с онлайн-слайд-шоу, поэтому я не могу просто перезагрузить каждый просмотр

Также в SecondViewController у меня есть

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

Ответы [ 8 ]

3 голосов
/ 04 января 2011

Я бы предложил добавить webView на вашем окне после добавления tabbarcontroller.view, например:

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

и изначально make не делает его видимым. Вы должны обрабатывать все связанные с webview методы в делегате приложения. Теперь, когда вам это не нужно, вы можете скрыть это, вызвав методы, которые вы написали в приложении делегировать из ваших контроллеров представления.

Надеюсь, это поможет.

1 голос
/ 04 января 2011

Я бы просто настроил одноэлементный UIWebView и добавил его к каждому представлению контроллера представления, когда тот контроллер представления собирается стать видимым.Вот один из способов сделать это:

//.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;
}
1 голос
/ 02 января 2011

Самый простой подход - просто информировать все ваши контроллеры представления об этом дополнительном представлении (сделать представление доступным через одноэлементный PinnedViewController или любой другой). Во время каждого контроллера -viewWillAppear, просто сделайте это:

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

Это переместит представление к тому, кто в данный момент активен (создание представления, которое ваше подпредставление автоматически удаляет из вашей старой иерархии).

Если это громоздко или иначе неработоспособно, есть два других варианта. Во-первых, вы можете создать подкласс UITabViewController (я полагаю, это то, что вы используете здесь из своего вопроса), и добавить ваше дополнительное представление (изменив представление содержимого, чтобы освободить место). Это без документов и без поддержки, так что будьте внимательны. Но это не невероятно сложно, если вы не делаете слишком много других хитростей.

Другим хитрым решением является создание второго UIWindow, который вы перемещаете над основным UIWindow (или изменяете размер основного UIWindow, чтобы освободить место для него). Это только частично документировано и также не поддерживается. Но этот подход может сработать, если вы пытаетесь поместить дополнительный вид, например, под панель вкладок.

Но если ваша система достаточно проста, я рекомендую просто разрешить всем контроллерам представлений управлять закрепленным представлением вручную. Таким образом вы сэкономите много кода, и вам не придется полагаться на какие-либо недокументированные внутренние иерархии представлений.

0 голосов
/ 06 января 2011

Я получил тот же эффект, просто добавив его в само навигационный контроллер (если у вас его нет, просто добавьте его).отлично работает для меня в одном из моих приложений.

0 голосов
/ 02 января 2011

Вы можете сделать так, чтобы все ваши представления занимали часть экрана, а ваши UIWebView занимали все остальное.Логика переключения между другими представлениями должна оставаться прежней.

Например, в вашем методе viewDidLoad для ваших UIViewController s вы можете получить что-то вроде:

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

А в вашем (скажем) AppDelegate у вас будет обычный вызов для показа основного UIViewController (в вашем случае это звучит как UITabBarController?), А также вызов для добавления UIWebView.Скажем, что-то вроде:

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

Контроллеры представления и UIWebView будут независимы друг от друга.

Вы видите этот шаблон, я полагаю, с приложениями, которые имеют iAds.Я сделал что-то подобное с одним из моих бесплатных приложений.

Надеюсь, это поможет!

0 голосов
/ 02 января 2011

В iOS ожидается, что контроллеры UIViewControllers будут управлять содержимым контента на весь экран, поэтому не принято пытаться разделять одно представление между несколькими контроллерами представления.Попытка иметь UIViewControllers, чьи представления управляют только частью их окна, проблематична и приведет к непредвиденному поведению, поскольку UIKit не будет отправлять сообщения типа -viewWillAppear всем контроллерам представления с видимыми представлениями.Вместо этого вы обычно создаете один UIViewController, чье представление включает в себя это веб-представление и любые другие представления, составляющие вашу вкладку как интерфейс.В качестве альтернативы вы можете иметь иерархию многих контроллеров представления и добавить одно веб-представление в качестве подпредставления для всех из них.Затем вы бы вытянули поведение делегата веб-представления в некоторый класс контроллера, отличный от UIViewController, чтобы управлять поведением веб-представления.

0 голосов
/ 16 декабря 2010

Не могли бы вы использовать два веб-просмотра в вашем приложении и просто изменить самый верхний веб-просмотр с более динамичным контентом?

0 голосов
/ 16 декабря 2010

Звучит так, будто вы пытаетесь поместить представления поверх этого представления, но не модально.Была одна запись в блоге, которую я однажды увидел, описывающая, как вы будете делать что-то подобное.Я думаю, что это применимо и для вашего случая: полу-модальные прозрачные диалоги на iphone

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...