【问题标题】:Visual Studio Xamarin.iOS Xcode Objective-C - WKWebView implementationVisual Studio Xamarin.iOS Xcode Objective-C - WKWebView 实现
【发布时间】:2021-01-11 18:06:26
【问题描述】:

我目前正尝试在我的 iOS 应用程序中显示一个简单的 HTML 页面,用于控制我的智能镜子,它应该显示镜子显示的当前内容。不幸的是,我在网上找不到任何有用的教程(仅适用于我不允许使用的编程语言 Swift),并且无法弄清楚如何正确实现 WKWebView。如果有人能给我提供有用的教程,或者甚至指导我完成这些步骤,我将非常感激!

编辑:我已经取得了一些进展,但是页面无法加载,只会显示白屏。

它应该显示一个加载指示器(直到页面加载完毕),它会在屏幕变白之前显示几分之一秒。

这是我的代码:

“ThirdViewController.h”:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>


@interface ThirdViewController : UIViewController <WKNavigationDelegate>
@property (strong, nonatomic) IBOutlet WKWebView *webView;
@property (strong, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;

@end

“ThirdViewController.m”:

#import "ThirdViewController.h"

@implementation ThirdViewController
@synthesize webView;
- (void) viewDidLoad {
    [super viewDidLoad];
    webView = [[WKWebView alloc] initWithFrame:[[self view] bounds]];
    NSURL *url = [NSURL URLWithString:@"http://192.168.178.34:8080/"];
                  NSURLRequest *urlReq = [NSURLRequest requestWithURL:url];
    
    [webView loadRequest:urlReq];
    [self.view addSubview:webView];
}

- (void) webViewdidCommitNavigation:(WKNavigation *)navigation {
    [self.activityIndicator startAnimating];
}
- (void) webViewdidFinishNavigation:(WKNavigation *)navigation {
    [self.activityIndicator stopAnimating];
    self.activityIndicator.hidesWhenStopped = YES;
}

@end

我还在 Info.plist 中添加了以下内容以允许使用非 https URL:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

真诚地, 卢卡斯

【问题讨论】:

标签: objective-c xcode xamarin.ios wkwebview


【解决方案1】:

如果你想用 Objecive-C 实现同样的效果,你可以试试下面的 C# 代码:

public partial class ViewController : UIViewController
{
    private readonly NSUrl url = new NSUrl("https://visualstudio.microsoft.com/xamarin/");

    public UIActivityIndicatorView indicatorView;
    protected ViewController(IntPtr handle) : base(handle) { }

    partial void OpenWebView(UIButton sender)
    {
        indicatorView = new UIActivityIndicatorView(new CoreGraphics.CGRect(UIScreen.MainScreen.Bounds.Size.Width/2 - 25, UIScreen.MainScreen.Bounds.Size.Height/2 - 25, 25 ,25));
        indicatorView.Hidden = true;
        var webView = new WKWebView(View.Frame, new WKWebViewConfiguration());
        View.AddSubview(webView);
        View.AddSubview(indicatorView);
        webView.NavigationDelegate = new CustomNavigationDelegate(this);
        webView.LoadRequest(new NSUrlRequest(url));
    }

    partial void OpenSafari(UIButton sender)
    {
        UIApplication.SharedApplication.OpenUrl(url);
    }

    partial void OpenSafariViewController(UIButton sender)
    {
        var viewController = new SFSafariViewController(url);
        PresentViewController(viewController, true, null);
    }
}

internal class CustomNavigationDelegate : WKNavigationDelegate
{
    private ViewController viewController;

    public CustomNavigationDelegate(ViewController viewController)
    {
        this.viewController = viewController;
    }

    public override void DidCommitNavigation(WKWebView webView, WKNavigation navigation)
    {
        viewController.indicatorView.Hidden = true;
        viewController.indicatorView.StartAnimating();
    }

    public override void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
    {
        viewController.indicatorView.StopAnimating();
        viewController.indicatorView.HidesWhenStopped = true;
    }
}

【讨论】:

  • 感谢您的帮助!在我在 Xcode 中的代码在 Visual Studio 中构建应用程序时被多次删除后,我已经放弃了 Visual Studio Xamarin.iOS Xcode 组合。我现在改用 Xcode 和 Swift。
  • @LukasGrabowski Okey,你解决了这个问题真是太好了。您可以在有时间时更新您的答案。如果我的回复有帮助,请不要忘记接受它作为答案(点击此答案左上角的✔)并投票,它将帮助其他有类似问题的人。
猜你喜欢
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多