Reputation: 6892
I'm practicing Webkit in swift. I'm following this tutorial for the same purpose. And I'm stuck with an error in the very first few lines of the code.
This is what I have in the ViewController.swift so far :
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()
}
}
and the following is how the console error output looks:
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
I'm a beginner so needless to say, I don't have any idea what this means.
Additionally I'm getting the error message
Thread 1: signal SIGABRT
which I normally get if I ignore to remove an outlet reference that I created earlier. In this case I have not created any outlets.
I've gone through some other answers on Stack on similar problems in Objective C but I couldn't understand it well.
I know the solution might be relatively simple but any help will be appreciated.
Upvotes: 1
Views: 1070
Reputation: 6892
So I finally fixed the code! Here's the corrected code.
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.
}
}
Turns out I was adding the constraints to webView
where I should have been adding it to view
.
Upvotes: 1
Reputation: 16327
Every view needs 4 constraints such that the system can calculate: x,y, width, height (labels and imageViews already have intrinsic dimensions but you can still constrain them if you want). Here are 4 constraints for the webview:
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)
}
Upvotes: 1