我知道这个问题在新的更新中可能有些常见,而且很可能也是一个简单的修复,但是我最近从xcode-6 beta升级到了完整的版本,而且我的许多子类都有错误。我使用的是一个预先编程的scenekit 3d旋转地球仪,它可以很好地使用beta版本.我现在的构建失败了,这给了我一个快速的编译错误:'SCNMaterial?‘没有一个名为“这里有许多子类”的成员
在这里非常迷茫,所以任何帮助或方向都会大大的appreciated...thank你!
我正在使用的https://github.com/schwa/iOS-8-SceneKit-Globe-Test源代码--另外,下面是我的文件中的代码(与上面的Github文件相同).
//
// AppDelegate.swift
// SceneKitTest
//
// Created by Jonathan Wight on 6/6/14.
// Copyright (c) 2014 schwa.io. All rights reserved.
//
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
// Override point for customization after application launch.
return true
}
func applicationWillResignActive(application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
func applicationDidEnterBackground(application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(application: UIApplication) {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
func applicationDidBecomeActive(application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
func applicationWillTerminate(application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
}
//
// GameViewController.swift
// SceneKitTest
//
// Created by Jonathan Wight on 6/6/14.
// Copyright (c) 2014 schwa.io. All rights reserved.
//
import UIKit
import QuartzCore
import SceneKit
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// create a new scene
let scene = GlobeScene()
// create and add a light to the scene
let lightNode = SCNNode()
lightNode.light = SCNLight()
//error occurs with lightNode class
lightNode.light.type = SCNLightTypeOmni
lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
scene.rootNode.addChildNode(lightNode)
// create and add an ambient light to the scene
// let ambientLightNode = SCNNode()
// ambientLightNode.light = SCNLight()
// ambientLightNode.light.type = SCNLightTypeAmbient
// ambientLightNode.light.color = UIColor.darkGrayColor()
// scene.rootNode.addChildNode(ambientLightNode)
// retrieve the SCNView
let scnView = self.view as SCNView
// set the scene to the view
scnView.scene = scene
// allows the user to manipulate the camera
scnView.allowsCameraControl = true
// show statistics such as fps and timing information
scnView.showsStatistics = true
// configure the view
scnView.backgroundColor = UIColor.blackColor()
// add a tap gesture recognizer
let tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:")
let gestureRecognizers = NSMutableArray()
gestureRecognizers.addObject(tapGesture)
gestureRecognizers.addObjectsFromArray(scnView.gestureRecognizers!)
scnView.gestureRecognizers = gestureRecognizers
}
func handleTap(gestureRecognize: UIGestureRecognizer) {
// retrieve the SCNView
let scnView = self.view as SCNView
// check what nodes are tapped
let p = gestureRecognize.locationInView(scnView)
let hitResults = scnView.hitTest(p, options: nil)
// check that we clicked on at least one object
//error occurs with if statement below
if hitResults.count > 0 {
// retrieved the first clicked object
let result: AnyObject! = hitResults[0]
// get its material
let material = result.node!.geometry.firstMaterial
// highlight it
SCNTransaction.begin()
SCNTransaction.setAnimationDuration(0.5)
// on completion - unhighlight
SCNTransaction.setCompletionBlock {
SCNTransaction.begin()
SCNTransaction.setAnimationDuration(0.5)
material.emission.contents = UIColor.blackColor()
SCNTransaction.commit()
}
material.emission.contents = UIColor.redColor()
SCNTransaction.commit()
}
}
override func shouldAutorotate() -> Bool {
return true
}
override func supportedInterfaceOrientations() -> Int {
if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
return Int(UIInterfaceOrientationMask.AllButUpsideDown.toRaw())
} else {
return Int(UIInterfaceOrientationMask.All.toRaw())
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
}
}
//
// GlobeScene.swift
// SceneKitTest
//
// Created by Jonathan Wight on 6/6/14.
// Copyright (c) 2014 schwa.io. All rights reserved.
//
import SceneKit
import QuartzCore
class GlobeScene: SCNScene {
var camera: SCNCamera
var cameraNode: SCNNode
var ambientLightNode: SCNNode
var globeNode: SCNNode
override init() {
self.camera = SCNCamera()
self.camera.zNear = 0.01
self.cameraNode = SCNNode()
self.cameraNode.position = SCNVector3(x: 0.0, y: 0.0, z: 1.5)
self.cameraNode.camera = self.camera
self.camera.focalBlurRadius = 0;
// CABasicAnimation *theFocusAnimation = [CABasicAnimation animationWithKeyPath:"focalBlurRadius"];
// theFocusAnimation.fromValue = @(100);
// theFocusAnimation.toValue = @(0);
// theFocusAnimation.duration = 2.0;
// theFocusAnimation.removedOnCompletion = YES;
// [self.camera addAnimation:theFocusAnimation forKey:@"focus"];
let theAmbientLight = SCNLight()
theAmbientLight.type = SCNLightTypeAmbient
theAmbientLight.color = UIColor(white: 0.5, alpha: 1.0)
self.ambientLightNode = SCNNode()
self.ambientLightNode.light = theAmbientLight
//below theGlobeGeometry classes are where the errors occur .diffuse, .ambient, etc....
self.globeNode = SCNNode()
let theGlobeGeometry = SCNSphere(radius: 0.5)
theGlobeGeometry.firstMaterial.diffuse.contents = UIImage(named:"earth_diffuse.jpg")
theGlobeGeometry.firstMaterial.ambient.contents = UIImage(named:"earth_ambient2.jpeg")
// theGlobeGeometry.firstMaterial.ambient.contents = UIImage(named:"earth_ambient.jpg")
theGlobeGeometry.firstMaterial.specular.contents = UIImage(named:"earth_specular.jpg")
theGlobeGeometry.firstMaterial.emission.contents = nil
theGlobeGeometry.firstMaterial.transparent.contents = nil
theGlobeGeometry.firstMaterial.reflective.contents = nil
theGlobeGeometry.firstMaterial.multiply.contents = nil
theGlobeGeometry.firstMaterial.normal.contents = UIImage(named:"earth_normal.jpg")
let theGlobeModelNode = SCNNode(geometry: theGlobeGeometry)
self.globeNode.addChildNode(theGlobeModelNode)
let theCloudGeometry = SCNSphere(radius:0.501)
theCloudGeometry.firstMaterial.diffuse.contents = nil
theCloudGeometry.firstMaterial.ambient.contents = nil
theCloudGeometry.firstMaterial.specular.contents = nil
theCloudGeometry.firstMaterial.emission.contents = nil
theCloudGeometry.firstMaterial.transparent.contents = UIImage(named:"earth_clouds.png")
theCloudGeometry.firstMaterial.reflective.contents = nil
theCloudGeometry.firstMaterial.multiply.contents = nil
theCloudGeometry.firstMaterial.normal.contents = nil
let theCloudModelNode = SCNNode(geometry: theCloudGeometry)
self.globeNode.addChildNode(theCloudModelNode)
// animate the 3d object
let animation: CABasicAnimation = CABasicAnimation(keyPath: "rotation")
animation.toValue = NSValue(SCNVector4: SCNVector4(x: 1, y: 1, z: 0, w: Float(M_PI)*2))
animation.duration = 5
animation.repeatCount = MAXFLOAT //repeat forever
globeNode.addAnimation(animation, forKey: nil)
super.init()
self.rootNode.addChildNode(self.cameraNode)
self.rootNode.addChildNode(self.ambientLightNode)
self.rootNode.addChildNode(self.globeNode)
}
}发布于 2014-10-15 08:06:41
您在GitHub上看到的示例是旧的,并且没有更新,因为框架已经开始适应Swift。您所看到的大多数错误都是因为情景Kit已经更新,以便在可能返回nil的情况下返回选项。
例如
lightNode.light.type = SCNLightTypeOmni应改为
lightNode.light?.type = SCNLightTypeOmni或
if let light = lightNode.light {
light.type = SCNLightTypeOmni
}还有其他非常类似的情况,API已经更新为返回选项,例如:
theGlobeGeometry.firstMaterial.diffuse.contents = UIImage(named:"earth_diffuse.jpg")
theGlobeGeometry.firstMaterial.ambient.contents = UIImage(named:"earth_ambient2.jpeg")
theGlobeGeometry.firstMaterial.specular.contents = UIImage(named:"earth_specular.jpg")
// etc...应改为
theGlobeGeometry.firstMaterial?.diffuse.contents = UIImage(named:"earth_diffuse.jpg")
theGlobeGeometry.firstMaterial?.ambient.contents = UIImage(named:"earth_ambient2.jpeg")
theGlobeGeometry.firstMaterial?.specular.contents = UIImage(named:"earth_specular.jpg")
// etc...请注意,在?之后添加了firstMaterial,因为它不能保证一个几何对象有一个材料。
https://stackoverflow.com/questions/26372950
复制相似问题