ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 2

12. UIWebView

Создание собственного браузера

Все кто работают под Mac OS знают о таком веб браузере как Safari. Он также поставляется с iOS. Safari основан на движке WebKit. Этот движок очень быстро позволяет обрабатывать веб–запросы, загружать сайты и пр.

 

C помощью компонента UIWebView мы можем отображать не только сайты. Он позволяет отображать следующее содержимое:

  • Сайты
  • Просто HTML
  • Документы Microsoft Office, Adobe PDF, Документы Apple iWork
  • Медиа-контент
Но об этом позже. Для начала давайте начнем с простого. Создадим проект на основе Single View Application и назовем его Browser.
Изменим файл ViewController.h:
<code data-result="[object Object]">#import &lt;UIKit/UIKit.h&gt;

@interface ViewController : UIViewController

@property (strong, nonatomic) IBOutlet UIWebView *myBrowser;

@end</code>
Чтобы загрузить какой-либо сайт нужно вызвать у UIWebView метод loadRequest:, в него нужно передать NSURLRequest, который в свою учередь создается с помощью NSURL. NSURL содержит в себе URL, который нужно загрузить. Внесем изменения в файл ViewController.m, с учетом всего вышеописаного.
<code data-result="[object Object]">#import "ViewController.h"

@implementation ViewController

@synthesize myBrowser;

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.myBrowser = nil;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSURL *imaladecLink = [NSURL URLWithString:@"http://www.imaladec.net/"];
    [myBrowser loadRequest:[NSURLRequest requestWithURL:imaladecLink]];
}

@end</code>
Теперь осталось связать объект myBrowser с объектом интерфейса. Для этого перейдем в ViewController.xib. В библиотеке объектов находим WebView и перетягиваем в наш View. Кликаем по File’s Owner, переходим в Connections Inspector и связываем два наших объекта.
Если вы все сделали правильно, должна быть примерно такая картина:
Это самое простое отображение веб страницы.
Давайте усложним нашу задачу. Добавим переходы: вперед, назад, перезагрузка страницы. Для этого немного переделаем наш интерфейс. Вновь возвращаемся в ViewController.xib, добавляем в него Toolbar и NavigationBar. Затем, добавим четыре кнопки Bar Burron Item в Toolbar. Подпишите их соответственно: назад, вперед, обновить и стоп.
UIWebView имеет 4 метода навигации (кнопки для которых мы только что добавили). Эти методы можна вызывать программно. В этом случае для каждой из кнопок нам прийдется создавать функцию, которая будет вызываться при нажатии на кнопку и помещать нужный метод в эту функцию. Или связать их на прямую через инспектор связей. Я предлагаю воспользоваться вторым способом. Для этого выделите WebView на интерфейсе и в Connactions Inspector — Received Actions установите связи следующим образом:
Все отлично, но при открытии странички мы видем только ее часть (верхний левый угол), при этом, у нас отсутствует возможность изменять размер отображаемой области. Чтобы исправть эти неудобства в инспекторе атрибутов WebView слудет установить галочку Scales Page To Fit:
Наш браузер отображает одну единственную траницу, но вы можете самостоятельно это изменить. Добавить UITextField в навигейшин бар, чтоб пользователи могли вводить нужную ссылку по которой будет загружаться страница.
В начале урока я писал о том, что UIWebView предназначен не только для открытия интернет-страничек. Давайте попробуем это сделать. В первую очередь, внесем изменения в интерфейс класса ViewController.h:
<code data-result="[object Object]">#import &lt;UIKit/UIKit.h&gt;

@interface ViewController : UIViewController &lt;UIActionSheetDelegate&gt;

@property (strong, nonatomic) IBOutlet UIWebView *myBrowser;

-(IBAction)showMenu;

@end</code>
В него мы добавили протокол UIActionSheetDelegate и метод showMenu. В этом методе мы будем показывать ActionSheet для выбора варианта загрузки контента. Соответственно, изменим и реализацию (ViewController.m):
<code data-result="[object Object]">#import "ViewController.h"

@implementation ViewController

@synthesize myBrowser;

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.myBrowser = nil;
}

-(IBAction)showMenu {
    UIActionSheet *actionsheet = [[UIActionSheet alloc] initWithTitle:@"Выберите действие" 
                                                             delegate:self 
                                                    cancelButtonTitle:@"Отмена" 
                                               destructiveButtonTitle:nil 
                                                    otherButtonTitles:
                                  @"iMaladec", 
                                  @"Просмотр HTML", 
                                  @"Просмотр PDF", nil];
    [actionsheet showInView:self.view];
}

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSURL *url = nil;

	if (buttonIndex == 0) {
        url = [NSURL URLWithString:@"http://www.imaladec.net/"];
    } else if (buttonIndex == 1) {
        NSString *pathToFile = [[NSBundle mainBundle] pathForResource:@"imaladecHTML" ofType:@"html"];
        url = [NSURL fileURLWithPath:pathToFile];
    } else if (buttonIndex == 2) {
        NSString *pathToFile = [[NSBundle mainBundle] pathForResource:@"imaladecPDF" ofType:@"pdf"];
        url = [NSURL fileURLWithPath:pathToFile];
    }

    [myBrowser loadRequest:[NSURLRequest requestWithURL:url]];
}

@end</code>
Все, что нам осталось сделать — это добавить на NavigationBar кнопку, а нажатие на нее связать с вызовом метода showMenu. Если кто-то не понимает, что написано в этом методе — можно прочитать урок UIActionSheet. И если все сделано правильно — должна получиться примерно следующая картинка:
Чтобы все работало — вам нужно добавить файлы imaladecHTML.html и imaladecPDF.pdf. Аналогичным способом можете попробовать открыть аудио или видео-файлы.
Исходный код можно скачать здесь.