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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

350閲覧

Swiftで作成したアクションシートが表示されず、アクションシート内の項目が勝手に開く。

wLike

総合スコア1

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2020/06/22 01:08

前提・実現したいこと

カメラかアルバムかを選ぶアクションシートが開くクラスを作成して、
メソッドを呼ぶだけで各場所に表示させたい。

発生している問題・エラーメッセージ

カメラのみが開いてしまう。

該当のソースコード

showAlert.swift

import Foundation
import UIKit

class showAlert{

func showAlert(camera :Void,album: Void,view :UIViewController){ let alertController = UIAlertController(title: "プロフィール画像", message: "どちらを使用しますか?", preferredStyle: .actionSheet) let action1 = UIAlertAction(title: "カメラ", style: .default) { (UIAlertAction) in camera } let action2 = UIAlertAction(title: "アルバム", style: .default) { (UIAlertAction) in album } let action3 = UIAlertAction(title: "キャンセル", style: .cancel) alertController.addAction(action1) alertController.addAction(action2) alertController.addAction(action3) view.present(alertController, animated: true, completion: nil) }

}

ViewController.swift

@IBAction func ImageViewTapGesture(_ sender: UITapGestureRecognizer) {

let generator = UINotificationFeedbackGenerator() generator.notificationOccurred(.success) alert.showAlert(camera: openCamera(), album: openAlbum(), view: self) } func openCamera(){ let picker = UIImagePickerController() picker.sourceType = .camera picker.delegate = self // UIImagePickerController カメラを起動する present(picker, animated: true, completion: nil) picker.allowsEditing = true } func openAlbum(){ let picker = UIImagePickerController() picker.sourceType = .photoLibrary picker.delegate = self // UIImagePickerController カメラを起動する present(picker, animated: true, completion: nil) picker.allowsEditing = true } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if info[.originalImage] as? UIImage != nil{ let selectedImage = info[.originalImage] as? UIImage UserDefaults.standard.set(selectedImage?.jpegData(compressionQuality: 0.1), forKey: "userImageData") userImageView.image = selectedImage picker.dismiss(animated: true, completion: nil) } }

swift

1 // styleをActionSheetに設定 2 let alertSheet = UIAlertController(title: "title", message: "message", preferredStyle: UIAlertControllerStyle.ActionSheet) 3 4 // 自分の選択肢を生成 5 let action1 = UIAlertAction(title: "1", style: UIAlertActionStyle.Default, handler: { 6 (action: UIAlertAction!) in 7 }) 8 let action2 = UIAlertAction(title: "aka", style: UIAlertActionStyle.Destructive, handler: { 9 (action: UIAlertAction!) in 10 }) 11 let action3 = UIAlertAction(title: "cancel", style: UIAlertActionStyle.Cancel, handler: { 12 (action: UIAlertAction!) in 13 }) 14 15 // アクションを追加. 16 alertSheet.addAction(action1) 17 alertSheet.addAction(action2) 18 alertSheet.addAction(action3) 19 20 self.presentViewController(alertSheet, animated: true, completion: nil)

試したこと

始めたばかりなのでどこが間違っているのかわからず、何をどう試せば良いのかわかりませんでした。
すみません。

補足情報(FW/ツールのバージョンなど)

Xcode 11.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

Swift

1alert.showAlert(camera: openCamera(), album: openAlbum(), view: self)

この記述だと、showAlert()を呼び出す段階で最初のopenCamera()関数を評価し、実行してしまいます。

これが原因で

発生している問題・エラーメッセージ
カメラのみが開いてしまう。

という現象が発生してしまいます。

また、showAlertの宣言部分で前二つの引数がVoid型になっていますが、これも誤りです。

加えて、引数として受け取った関数を実行する部分が、単なる変数の評価になってしまっています。

実現したいことは関数としてshowAlert()に渡すことだとおもいますので、

  1. showAlert の引数を 引数が Void型で戻り値が Void型 の関数やクロージャ として指定する
  2. 引数として受け取った関数を実行する
  3. 上記を受けて、関数の実行部分を訂正する

という変更を行えば、おそらくご期待の結果になるかと思います。

具体的には

Swift

1// 引数の型を変更 2func showAlert(camera : @escaping () -> Void, album: @escaping () -> Void, view :UIViewController){ 3 4 // 略 5 let action1 = UIAlertAction(title: "カメラ", style: .default) { (UIAlertAction) in 6 // 関数として実行するので () をつける 7 camera() 8 } 9 10 let action2 = UIAlertAction(title: "アルバム", style: .default) { (UIAlertAction) in 11 // 関数として実行するので () をつける 12 album() 13 }

と変更した上、呼び出し側は

Swift

1 // 関数名だけを渡す 2 alert.showAlert(camera: openCamera, album: openAlbum, view: self)

として実行してみてもらえますでしょうか。

投稿2020/06/22 04:17

TsukubaDepot

総合スコア5086

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

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

wLike

2020/06/23 08:48

うまく行きました!本当にありがとうございます!天才!!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問