質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

Storyboard(ボタン)とコントローラーのコネクトがおかしい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 726
退会済みユーザー

退会済みユーザー

Storyboard(ボタン)とコントローラーのコネクトがおかしいかもしれません。
今、カメラアクセスと写真のアップロード部分を作っていて、それが実機でできません。
Xcodeから自分のiPhoneでアプリを起動したのですが 
Camera access ボタンとPhoto upload ボタンは自分のiPhoneで表示されたのですが 
それらは押せるだけしか機能がありません。Camera access ボタンを押したら、iPhone(実機)のカメラが開いて写真が撮れて、撮った写真をアプリに表示させたいです。Photo upload ボタンを押したら、iPhone(実機)のカメラロールが開き元からある写真の中から一枚を選べ、選択した写真をアプリに表示させたいです。
Main.storyboardのViewControllerボタン(黄色と四角形が組み合わさったもの)を押すと右側にCustom Classが出ると思うのですが、
その中のClassを選択すると作ったコントローラの指定ができ、ちゃんとボタンに機能をもたせたいコントローラが指定できます。
しかし、それぞれ機能を持つボタン(この場合はカメラやフォト読み込み)のCustom ClassのClassには何も選択されていません。
現在、例えばカメラボタンの状況は以下のようです。
イメージ説明

ボタンとコントローラーのコネクトを正しくさせ、
本来の機能を持ったアプリを作りたいのですが
どう直せば良いのでしょうか?
ちなみにコントローラには

import UIKit

class SendController:UIViewController,
UINavigationControllerDelegate,UIImagePickerControllerDelegate{

//定数
let ButtonCamera = 0
let ButtomRead = 1
let ButtonWrite = 2

//変数
var imageView:UIImageView = UIImageView()
var btnCamera:UIButton = UIButton(type: .custom)
var btnRead:UIButton = UIButton(type: .custom)
var btnWrite:UIButton = UIButton(type: .custom)


//ロード完了時に呼ばれる
override func viewDidLoad() {
super.viewDidLoad()

// //カメラボタン生成
// self.view.addSubview(btnCamera)
// //読み込み
// self.view.addSubview(btnRead)
// // イメージビューの生成
// self.view.addSubview(imageView)

imageView.frame = CGRect(x: 150, y: 100, width: 200, height: 200)
imageView.contentMode = .scaleAspectFit
view.addSubview(imageView)

btnCamera.frame = CGRect(x: 0, y: 100, width: 100, height: 100)
btnCamera.setTitle("Camera", for: .normal)
btnCamera.tag = ButtonCamera
btnCamera.addTarget(self, action: #selector(self.onClick(sender:)), for: .touchUpInside)
btnCamera.backgroundColor = UIColor.green
self.view.addSubview(btnCamera)

btnRead.frame = CGRect(x: 0, y: 200, width: 100, height: 100)
btnRead.setTitle("Read", for: .normal)
btnRead.tag = ButtomRead
btnRead.addTarget(self, action: #selector(self.onClick(sender:)), for: .touchUpInside)
btnRead.backgroundColor = UIColor.red
self.view.addSubview(btnRead)

btnWrite.frame = CGRect(x: 0, y: 300, width: 100, height: 100)
btnWrite.setTitle("Write", for: .normal)
btnWrite.tag = ButtonWrite
btnWrite.addTarget(self, action: #selector(self.onClick(sender:)), for: .touchUpInside)
btnWrite.backgroundColor = UIColor.blue
self.view.addSubview(btnWrite)
}

//ボタンクリック時に呼ばれる
func onClick(sender:UIButton){
if sender.tag == ButtonCamera {
openPicker(sourceType: UIImagePickerControllerSourceType.camera)
}else if sender.tag == ButtomRead {
openPicker(sourceType: UIImagePickerControllerSourceType.photoLibrary)
}

}

//アラートの表示
func showAlert(title: String?, text: String?) {
let alert = UIAlertController(title: title, message: text, preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
present(alert, animated: true, completion: nil)
}

//イメージピッカーのオープン
func openPicker(sourceType:UIImagePickerControllerSourceType){
if !UIImagePickerController.isSourceTypeAvailable(sourceType){
showAlert(title: nil, text: "利用できません")
return
}

//イメージピッカーの生成
let picker = UIImagePickerController()
picker.sourceType = sourceType
picker.delegate = self

//ビューコントローラーのビューを開く
present(picker, animated: true, completion: nil)
}

// // イメージピッカーのイメージ取得時に呼ばれる
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let image = info[UIImagePickerControllerOriginalImage]as! UIImage
imageView.image = image
//ビューコントローラーのビューを閉じる
picker.presentingViewController?.dismiss(animated: true,completion:nil)
}

// //イメージピッカーのキャンセル取得時に呼ばれる
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.presentingViewController?.dismiss(animated: true, completion: nil)
}


}


と書きました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

Storyboard(ボタン)とコントローラーのコネクトがおかしいかもしれません。 

→そもそもコネクトができていません。
一般的にStoryboardを使用する場合、部品(ボタン)に対して何かしたときの動作をプログラムへ引き渡すためにIBActionというものをビューコントローラに定義する必要があります。

それぞれ機能を持つボタン(この場合はカメラやフォト読み込み)のCustom ClassのClassには何も選択されていません。 

→今回のケース(ボタンのアクションとプログラムがコネクトできていない)とは関係ありません。
これは、StoryBoard上の設定だけでUIButtonに独自の設定を追加したいときなどに使います。(枠線の色太さを指定できるなど)

どう直せば良いのでしょうか?

→前述の通り、ボタンからビューコントローラーにIBActionでコネクトしてください。
Swift3で開発されていると思いますので以下あたりを参考にされてみてください。
http://programming-beginner-memo.com/?p=18

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる