20804
初めまして。プログラミング初心者です。

SpriteKitで"cbutton"と名付けたノードをタップするとカメラが起動して写真を撮影し、撮影した写真をカメラロールに保存して元の画面(GameScene)に戻る、という処理をしたいのですがうまくいきません。

```

    import UIKit
    import SpriteKit
    
    class GameScene: SKScene, UIImagePickerControllerDelegate {
    
    override func didMoveToView(view: SKView) {
    
        //背景画像、ボタンのスプライトを配置
        let background = SKSpriteNode(imageNamed: "haikei")
        background.position = CGPoint(x: self.size.width * 0.5,y: self.size.height * 0.5)
        addChild(background)
    
        let cbutton = SKSpriteNode(imageNamed: "cbutton")
        cbutton.position = CGPoint(x: self.size.width * 0.25, y: 100)
        cbutton.name = "cbutton"
        addChild(cbutton)
    
        }
    
    // cbuttonのタッチイベント作成
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        for touch: AnyObject in touches {
    
            let location = touch.locationInNode(self)
    
            if self.nodeAtPoint(location).name == "cbutton" {
    
                // カメラ起動
                let camera = UIImagePickerControllerSourceType.Camera
    
                if UIImagePickerController.isSourceTypeAvailable(camera){
                    let picker = UIImagePickerController()
                    picker.sourceType = camera
                    picker.delegate = self
                    self.presentViewController(picker, animated: true, completion: nil)
                }
    
                func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]){
    
                    let image = info[UIImagePickerControllerOriginalImage] as! UIImage
                    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
                    let gameScene = GameScene(size: size)
                    let skView = view as SKView!
                    gameScene.scaleMode = SKSceneScaleMode.AspectFit
                    skView.presentScene(gameScene)       
                }                
            }        
        }
    }
    
```

下から14行目の  
self.presentViewController(picker, animated: true, completion: nil)  
で、"Value of type 'GameScene' has no member
'presentViewController'"とエラーが起こってしまいます。

ViewControllerは以下のようになっています。

```

    import UIKit
    import SpriteKit
    
    class ViewController: UIViewController, UIImagePickerControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
    
        let skView = self.view as! SKView
    
        // SKGameSceneを生成
        let scene =  GameScene(size:CGSize(width: 375, height: 667))
        scene.scaleMode = SKSceneScaleMode.AspectFit
    
        // SKView に SKScene を設定して表示させる
        skView.presentScene(scene)    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    }
    
```

*バージョンはXcode7.2, Swift2.1です。
CC BY-SA 3.0
2016-01-10T06:38:19.797
20797
2016-01-10T11:53:48.010
13958
question
ios swift xcode iphone spritekit
SpriteKitのノードをボタンにしてカメラを使いたい
> Value of type 'GameScene' has no member 'presentViewController'

このエラーメッセーの意味を理解することから始めましょう。  
クラス`GameScene`は、`SKScene`を継承し、`UIImagePickerControllerDelegate`プロトコルを採用しています。そして、`SKScene`は、`SKEffectNode`のサブクラスであり、`SKEffectNode`は、`SKNode`のサブクラスであり、`SKNode`は、`UIResponder`のサブクラスであり、`UIResponder`は、`NSObject`のサブクラスです。これらのクラスおよびプロトコルの中のどれかが、`presentViewController`というメンバー（メソッドあるいはプロパティ）を持っていれば、このエラーは起きません。どれも持っていないので、エラーとなります。  
`presentViewController`は、クラス`UIViewController`のメソッド

```

    func presentViewController(_ viewControllerToPresent: UIViewController,
                      animated flag: Bool,
                    completion completion: (() -> Void)?)
    
```

のことです。

```

    self.presentViewController(picker, animated: true, completion: nil)
    
```

この`self`は、クラス`GameScene`の実装内で使われているので、`GameScene`のインスタンスを指します。`UIViewController`（のサブクラス）のインスタンスを指していません。なので、`self`を（`UIViewController`のサブクラスである）`ViewController`のインスタンスと置き換えなければいけません。
CC BY-SA 3.0
2016-01-10T11:53:48.010
20804
2016-01-10T11:53:48.010
7362
20797
answer