Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 带有WebKit的简单Swift Cocoa应用程序:上传图片和#x27;行不通_Xcode_Swift_Macos_Cocoa - Fatal编程技术网

Xcode 带有WebKit的简单Swift Cocoa应用程序:上传图片和#x27;行不通

Xcode 带有WebKit的简单Swift Cocoa应用程序:上传图片和#x27;行不通,xcode,swift,macos,cocoa,Xcode,Swift,Macos,Cocoa,在尝试了其他“freemium”应用程序后,我决定制作自己的FB聊天应用程序,只需在WebView上显示即可 我的ViewController.swift只有几行代码在web视图上加载URL import Cocoa import WebKit class ViewController: NSViewController { @IBOutlet weak var webView: WebView! override func viewDidLoad() { s

在尝试了其他“freemium”应用程序后,我决定制作自己的FB聊天应用程序,只需在
WebView
上显示即可

我的
ViewController.swift
只有几行代码在web视图上加载URL

import Cocoa
import WebKit

class ViewController: NSViewController {

    @IBOutlet weak var webView: WebView!
    override func viewDidLoad() {
        super.viewDidLoad()

        let url = NSURL(string: "https://messenger.com")
        let request = NSURLRequest(URL: url!);
        webView.mainFrame.loadRequest(request);
    }

    override var representedObject: AnyObject? {
        didSet {
        // do nothing
        }
    }
}
除了将
NSAppTransportSecurity
键添加到info.plist以通过HTTPS连接解锁HTTP流量之外,我还没有做任何其他设置

问题: 请先看这张图片

除了两件事之外,一切看起来都很好

  • 上传图像不起作用-我在图片中标记为1

    • 通常情况下(与其他发布的应用程序或web浏览器一样),如果您单击该图标,它会显示一个浏览器以上载图片,如下所示。

    • 我的应用程序完全忽略用户对该图标的点击,因此我无法将任何图片上传到聊天室有趣的是,如果我将图片拖放到
      网络视图
      ,它可以正常上传。

  • 共享图片未显示-我在图片中标记为2

    • 同样,在其他浏览器或发布的应用程序中,它显示了我与参与者共享的图片,如下图所示。(当然我删了照片)

    • 我的应用程序尝试加载图片,但不显示它们。我可以看到它试图加载,因为加载时我看到循环进度指示器

  • 为什么?
  • 我怀疑有一种方法可以监听
    WebView
    中触发的JavaScript,并链接到文件浏览器或类似的东西

  • 这我不知道。我登录了Messenger(基本上是Facebook),所以我认为
    session
    在这里不是问题。可能是jQuery加载问题

  • 我应该如何解决这些问题

  • 确实有一个委托方法可以打开一个名为
    runOpenPanelForFileButtonWithResultListener
    ,的新面板
  • 在委托方法中,只需创建一个新的NSOpenPanel,如下所示:

    func webView(sender: WebView!, runOpenPanelForFileButtonWithResultListener resultListener: WebOpenPanelResultListener!, allowMultipleFiles: Bool) {
        let openDialog = NSOpenPanel()
        if (openDialog.runModal() == NSOKButton) {
            let fileName: String = (openDialog.URL?.path)!
            resultListener.chooseFilename(fileName) // Use chooseFilenames for multiple files
        }
    }
    
  • 我刚刚尝试从Messagers应用程序创建一个网络视图,图像加载良好。
    您应该尝试从interface builder(或通过代码)启用WebView选项,如“自动加载图像”或“启用动画图像”

  • 这段代码对我来说很有用,这里的好处是让图像的下载变得异步。您可以在此处找到有关此概念的更多信息:以及:

    已编辑

    I.您必须使用以下内容创建新类或名为ImageLoader的新iOS Swift文件:

    class ImageLoader {
    
    var cache = NSCache()
    
    class var sharedLoader : ImageLoader {
        struct Static {
            static let instance : ImageLoader = ImageLoader()
        }
        return Static.instance
    }
    
    func imageForUrl(urlString: String, completionHandler:(image: UIImage?, url: String) -> ()) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {()in
            var data: NSData? = self.cache.objectForKey(urlString) as? NSData
    
            if let goodData = data {
                let image = UIImage(data: goodData)
                dispatch_async(dispatch_get_main_queue(), {() in
                    completionHandler(image: image, url: urlString)
                })
                return
            }
    
            var downloadTask: NSURLSessionDataTask = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: urlString)!, completionHandler: {(data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
                if (error != nil) {
                    completionHandler(image: nil, url: urlString)
                    return
                }
    
                if data != nil {
                    let image = UIImage(data: data)
                    self.cache.setObject(data, forKey: urlString)
                    dispatch_async(dispatch_get_main_queue(), {() in
                        completionHandler(image: image, url: urlString)
                    })
                    return
                }
    
            })
            downloadTask.resume()
        })
    
    }
    
    }

    II.在实际的viewController中,您可以根据以下代码行从ImageLoaded调用方法“imageForUrl”:

    ImageLoader.sharedLoader.imageForUrl("http://upload.wikimedia.org/wikipedia/en/4/43/Apple_Swift_Logo.png", completionHandler:{(image: UIImage?, url: String) in
            self.myImage.image = image!
        })
    
    我从这个链接获取了代码:

    为webview上加载的图像进行编辑

    这是代码。它非常适合我:

    override func viewDidLoad() {
        super.viewDidLoad()
        let myWebView:UIWebView = UIWebView(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height))
        myWebView.loadRequest(NSURLRequest(URL: NSURL(string: "https://scontent-vie1-1.xx.fbcdn.net/hphotos-xap1/v/t1.0-9/12144725_10204647881668565_4367944825116750386_n.jpg?oh=5ecdae91f5258ffe0e0355e176f8eb8a&oe=56B007CA")!))
        self.view.addSubview(myWebView)
    }
    

    谢谢你的回答:),但是我要把这个放在代理中吗?或者必须明确地称呼它?为了更好地理解,我将编辑我的答案,因为它太多了,无法评论:)谢谢!我真的是Swift编码的新手(没问题,我们所有人都必须了解更多:)请让我知道这是否适合你。关于url路径:“你必须使用你的url,这只是一个例子。嗯,恐怕你误解了这个问题。我没有任何图像视图或任何东西从URL加载图像。我只有一个网络视图,而网站本身拥有所有加载图像的位置,我没有控制权来修复它们或任何东西。这有意义吗?:)第一个没用。我把它放在AppDelegate中,但它没有到达那里(通过调试器检查…)。我不知道原因是什么:(第二,一切都检查正确,我不知道为什么我的不起作用,而你的不起作用哈哈..奇怪..如果没有调用委托方法,那是因为你必须告诉你的WebView哪个文件是委托。你可以从界面生成器->选择你的WebView->转到右边名为“显示连接检查器”的选项卡(图标是一个箭头)然后只需将
    UIDelegate
    拖动到您的委托对象。如果我的解释不清楚,[link]很抱歉,这里有链接:(这是一个旧版本,但xcode 7是相同的)天哪,它工作了!我也观看了。在您和教程的帮助下,我能够附加文件:)我很高兴它有帮助:)关于加载图像可能尝试通过添加
    yourWebView.preferences.setValue(true,forKey:“developerExtrasEnabled”)
    来检查javascript/http请求问题,以了解这些图像未加载的原因。(像在常规浏览器中一样,单击鼠标右键并检查图元)。