Как загрузить веб-страницу с помощью didSelectRowAtIndexPath, не выходя из приложения?

#iphone #uitableview #sdk #safari #webpage

#iPhone #uitableview #sdk #safari #HTML

Вопрос:

Я анализирую RSS-каналы и загружаю результаты в таблицу. Когда пользователь нажимает на историю, он попадает на веб-страницу.

На данный момент я использую:

 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:story]];
  

Проблема в том, что при этом запускается Safari и закрывается мое приложение.

Есть ли способ открыть веб-страницу, так сказать, в моем приложении? Я бы хотел, чтобы веб-страница отображалась с кнопкой «Готово», которая закрывает веб-страницу и возвращает пользователя обратно в таблицу.

Мы высоко ценим любую помощь (и примеры кода).

Ответ №1:

Вы можете использовать UIWebView в новом контроллере просмотра, запущенном с помощью NavigationController pushViewController selector, и иметь элемент панели инструментов для «Просмотра в Safari», который запустит полноценный браузер Safari (и переведет ваше приложение в фоновый режим / завершит работу).

Несколько примеров фрагментов кода:

Предположения: (1) У вас есть контроллер просмотра под названием: WebViewController (с тем же файлом .xib). (2) Этот контроллер представления имеет UIView, который является подвидом основного представления;

 @interface WebViewController: UIViewController <UIWebViewDelegate> {
    UIWebView *webview;
    NSString *someUrlToLoad;
}

@property (nonatomic, retain) IBOutlet UIWebView *webview;
@property (nonatomic, copy) NSString *someUrlToLoad;
  

В этом методе viewDidLoad контроллера viewDidLoad:

 -(void) viewDidLoad {
    [super viewDidLoad];
    [webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.someUrlToLoad]]];
}
  

Вы загружаете этот контроллер, когда кто-то нажимает на ячейку в вашем tableview:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    WebViewController *viewController = [[WebViewController alloc] initWithNibName:@"WebViewController" bundle:nil];
    viewController.someUrlToLoad = <url for this cell>;
    [self.navigationController pushViewController:viewController animated:YES];
    [viewController release];

}
  

Скорее всего, вы захотите включить какой-нибудь хук в UIWebViewDelegate, чтобы остановить / показать индикатор активности на панели навигации, чтобы пользователь знал, что что-то происходит во время загрузки страницы.

Комментарии:

1. Спасибо chilitechno. Я немного новичок, поэтому ваша рекомендация немного сбивает с толку. Переключится ли это в новую строку или создаст вложенное представление, которое будет перекрывать таблицу? Мне нужно показать только одну веб-страницу (по одной на каждую строку таблицы), поэтому мне не нужны все возможности Safari. Есть шанс, что вы могли бы опубликовать какой-нибудь пример кода? Большое спасибо.

2. Обновил ответ некоторыми примерами фрагментов. Я рекомендую загрузить новый контроллер просмотра с содержимым, чтобы пользователь мог нажать кнопку «Назад», когда они закончат просмотр содержимого веб-страницы.

3. будьте осторожны с тем, что вы отображаете ВНУТРИ webview вашего приложения. существуют некоторые ограничения относительно того, что вы можете показывать. например: вы должны показать любую страницу «пожертвования» в самом приложении safari, используя [[UIApplication sharedApplication] openURL:[NSURL URLWithString:story]]; указанную вами функцию. вероятно, вам не о чем беспокоиться, но просто знайте, что на это есть некоторые ограничения