Как добавить элементы HTML в веб-представление Какао - PullRequest
1 голос
/ 01 марта 2012

Я пытался добавить HTML-контент в веб-представление, но, похоже, ничего не получил.Документация Apple очень скудна, и из нескольких примеров, которые я нашел онлайн , я не могу заставить их работать.Насколько я могу судить, это то, как это должно работать, но не работает.

Для начала у меня есть очень простой HTML-документ, который я загружаю в веб-просмотр.Я пытаюсь добавить некоторое HTML-содержимое в #container div

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title>HTML TEST</title>

        <style type="text/css">       
            .test {
                display: block;
                border: #000 1px solid;
                width: 100px;
                height: 100px;
                background-color: #0F0;

            }            
         </style>
    </head>
    <body>   
        <p>hello world</p>
        <div id="container"></div>
    </body>
</html>

WebView находится внутри пользовательского представления.Заголовок очень прямой.

// NodeTest.h
#import <Cocoa/Cocoa.h>
#import <WebKit/WebKit.h>

@interface NodeTest : NSView
@property (nonatomic, retain) IBOutlet WebView *webview;
@end

Итак, в awakefromnib я загружаю базовый HTML-документ, пытаюсь получить контейнер div и вставить в него новый HTML-элемент с именем класса «test»,Который, согласно HTML-файлу, должен иметь черную рамку, зеленую заливку и должен быть 100x100px.

#import "NodeTest.h"

@implementation NodeTest

@synthesize webview;

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (void) awakeFromNib {
    // Load the HTML document into the webview
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"TestDocument" ofType:@"html"]];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];
    [[webview mainFrame] loadRequest:req];

    [webview setEditable:YES];

    DOMDocument *domDoc = [[webview mainFrame] DOMDocument];

    // Get the container div. I've tried this with and without '#'
    DOMHTMLElement *container = (DOMHTMLElement *)[domDoc getElementById:@"container"];

    // Create a new HTML element
    DOMHTMLElement *myDiv = (DOMHTMLElement *)[domDoc createElement:@"div"];
    [myDiv setInnerHTML:@"<p>Boo!</p>"];
    [myDiv setClassName:@"test"];

    // Add the element to the container div
    [container appendChild:myDiv];

    [webview setNeedsDisplay:YES];

}

- (void)drawRect:(NSRect)dirtyRect
{
    // Drawing code here.
}

@end

Загрузка содержимого HTML в WebView - это нормально.Это все там.Но я не могу понять, как добавлять новые элементы HTML.Если у кого-нибудь есть указатели, я бы хотел их услышать.Это сводит меня с ума.

1 Ответ

2 голосов
/ 01 марта 2012

WebKit загружает запросы асинхронно, поэтому вам нужно вращать цикл выполнения после вызова -[WebFrame loadRequest:], пока загрузка не будет завершена, и только после этого попытаться получить доступ к DOM. Обычный способ вращения цикла выполнения - просто возврат из -awakeFromNib, но при необходимости вы также можете вращать вложенный цикл выполнения с помощью API NSRunLoop. Стандартный способ узнать, когда загрузка завершена, - дать WebView a WebFrameLoadDelegate и подождать, пока не будет вызван его метод -webView:didFinishLoadForFrame:. (Если вы загружаете ресурс, содержащий подкадры, вам следует подождать, пока основной метод не будет передан этому методу.)

Как только загрузка завершится, код, который вы перечислили для доступа к -DOMDocument и т. Д., Должен работать нормально.

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