2016-10-27 5 views
1

私は迅速にWebkitを練習しています。私は同じ目的のためにthis tutorialに従っています。そして、私はコードの最初の数行でエラーに悩まされています。WebViewに制約を追加する際のエラー - Swift

これは私がこれまでViewController.swiftに持っているものです。

import UIKit 
import WebKit 

class ViewController: UIViewController { 

var webView : WKWebView 

required init(coder aDecoder: NSCoder) { 
    self.webView = WKWebView(frame: CGRectZero) 
    super.init(coder: aDecoder)! 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.view.addSubview(webView) 
    webView.translatesAutoresizingMaskIntoConstraints = false 
    let height = NSLayoutConstraint(item: webView, attribute: .Height, relatedBy: .Equal, toItem: view, attribute: .Height, multiplier: 1, constant: 0) 
    let width = NSLayoutConstraint(item: webView, attribute: .Width, relatedBy: .Equal, toItem: view, attribute: .Width, multiplier: 1, constant: 0) 
    webView.addConstraints([height,width]) 

    let url = NSURL(string: "http://www.google.com") 
    let urlRequest = NSURLRequest(URL: url!) 
    webView.loadRequest(urlRequest) 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 


} 

と、次のコンソールエラー出力がどのように見えるかです:

2016-10-27 11:29:09.015 Browser[68308:1113663] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** 
+[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: Constraint items must each be an instance of UIView, or NSLayoutGuide.' 
*** First throw call stack: ( 0 CoreFoundation      0x00000001060e0d85 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x0000000108486deb objc_exception_throw + 48  2 CoreFoundation  0x00000001060e0cbd +[NSException raise:format:] + 205 3 Foundation 0x00000001064af0ac +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:] 
+ 277 4 Browser        0x0000000105ef890b _TTOFCSo18NSLayoutConstraintCfT4itemPs9AnyObject_9attributeOSC17NSLayoutAttribute9relatedByOSC16NSLayoutRelation6toItemGSqPS0___9attributeS1_10multiplierV12CoreGraphics7CGFloat8constantS4__S_ 
+ 123 5 Browser        0x0000000105ef78ee _TFC7Browser14ViewController11viewDidLoadfT_T_ + 494  6 Browser        0x0000000105ef7c12 _TToFC7Browser14ViewController11viewDidLoadfT_T_ + 34 7 UIKit        0x0000000106aa5984 
-[UIViewController loadViewIfRequired] + 1198 8 UIKit        0x0000000106aa5cd3 -[UIViewController view] + 27 9 UIKit   0x000000010697bfb4 -[UIWindow addRootViewControllerViewIfPossible] + 61 10 UIKit        0x000000010697c69d 
-[UIWindow _setHidden:forced:] + 282 11 UIKit        0x000000010698e180 -[UIWindow makeKeyAndVisible] + 42 12 UIKit  0x0000000106902ed9 -[UIApplication 
_callInitializationDelegatesForMainScene:transitionContext:] + 4131  13 UIKit        0x0000000106909568 
-[UIApplication _runWithMainScene:transitionContext:completion:] + 1769  14 UIKit        0x0000000106906714 
-[UIApplication workspaceDidEndTransaction:] + 188 15 FrontBoardServices     0x000000010a3558c8 
__FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 24 16 FrontBoardServices     0x000000010a355741 
-[FBSSerialQueue _performNext] + 178 17 FrontBoardServices     0x000000010a355aca -[FBSSerialQueue _performNextFromRunLoopSource] + 45  18 CoreFoundation      0x0000000106006301 
__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17  19 CoreFoundation      0x0000000105ffc22c 
__CFRunLoopDoSources0 + 556  20 CoreFoundation      0x0000000105ffb6e3 __CFRunLoopRun + 867  21 CoreFoundation   0x0000000105ffb0f8 CFRunLoopRunSpecific + 488  22 UIKit    0x0000000106905f21 -[UIApplication _run] + 402 23 UIKit    0x000000010690af09 UIApplicationMain + 171 24 Browser    0x0000000105ef92f2 main + 114 25 libdyld.dylib      0x0000000108f5d92d start + 1) libc++abi.dylib: terminating with uncaught exception of type NSException 

私はに非常に不必要初心者ですつまり、私はこれが何を意味するのか分かりません。 さらに、前に作成したコンセントの参照を削除するために無視すると、通常は表示されるエラーメッセージ Thread 1: signal SIGABRTが表示されます。この場合、私はアウトレットを作成していません。

私はObjective Cの同様の問題についてStackについていくつかの答えを行ってきましたが、私はよく理解できませんでした。

私は解決策が比較的簡単かもしれないことは知っていますが、何か助けに感謝します。

答えて

1

私は最後にコードを修正しました。ここに訂正されたコードがあります。

import UIKit 
import WebKit 
class ViewController: UIViewController {  
    var webView : WKWebView 
    required init(coder aDecoder: NSCoder) { 
     self.webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 414, height: 736)) 
     super.init(coder: aDecoder)! 
    } 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.addSubview(webView) 
     webView.translatesAutoresizingMaskIntoConstraints = false 
     let views = ["webView" : webView] 
     let h = NSLayoutConstraint.constraintsWithVisualFormat("H:|[webView]|", options: [], metrics: nil , views: views) 
     let w = NSLayoutConstraint.constraintsWithVisualFormat("V:|[webView]|", options: [], metrics: nil, views: views) 
     view.addConstraints(h) //This is where I was going wrong 
     view.addConstraints(w) //This is where I was going wrong 
     let url = NSURL(string: "http://www.google.com") 
     let urlRequest = NSURLRequest(URL: url!) 
     webView.loadRequest(urlRequest) 
    } 
    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

は、私がviewに追加されているはずwebViewに制約を加えることが判明しました。

1

すべてのビューでは、x、y、幅、高さ(labelとimageViewsはすでに固有の次元を持っていますが、必要に応じて制約を設定できます)などの4つの制約が必要です。

override func viewDidLoad() { 
     super.viewDidLoad() 
     view.addSubview(webView) 
     webView.translatesAutoresizingMaskIntoConstraints = false 
     let attributes: [NSLayoutAttribute] = [.centerX, .centerY, .width, .height] 
     NSLayoutConstraint.activate(attributes.map {NSLayoutConstraint(item: webView, attribute: $0, relatedBy: .equal, toItem: webView.superview, attribute: $0, multiplier: 1, constant: 0) }) 
     let url = URL(string: "http://www.google.com")! 
     let urlRequest = URLRequest(url: url) 
     webView.load(urlRequest) 
    } 
+0

私は、このコードがどのように機能するのか完全に理解していません。それは実行されていない、私はスイフト2.1を使用しているので、私は少しコードを変更する必要があります。それが動作するかどうかを知らせます。しかし、私は '$ 0'が何をするのか分からなかった。 –

+1

mapは、属性をNSLayoutConstraintsに変換します。 $ 0は、属性配列内の各要素を表すデフォルトのパラメータです。 swift 2で動作します.swift 2のすべてのNSLayoutAttribute列挙体を大文字にし、URLとURLRequestをNSURLとNSURLRequestに戻す必要があります。 –

+0

このようなコードを修正しました。 ' –

関連する問題