Универсальное приложение для iOS: UIWebView подробно ViewController не отображает контент для части iPad - PullRequest
0 голосов
/ 24 октября 2011

Я работаю над Универсальным приложением iOS для Xcode 4 .Я впервые пытаюсь создать приложение для iPhone / iPad.Я использую шаблон приложения Master-Detail .Это приложение является примерно RSS Feed Reader.Я следовал этому руководству, чтобы понять основную идею: http://cocoadevblog.com/iphone-tutorial-creating-a-rss-feed-reader

Мне удалось заставить работать часть iPhone, но у меня проблема с UIWebView в части iPad.

Воткод, который может быть неправильным.

Из MasterViewController ...:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    if (!self.detailViewController) {
        NSDictionary *theItem = [items objectAtIndex:indexPath.row];  
        DetailViewController *nextController = [[DetailViewController alloc] initWithNibName:@"DetailViewController_iPhone" bundle:nil];
        [nextController setDetailItem:theItem];
        [self.navigationController pushViewController:nextController animated:YES];
    }

}
else {
    if (!self.detailViewController){
        NSDictionary *theItem = [items objectAtIndex:indexPath.row];  
        DetailViewController *nextController = [[DetailViewController alloc] initWithNibName:@"DetailViewController_iPad" bundle:nil];
        [nextController setDetailItem:theItem];
        self.detailViewController = nextController;
    }
    else {
        [self.detailViewController setDetailItem:[self.items objectAtIndex:indexPath.row]];
    }
}

}

... в DetailViewController, здесь есть реализация setDetailItem: и configureView:

- (void)setDetailItem:(id)newDetailItem
{
    if (_detailItem != newDetailItem) {
        _detailItem = newDetailItem;       
        // Update the view.
        [self configureView];
    }
    if (self.masterPopoverController != nil) {
        [self.masterPopoverController dismissPopoverAnimated:YES];
    }        
}

- (void)configureView
{
    // Update the user interface for the detail item.
    if (_detailItem) {
        NSLog(@"webpage creation");
        NSString *html = [_detailItem objectForKey:@"title"];

        [...html stuff added to html string...]

        webView = nil;
        webView.delegate=self;
        //[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]]];
        [self.webView loadHTMLString:html baseURL:nil];

        NSLog(@"webView loaded");
    }
}

Я получил пустой экран на панели detailView, когда я выбираю строку в MasterView (MasterView / detailView -> в случае универсального приложения, приложение iPad представляет собой приложение в стиле splitview).

Я связал webView в InterfaceBuilder (для обоих файлов iPhone / iPad .xib), я получил каждый NSLog, но я не могу заставить UIWebViewDelegate отвечать мне, даже если я его реализовал.Конечно, комментарий с загрузкой главной страницы Google тоже не работает.

ОБНОВЛЕНИЕ 25/10/11:

Я создал новое универсальное приложение, простое, где я добавил UIWebView, и я пытаюсь загрузить веб-страницу Google.Я могу загрузить страницу из viewDidLoad / viewDidAppear (detailViewController), но не из configureView (detailViewController), который вызывается, когда я выбираю строку (запускаем setDetailItem в detailViewController).Как будто я не могу изменить его после загрузки панели.Есть кое-что, чего я не понимаю.(Код, который я использую для запуска веб-страницы, имеет ту же строку кода, что и комментарий выше в configureView)

ОБНОВЛЕНИЕ 26/10/11

Веб-просмотр не имеет значения(null) в configureView (когда я пытаюсь отобразить его для выбранной строки).Я попробовал это, но это не работает, но я (очевидно / по крайней мере) получаю значение для webView в этом случае:

- (void)configureView{
if (_detailItem) {

    UIWebView *tempWebView = [[UIWebView alloc] init];
    self.webView = tempWebView;

    NSLog(@"webpage creation");
    NSString *html = [_detailItem objectForKey:@"title"];

    [...html stuff added to html string...]

    //[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]]];
    [self.webView loadHTMLString:html baseURL:nil];


    self.webView.delegate=self;//better to add "self" to get it working
    NSLog(@"webView loaded");
    NSLog(@"%@",self.webView); //i got this : <UIWebView: 0x6a5a550; frame = (0 0; 0 0); layer = <CALayer: 0x6a59750>>
}}

Путем записи "self.webView.delegate = self;"мне ответили делегаты.Однако этот ответ дает два ответа (??), как если бы были запущены два webView?:

2011-10-26 10: 49: 57.089 APPName [18334: f803] didStart Загрузка веб-страницы

2011-10-26 10: 49: 59.416 APPName [18334: f803] didStart Загрузка веб-страницы

2011-10-26 10: 49: 59.523 APPName [18334: f803] закончила загрузку веб-страницы

2011-10-26 10: 49: 59.806 APPName [18334: f803] завершена загрузка веб-страницы

Ответы [ 3 ]

2 голосов
/ 27 октября 2011

Наконец-то все заработало.

Однако единственное решение, которое я нашел, - это создать еще один проект с STORYBOARD, а не с файлами xib, что, как мне кажется, было проблемой.

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

С раскадровкой я легко разработал версию для iPad, но не версию для iPhone ... пока не нашел хороший учебник: http://www.youtube.com/watch?v=NHIOx_1mz-Q

Так что дляРаскадровка, я удалил раздел просмотра таблицы (вставлен по умолчанию) и поместил этот код:

MasterViewController

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    NSLog(@"SELECT ROW IPHONE");
    if (!self.detailViewController){
        NSDictionary *theItem = [items objectAtIndex:indexPath.row];  
        DetailViewController *nextController = [self.storyboard instantiateViewControllerWithIdentifier:@"Detail"];
        [nextController setDetailItem:theItem];
        [self.navigationController pushViewController:nextController animated:YES];
   }

}
else {
    NSLog(@"SELECT ROW IPAD");
    self.detailViewController.detailItem = [self.items objectAtIndex:indexPath.row];
}

}

DetailViewController

- (void)configureView{
// Update the user interface for the detail item.
if (self.detailItem) {
    self.detailDescriptionLabel.text = [self.detailItem description];
    self.webView.delegate=self;
    NSString *html = @"";
    [...html stuff...]
    [self.webView loadHTMLString:html baseURL:nil];
}

}

Я не упоминаю об этом, но я, конечно, также создал и создал ссылку на веб-сайт.

Если кто-то найдет ответ для xib-версии простого проекта с TableView, привязанным к detailView для iPad (в проекте Universal iOS), я бы хотел его услышать.

0 голосов
/ 01 октября 2012
  • Контроллер разделенного представления всегда должен быть корнем любого интерфейса, который вы создаете.
  • Панели интерфейса с разделенным видом могут содержать навигационные контроллеры, контроллеры панели вкладок,…
  • контроллер разделения вида автоматически обрабатывает большинство режимов вращения

И мы не можем использовать UISplitViewController внутри TabBars !!

0 голосов
/ 25 октября 2011

Я не знаю, решит ли это вашу проблему полностью, но по крайней мере эта строка является подозрительной:

    webView = nil;

Мне кажется, что вы устанавливаете webView равным нулю непосредственно перед тем, как установитьделегировать?Если в этот момент он равен нулю, делегат не может быть установлен.Фактически, когда вы пытаетесь отправить ему какие-либо сообщения, он просто игнорирует их.

(Также это может быть утечка памяти.)

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