UIWebView отношения родительского окна в приложении iPad - PullRequest
0 голосов
/ 24 июня 2011

Итак, у меня сложная проблема. Я работаю над приложением для iPad для веб-приложения. Мы уже создали мобильную версию веб-приложения, но также хотели бы иметь собственное приложение, так что это текущий проект.

Приложение имеет реляционную сетку, которая отображается с объектами, используемыми для анализа. Чтобы добавить сущности в мобильном браузере Safari и других браузерах для настольных компьютеров, нужно щелкнуть ссылку в верхней части приложения, которая открывает всплывающее окно с окном поиска. Пользователь ищет тему, а затем проверяет, какие объекты добавить в сетку. Затем пользователь нажимает кнопку во всплывающем окне, и окно исчезает и заполняет сетку выбранными объектами.

Однако у меня много проблем с выяснением того, как эти два окна взаимодействуют. На данный момент у меня открывается новый UIWebView при щелчке по этой конкретной ссылке, но соединение родитель-потомок не выполняется, как в версии браузера. Поэтому я могу выбрать объекты для добавления, но когда я нажимаю кнопку, объекты не добавляются в сетку. Я не уверен, как обойти это.

Другая проблема заключается в том, что после нажатия на ссылку вверху страницы я пытаюсь добавить объекты, а затем возвращаюсь на исходную страницу, ссылка, которая должна вызывать всплывающее окно, больше не работает.

Любая помощь будет оценена.

1 Ответ

1 голос
/ 24 июня 2011

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

Ваш контроллер будет действовать как UIWebViewDelegate для обоих UIWebView с, и его обязанности будут:

  1. создание второго UIWebView (размещение всплывающего окна) путем перехвата -webView:shouldStartLoadWithRequest:navigationType: (что, я думаю, вы уже делаете);

  2. перехватить щелчок по всплывающему окну и затем использовать – stringByEvaluatingJavaScriptFromString: для получения любой необходимой информации;

  3. передать эту информацию первому UIWebView с помощью – stringByEvaluatingJavaScriptFromString:.

У меня нет информации о том, какие данные передаются со второй страницы на первую, поэтому я не могу быть более подробным.

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

EDIT:

Прочитав ваш комментарий:

  1. UIWebView действительно жадный к касаниям. Если перехвата кликов по ссылкам через -webView:shouldStartLoadWithRequest:navigationType: недостаточно, вы можете прибегнуть к переопределению -(void)sendEvent:(UIEvent*)event в своем собственном UIWindow производном классе; но это необходимо, только если вы смешиваете UIWebView и, например, UIScrollView или когда вы хотите обрабатывать мультитач; смотрите здесь для получения дополнительной информации;

  2. вот пример того, как вы можете выполнить javascript:

    NSString *jsCall = [NSString stringWithFormat:@"yourFunction(%@);", arg]; [webView stringByEvaluatingJavaScriptFromString:jsCall];

Вы можете использовать это несколькими различными способами:

 `jsCall1 = @"var func = function(id) { var obj = document.getElementById(id); return id.value; }; func('dataObject');";
 `jsDataString = [popUp stringByEvaluatingJavaScriptFromString:jsCall1];
 `jsCall2 = NSString stringWithFormat:@"storeDataFromPopup(%@);", jsDataString];`
 `[parentUIWebView stringByEvaluatingJavaScriptFromString:jsCall1];`

РЕДАКТИРОВАТЬ 2:

Тестовое предложение: добавьте следующий код в ваш класс делегата:

 - (void)webViewDidFinishLoad:(UIWebView*)webView {
    ....    
    NSString* aaa = [_label stringByEvaluatingJavaScriptFromString:@"f();"];
    NSLog(@"AAA: %@", aaa);
 }

HTML содержит следующий фрагмент:

 <script type='text/javascript'>function f() { alert('called!');} alert('javascript OK!');</script>"

это даст вам первое предупреждение, означающее, что с js-анализом все в порядке, и второе, означающее, что функция f была вызвана из webViewDidFinish. Я сделал простой текст, получив веб-страницу и добавив к ней фрагмент javascript, и это сработало.

...