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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

526閲覧

複数のボタンをひとつのIBActionにつなげる方法

Tomzy

総合スコア104

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/10/16 05:49

編集2018/10/19 07:22

問題の概要

TableViewの中のstatic cellsにボタンを押すごとに4枚のimageが変わる機能を設けました。最初のひとつのセルでのボタンをIBActionに結びつけた場合は書いたコードどおり機能しています。

しかし、このケースの場合static cellsにしましたので6つのセルの数だけIBActionをストーリーボード上のボタンと接続する必要があります。TableViewの中のセルをstatic cellsにした理由はセルの内容などをデーターベースとして処理する都合などあり、動的セルであると不具合があるためです。

そこでストーリーボード上のタブを使いひとつのIBActionと6個のボタンを接続しタブを0から5まで設定しましたが、switch文の中のコードに「Use of unresolved identifier 'image'」などのエラーがでて前に進みません。
対応方法を教えて頂ければ幸いです。

参考にしたURL

リンク内容
リンク内容
リンク内容
リンク内容

ストーリーボード上のTableViewスクリーンショット(この交通手段とあるイメージを4枚切り替えるのが問題です)

イメージ説明

ひとつのボタンーIBActionで成功したコード

//複数乗り物画像をボタンで変換するコード(ひとつのセルだけ)ここから・・・・・ @IBAction func onNext(sender: AnyObject) { // 表示している画像の番号を1増やす dispImageNo += 1 // 表示している画像の番号を元に画像を表示する displayImage() } /// 表示している画像の番号 var dispImageNo = 0 /// 表示している画像の番号を元に画像を表示する func displayImage() { // 画像の名前の配列 let imageNameArray = [ "KoutsuShudanNone", "BusImg", "TrainImg", "KoutsuShudanOther" ] // 画像の番号が正常な範囲を指しているかチェック // 範囲より下を指している場合、最後の画像を表示 if dispImageNo < 0 { dispImageNo = 3 } // 範囲より上を指している場合、最初の画像を表示 if dispImageNo > 3 { dispImageNo = 0 } // 表示している画像の番号から名前を取り出し let name = imageNameArray[dispImageNo] // 画像を読み込み let image = UIImage(named: name) // Image Viewに読み込んだ画像をセット imageTransImage01DepCell01.image = image }

##ひとつのボタンでのImageを出したスクリーンショット(左の交通手段という画像4枚が変わります。ここでは2枚のみ添付しました。)
イメージ説明
イメージ説明
注:このスクリーンショットでのカギのボタンが2段目からSegmented controlになっているが直近のストーリーボードではカギイメージとボタンになっています。

複数のボタンにしてエラーがでたコード(黄色1個と赤色4個)

// Save01TableViewController.swift //途中 略 class Save01TableViewController: UITableViewController { //途中 略 @IBOutlet weak var buttonTransImage01DepCell01: UIButton! @IBOutlet weak var imageTransImage01DepCell01: UIImageView! //途中 略 //複数乗り物画像をボタンで変換するコードここから・・・・・ enum actionTag: Int { case onNext1 = 0 case onNext2 = 1 case onNext3 = 2 case onNext4 = 3      case onNext5 = 4 case onNext6 = 5 } /// 表示している画像の番号 var dispImageNo = 0 /// 表示している画像の番号を元に画像を表示する func displayImage() { // 表示している画像の番号を元に画像を表示する //displayImage() // 画像の番号が正常な範囲を指しているかチェック // 範囲より下を指している場合、最後の画像を表示 if dispImageNo < 0 { dispImageNo = 3 } // 範囲より上を指している場合、最初の画像を表示 if dispImageNo > 3 { dispImageNo = 0 } // 画像の名前の配列 let imageNameArray = [ "KoutsuShudanNone", "BusImg", "TrainImg", "KoutsuShudanOther" ] // 表示している画像の番号から名前を取り出し let name = imageNameArray[dispImageNo] // 画像を読み込み let image = UIImage(named: name) //黄色エラー } @IBAction func onNext(_ sender: Any) { // 表示している画像の番号を1増やす dispImageNo += 1 // 表示している画像の番号を元に画像を表示する displayImage() guard let onNext = sender as? UIButton else { return } switch onNext.tag { // Image Viewに読み込んだ画像をセット case onNext1: imageTransImage01DepCell01.image = image //赤色エラー case onNext2: imageTransImage01DepCell02.image = image//赤色エラ case onNext3: imageTransImage01DepCell03.image = image//赤色エラ case onNext4: imageTransImage01DepCell04.image = image//赤色エラ case onNext5: imageTransImage01DepCell05.image = image//赤色エラ case onNext6: imageTransImage01DepCell06.image = image//赤色エラ default: print("") return } } //複数乗り物画像をボタンで変換するコード(ひとつのセルだけ)  ここまで

ひとつのIBActionと6つのボタンを結んだスクリーンショット(左の黒い部分に結ばれた4個のボタンが表示されています。この画面では4個しか現れていません。)

イメージ説明

エラー文スクリーンショット2枚 いずれもFIX指示がある

イメージ説明
イメージ説明

FIXを実施したあとのエラーは添付のスクリーンショットのとおりです。

イメージ説明

ご参考事項
環境は下記のとおりです。
MacBook Pro (15-inch, 2016)
High Sierra OS10.13.6
Version 9.4 (9F1027a)Swift4

交通手段とあるイメージを4枚切り替えるこの問題が解決したら右側のカギマークと保存の機能もひとつのIBActionに結びたいと思っています。

最初に表示する「交通手段」のイメージは当初下記のコードで表示しましたが現在はコメントアウトしています。またストーリーボード上もイメージは選んでいません。

override func viewDidLoad() { super.viewDidLoad() //imageTransImage01DepCell01.image = UIImage(named: "KoutsuShudanNone")

イメージ説明
よろしくお願いします。

2018.10.17. 11:39現在のコード

現状でのコードは下記のとおりです。

Save01TableViewController.swift //略略略略 class Save01TableViewController: UITableViewController { //略略略略 @IBOutlet weak var buttonTransImage01DepCell01: UIButton! @IBOutlet weak var imageTransImage01DepCell01: UIImageView! //略略略略 //複数乗り物画像をボタンで変換するコードここから・・・・・ enum actionTag: Int { case onNext1 = 0 case onNext2 = 1 case onNext3 = 2 case onNext4 = 3 case onNext5 = 4 //抜けていたので追加 case onNext6 = 5 //抜けていたので追加 } /// 表示している画像の番号 var dispImageNo = 0 // 画像の名前の配列 let imageNameArray = [ "KoutsuShudanNone", "BusImg", "TrainImg", "KoutsuShudanOther" ] /// 表示している画像の番号を元に画像を表示する func displayImage() -> UIImage? { print ("ここまで来たdisplayImage ") //let image = displayImage() // 表示している画像の番号から名前を取り出し let name = imageNameArray[dispImageNo] // 画像を読み込み let image = UIImage(named: name) // 画像の番号が正常な範囲を指しているかチェック // 範囲より下を指している場合、最後の画像を表示 if dispImageNo < 0 { dispImageNo = 3 } // 範囲より上を指している場合、最初の画像を表示 if dispImageNo > 3 { dispImageNo = 0 } return image } @IBAction func onNext(_ sender: Any) { // 表示している画像の番号を1増やす dispImageNo += 1 print ("ここまで来たIBAction dispImageに1を加える") let image = displayImage() // 表示している画像の番号を元に画像を表示する guard let onNext = sender as? UIButton else { return } switch onNext.tag { // Image Viewに読み込んだ画像をセット case 0: imageTransImage01DepCell01.image = image print ("ここまで来た case 1") case 1: imageTransImage01DepCell02.image = image case 2: imageTransImage01DepCell03.image = image case 3: imageTransImage01DepCell04.image = image case 4: imageTransImage01DepCell05.image = image case 5: imageTransImage01DepCell06.image = image default: print("") return } }

2018.10.19現在のコード

// Save01TableViewController.swift //略略略略 //複数乗り物画像をボタンで変換するコード(ひとつのセルだけ)  ここまで /// 表示している画像の番号 var dispImageNo = 0 // 4画像の名前の配列 let imageNameArray = [ "KoutsuShudanNone", "BusImg", "TrainImg", "KoutsuShudanOther" ] /// 表示している画像の番号を元に画像を表示する func displayImage() -> UIImage? { print ("ここまで来たdisplayImage ") //let image = displayImage() // 表示している画像の番号から名前を取り出し let name = imageNameArray[dispImageNo] // 画像を読み込み let image = UIImage(named: name) // 画像の番号が正常な範囲を指しているかチェック // 範囲より下を指している場合、最後の画像を表示 if dispImageNo < 0 { dispImageNo = 3 } // 範囲より上を指している場合、最初の画像を表示 if dispImageNo > 2 { dispImageNo = 0 } return image //fuzzballさん助言を反映 } @IBAction func onNext(_sender:Any){ //senderにすると落ちる // 表示している画像の番号を1増やす dispImageNo += 1 print ("ここまで来たIBAction dispImageに1を加える") let image = displayImage() //fuzzballさん助言を反映 // 表示している画像の番号を元に画像を表示する //displayImage() guard let onNext = _sender as? UIButton else { return } switch onNext.tag { // Image Viewに読み込んだ画像をセット case 0: imageTransImage01DepCell01.image = image print ("ここまで来た case 0")

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Tomzyさん、こんにちは。
質問に対する回答ではないのですが、気が付きましたので書き込みます。
すでに解決済みでしたらご容赦ください。

2018.10.19現在のコードについて、

####配列の最初の画像が表示されない件について

dispImageNo:初期値”0”

ボタンタップ-> dispImageNo += 1 -> 1

画像表示/dispImageNo は"1"/配列の"1"の画像を表示

ボタンタップ-> dispImageNo += 1 -> 2

画像表示/dispImageNo は"2"/配列の"2"の画像を表示
...
というふうに処理されていますので、配列0の画像が表示されないようです。

####onNext内で、senderにすると落ちる件について

@IBAction func onNext(_sender:Any){ //<- _ senderが_senderとタイプされ、引数名が違ってしまってます //もろもろ処理 }

投稿2018/10/20 01:19

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

1つ目

とりあえずですが、displayImage()の中のimageは、関数外では見えません。(onNext(_:)ではアクセス出来ないということ)

displayImage()の戻り値をimageにして、onNext(_:)側で受け取るようにして下さい。

swift

1func displayImage() -> UIImage? { 2 : 3 return image //imageを返す 4} 5 6@IBAction func onNext(_ sender: Any) { 7 : 8 let image = displayImage() //imageを受け取る 9 : 10}

2つ目

swift

1@IBAction func onNext(_ sender: Any) {

なぜ_を追加したのでしょうか?(最初の、成功したコードには無いようですが)

投稿2018/10/16 06:08

編集2018/10/17 02:48
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tomzy

2018/10/16 07:05

早速ありがとうございました。 外出から帰ったら、やってみます。
Tomzy

2018/10/16 13:59

下記のコードにしたら赤いエラーは消えてビルドできました。しかし、イメージはボタンをタップしても変わらず、Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffee5bf1ff8)のエラーがでて止まります。どこがおかしいのでしょうか。ご教示ください。なお、下記の経緯があります。 AAA return image のところにUse of unresolved identifier 'image'というエラーがでるので、func displayImage() -> UIImage? { の下にlet image = displayImage()を入れるとエラーは消えました。 BBB switchの下にcase onNext1 : imageTransImage01DepCell01.image = image とすると エラーUse of unresolved identifier 'onNext1'が出てDid you mean 'onNext'? FIXとなりますので、case 1: imageTransImage01DepCell01.image = image とするとエラーは消えます。 コード  ↓ ↓ ↓ //複数乗り物画像をボタンで変換するコードここから・・・・・ enum actionTag: Int { case onNext1 = 0 case onNext2 = 1 case onNext3 = 2 case onNext4 = 3 } /// 表示している画像の番号 var dispImageNo = 0 // 画像の名前の配列 let imageNameArray = [ "KoutsuShudanNone", "BusImg", "TrainImg", "KoutsuShudanOther" ] /// 表示している画像の番号を元に画像を表示する func displayImage() -> UIImage? { let image = displayImage() // 表示している画像の番号から名前を取り出し let name = imageNameArray[dispImageNo] // 画像の番号が正常な範囲を指しているかチェック // 範囲より下を指している場合、最後の画像を表示 if dispImageNo < 0 { dispImageNo = 3 } // 範囲より上を指している場合、最初の画像を表示 if dispImageNo > 3 { dispImageNo = 0 } return image } @IBAction func onNext(_ sender: Any) { // 表示している画像の番号を1増やす dispImageNo += 1 // 画像を読み込み //let image = UIImage(named: name) let image = displayImage() // 表示している画像の番号を元に画像を表示する //displayImage() guard let onNext = sender as? UIButton else { return } switch onNext.tag { // Image Viewに読み込んだ画像をセット case 1: imageTransImage01DepCell01.image = image case 2: imageTransImage01DepCell02.image = image case 3: imageTransImage01DepCell03.image = image case 4: imageTransImage01DepCell04.image = image case 5: imageTransImage01DepCell05.image = image case 6: imageTransImage01DepCell06.image = image default: print("") return } }
fuzzball

2018/10/17 00:14

>>return image のところにUse of unresolved identifier 'image'というエラーがでるので なぜ、 let image = UIImage(named: name) を削除してしまったのでしょうか?
Tomzy

2018/10/17 02:38

いろいろやって見ました。一番下のCASE 1をCASE 0に変更しました。現状は下記のとおりです。 エラーは消えてビルドすると画面はでます。しかし、ボタンをタップするとコンソールに下記のメッセージがでて止まります。画像は変化しません。 reason: '-[RouteSearchMemo.Save01TableViewController onNextWithSender:]: unrecognized selector sent to instance 0x7f9f2011c200' 検索すると:を外せとか付け加えよなどいろいろ助言がありますが分かりません。ご教示ください。現状のコードを本文の修正版に載せます。
fuzzball

2018/10/17 02:42

いや、色々やる前にですね、元のコードに私の回答を反映させた「だけ」の結果を教えて欲しいのですが。
Tomzy

2018/10/17 02:45

すいません。再現して連絡します。
fuzzball

2018/10/17 02:49

回答更新しました。 あと、コードは ``` で囲って下さい。(追記分のコード)
Tomzy

2018/10/17 03:05

最初の質問時のコードに2カ所助言通りのコードを追加した結果は下記のとおりです。 return image //imageを返す→赤色エラーUnexpected non-void return value in void function let image = displayImage() //imageを受け取る→黄色エラー Constant 'image' inferred to have type '()', which may be unexpected
Tomzy

2018/10/17 03:09

更新コードに記号を追加しました。
Tomzy

2018/10/17 03:22

//なぜ_を追加したのでしょうか? ちょっと、思い出せません。今回改めて_を削除して見たのですが、結果は→ ビルドすると画面はでます。しかし、ボタンをタップするとコンソールに下記のメッセージがでて止まります。画像は変化しません。 reason: '-[RouteSearchMemo.Save01TableViewController onNext:]: unrecognized selector sent to instance 0x7feabf013c00'
fuzzball

2018/10/17 03:50

一度、onNextに紐付いているActionを削除して、繋ぎ直してもらえますか?
Tomzy

2018/10/17 05:43

取り急ぎご報告します。つなぎ直したら4枚のうち3枚は変わりました。3つのボタンで試しました。4回目のボタンタップで落ちます。原因を調べて報告します。
Tomzy

2018/10/17 06:13

まだ、原因が分かっていませんが、ストーリーボード上のイメージファイルを削除しましたら、イメージ部分が白紙になります。ボタンをタップするとイメージはNo.0は出ず、1,2,3 と変わり落ちるのですが、コンソールのメッセージの末尾に下記が現れます。なお、クリーン、DeriveDataは削除しゴミ箱を空にしました。Xcodeも一旦終了しRouteSearchMemo.xcodeprojで立ち上げています。 RouteSearchMemo was compiled with optimization - stepping may behave oddly; variables may not be available.
Tomzy

2018/10/17 06:24

let name = imageNameArray[dispImageNo]のところに赤色エラーThread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)が表示されます。 また、CASE 0 CASE 1 CASE 2 と1度ずつタップするとイメージは1、2、3と現れてCASE3で落ちます。 やりたいことは、CASE 0〜5でそれぞれアプリを立ち上げ時にはイメージ0が表示され、タップごとに0→1→2→3→0→1・・・・となることです。
Tomzy

2018/10/19 07:04

現状は試行錯誤の結果、1→2→3→1・・・でタップごとにイメージは変換されますが、4枚でなく3枚の繰り返しになります。どこかでロジックがおかしいようなのですが、下記にテストの結果を書きますのでご教示頂ければ幸いです。 AAA @IBAction func onNext(_sender:Any){より_を削除して@IBAction func onNext(sender:Any){とするとビルドはできますが、ボタンをタップすると落ちます。 BBB 0と1のイメージを差し替えますと、イメージは変わりますので、イメージの不具合ではなく、ロジック上0が表示されないと思われます。 CCC 当初よりの次のコードでは、4回目のタップで落ちますif dispImageNo > 3 { dispImageNo = 0 } これをif dispImageNo > 2 { dispImageNo = 0 にすると1→2→3→1のごとく落ちることなく3枚が表示され0は表示されません。 DDD 最新のコードを本文補足2に掲載しました。
Tomzy

2018/10/20 07:19

tyobigorouさんへ こんにちは。 投稿ありがとうございました。 if dispImageNo > 2 { dispImageNo = -1 にしましたら、狙ったとおりの4枚画像交換になりました。 if dispImageNo > 3 {にすると何故か落ちます。もっと考えてみます。なお、teratailよりメールで知らせがあり、それを見るとtyobigorouさんの投稿が見られますが、teratailの画面では表示されませんでした。いずれにしてもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問