Поскольку Субъект излучает до подписки printFoo
.
После подписки больше нет Тематических излучений.
Вместо этого вы можете использовать BehaviorSubject, поскольку он содержит излучаемые значения (последнее излученное значение):
const unsubscribe = new BehaviorSubject(false);
function printFoo() {
of('foo')
.pipe(takeUntil(unsubscribe.pipe(filter(value => !!value)))) // Don't unsub if it's false emitted
.subscribe(console.log)
}
function onDestroy() {
unsubscribe2.next(true); // Emit true to cancel subscription
}
Этот код, вероятно, слишком медленный для использования табличного представления, но делает свое дело. Не похоже, что есть какая-то альтернатива, поскольку UIWebView не предлагает прямого доступа к DOM.
В viewDidLoad контроллера представления
я загружаю некоторый HTML-код в веб-представление, и когда загрузка заканчивается, запускаю некоторый JavaScript чтобы возвратить высоту элемента.
- (void)viewDidLoad
{
[super viewDidLoad];
webview.delegate = self;
[webview loadHTMLString:@"<div id='foo' style='background: red'>The quick brown fox jumped over the lazy dog.</div>" baseURL:nil];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *output = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"];
NSLog(@"height: %@", output);
}
Я был очень рад найти ваши ответы, у меня хорошо сработал трюк с javascript.
Однако я хотел сказать, что существует также метод sizeThatFits:
CGSize goodSize = [webView sizeThatFits:CGSizeMake(anyWidth,anyHeigth)];
Мы должны установить предпочтительный размер, отличный от нуля, но в остальном он обычно всегда работает!
Обычно, потому что с UIWebViews, кажется, работает только при второй загрузке (я использую метод loadHTMLString: и да, я вызываю sizeThatFits: из делегированного метода didFinishLoad:).
Вот почему я был очень рад найти ваше решение, которое работает в любом случае.
Кажется, это работает. На данный момент.
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
CGFloat webViewHeight = 0.0f;
if (self.subviews.count > 0) {
UIView *scrollerView = [self.subviews objectAtIndex:0];
if (scrollerView.subviews.count > 0) {
UIView *webDocView = scrollerView.subviews.lastObject;
if ([webDocView isKindOfClass:[NSClassFromString(@"UIWebDocumentView") class]])
webViewHeight = webDocView.frame.size.height;
}
}
}
Он должен безопасно вернуть 0 в случае сбоя.
Если у вас есть плохие значения с sizeThatFits в первый раз, но не после, вот возможная причина, с которой я столкнулся: ошибка с внешним CSS. Похоже, что webViewDidFinisLoad вызывается слишком рано, до того, как внешние CSS будут получены, а веб-документ полностью создан. Я думаю, что ошибка исчезает при перезагрузке из-за кэша.
Хитрость: предварительно загрузите свой CSS с помощью фиктивного UIWebView soon в вашем приложении.
SDK : IOS4