问题
I was trying to use auto layout in a Playground on Xcode 8. However, as soon as I added the line, I started receiving this error:
Playground execution failed: error: Couldn't lookup symbols:
__TWPCSo6UIView17PlaygroundSupport22PlaygroundLiveViewableS0_
__swift_FORCE_LOAD_$_swiftCoreGraphics
__swift_FORCE_LOAD_$_swiftDarwin
__TMaC17PlaygroundSupport14PlaygroundPage
__swift_FORCE_LOAD_$_swiftObjectiveC
__swift_FORCE_LOAD_$_swiftUIKit
_playground_log_hidden
_playground_logger_initialize
__swift_FORCE_LOAD_$_swiftCoreImage
__swift_FORCE_LOAD_$_swiftDispatch
__TFC17PlaygroundSupport14PlaygroundPageau7currentS0_
__swift_FORCE_LOAD_$_swiftFoundation
__TFC17PlaygroundSupport14PlaygroundPages8liveViewGSqPS_22PlaygroundLiveViewable__
* thread #1: tid = 0x14b6b4, 0x000000010f2f43c0 MyPlayground`executePlayground, queue = 'com.apple.main-thread', stop reason = breakpoint 1.2
* frame #0: 0x000000010f2f43c0 MyPlayground`executePlayground
frame #1: 0x000000010f2f39c0 MyPlayground`__37-[XCPAppDelegate enqueueRunLoopBlock]_block_invoke + 32
frame #2: 0x000000010fe0c89c CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
frame #3: 0x000000010fdf1944 CoreFoundation`__CFRunLoopDoBlocks + 356
frame #4: 0x000000010fdf10b5 CoreFoundation`__CFRunLoopRun + 901
frame #5: 0x000000010fdf0ad4 CoreFoundation`CFRunLoopRunSpecific + 420
frame #6: 0x000000011518aa61 GraphicsServices`GSEventRunModal + 161
frame #7: 0x0000000110996de4 UIKit`UIApplicationMain + 159
frame #8: 0x000000010f2f36e9 MyPlayground`main + 201
frame #9: 0x00000001132e068d libdyld.dylib`start + 1
I have no idea what this means. I mean, my interpretation is that Xcode can't find libraries like UIKit, but I know that is not the case, as I used UIKit and such fine until that line of auto layout crashed the party. The source code is really small, so I am including it in its entirety:
import UIKit
import PlaygroundSupport
let view = UIView(frame: CGRect(x: 0, y: 0, width: 500, height: 500))
view.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = UIColor.white
PlaygroundPage.current.liveView = view
let field = UITextField(frame: CGRect(x: 0, y: 0, width: 200, height: 50))
field.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1).isActive = true
field.backgroundColor = UIColor.red
view.addSubview(field)
The third line from the bottom of the source seems to be causing the problem. Is this something that I messed up or is it a beta bug? I'm lost here.
回答1:
Add field
as a sub view of view
then set your constraints. There is an exception that is raised when constraints are added for views not in the same view hierarchy.
For example:
import UIKit
import PlaygroundSupport
let view = UIView(frame: CGRect(x: 0, y: 0, width: 500, height: 500))
view.backgroundColor = UIColor.white
PlaygroundPage.current.liveView = view
let field = UITextField(frame: CGRect(x: 0, y: 0, width: 200, height: 50))
view.addSubview(field)
field.translatesAutoresizingMaskIntoConstraints = false
field.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1).isActive = true
// add the rest of your constraints
field.backgroundColor = UIColor.red
You also typically need to call view.layoutIfNeeded()
回答2:
I downloaded the playground file of swift tour from apple developer page and double click to open with Xcode 9.2 and got the same error mentioned above.
Then I created new playground file and pasted the contents of downloaded file and it executed without errors.
Edit#1: Even drag n drop files to newly created playground resolved the errors.
Edit#2: When I reopened my newly created playground, it showed the same error. Then I navigated to different files and this made swift process the files and errors disappeared. So, I repeated this with the downloaded file and those errors also disappeared and code executed OK.
来源:https://stackoverflow.com/questions/39237298/xcode-8-strange-playground-error-couldnt-lookup-symbols