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

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

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

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

Swift

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

Q&A

解決済

1回答

2474閲覧

xib viewについて(xibでカスタムアラートを作ろうとしてます)

退会済みユーザー

退会済みユーザー

総合スコア0

iOS

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

Swift

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

0グッド

3クリップ

投稿2018/02/16 07:32

編集2018/02/18 12:54

viewcontroller.swift

import

1 2class ViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource{ 3 4 var pickerView = UIPickerView() 5 let number = ["回","lep"] 6 let datalist2 = ["kg","lbs"] 7 @IBAction func customalertbtr(_ sender: Any) { 8 /*let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 300 , height: 200)) 9 view.backgroundColor = .orange 10 self.view.addSubview(view)*/ 11 let customAlert = CustomAlert(frame: CGRect(x: 0.0, y: 0.0, width: 350 , height: 350)) 12 customAlert.center = self.view.center 13 customAlert.backgroundColor = .orange 14 print(customAlert) //これ追加 15 self.view.addSubview(customAlert) 16 } 17 @IBAction func btr(_ sender: Any) { 18 let alert = UIAlertController(title: "値を入力してください", message: "\n\n\n\n\n\n\n\n", preferredStyle: .alert) 19 // テキストフィールドを追加 20 alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in 21 textField.placeholder = "回数を入力してください。" 22 }) 23 //二個目 24 alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in 25 textField.placeholder = "重量を入力してください。" 26 }) 27 28 let saveAction = UIAlertAction(title: "OK", style: .default) { (action:UIAlertAction!) -> Void in 29 //self.mytableView.reloadData() 30 } 31 let cancelAction = UIAlertAction(title: "キャンセル", style: .default) { (action:UIAlertAction!) -> Void in 32 } 33 34 //PickerView 35 pickerView = UIPickerView(frame:CGRect(x:0, y:50, width:view.bounds.width*0.6, height:300)) // 配置、サイズ 36 pickerView.frame = CGRect(x:0, y:0, width:view.bounds.width*0.7, height:280) 37 pickerView.dataSource = self 38 pickerView.delegate = self 39 alert.view.addSubview(pickerView) 40 41 alert.addAction(saveAction) 42 alert.addAction(cancelAction) 43 44 present(alert, animated: true, completion: nil) 45 } 46 // PickerViewの列数 47 func numberOfComponents(in pickerView: UIPickerView) -> Int { 48 return 2 49 } 50 51 // PickerViewの行数 52 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 53 if component == 0 { 54 // 1個目のピッカーの設定 55 return number.count 56 } 57 return datalist2.count 58 } 59 60 // PickerViewの項目 61 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 62 if component == 0 { 63 return number[row] 64 } 65 return datalist2[row] 66 } 67 68 // PickerViewの項目選択時 69 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 70 71 } 72 73 74 override func viewDidLoad() { 75 super.viewDidLoad() 76 // Do any additional setup after loading the view, typically from a nib. 77 } 78 79 override func didReceiveMemoryWarning() { 80 super.didReceiveMemoryWarning() 81 // Dispose of any resources that can be recreated. 82 } 83 84 85} 86

custom alert.swift

import UIKit class CustomAlert: UIView ,UIPickerViewDataSource,UIPickerViewDelegate { let item = ["円","ドル"] @IBOutlet var myView: UIView! @IBOutlet weak var titlelbl: UILabel! @IBOutlet weak var exlbl: UILabel! @IBOutlet weak var lepslbl: UITextField! @IBOutlet weak var kg: UITextField! @IBOutlet weak var times: UILabel! @IBOutlet weak var sub: UIPickerView! @IBOutlet weak var kgandlbs: UISegmentedControl! @IBOutlet weak var lownormalhigh: UISegmentedControl! //コードから override init(frame: CGRect) { super.init(frame: frame) //self.commonInit() } //ストボーから required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) //self.commonInit() } fileprivate func commonInit() { guard let view = UINib(nibName: "CustomAlert", bundle: nil).instantiate(withOwner: self, options: nil).first as? UIView else { return } /*/ デリゲート設定 sub.delegate = self sub.dataSource = self*/ //view.frame = self.bounds self.addSubview(view) } @IBAction func cancelbtr(_ sender: Any) { } @IBAction func okbtr(_ sender: Any) { } // PickerViewの列数 func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } // PickerViewの行数 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return item.count } // PickerViewの項目 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return item[row] } // PickerViewの項目選択時 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { } }

やりたいこと
自分で作ったカスタムアラートを呼び出せるようにしたいです。

困っていること
コード内でのコードエラーはないが実行していざ呼び出そうとするとsignal sigabrtになってしまいます
おそらくviewcontroller.swiftでの呼び出しについてのコードがよくないのかなと考えらえれるのですがどこがダメなのか分からなく困っています。
xibのファイル名をcustomAlertに変更したらsignal sigabrtで強制終了はされなくはなったのですが以前alertが呼び出されずに困っています。

参考URL
https://dev.classmethod.jp/smartphone/xib/

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

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

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

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

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

fromageblanc

2018/02/16 07:48

カスタムビューのfile's ownerの設定は大丈夫ですか?
fuzzball

2018/02/16 07:58

「viewcontroller.swiftでの呼び出しについてのコードがよくないのかな」と書かれていますが、呼び出しのコードとはどれのことでしょうか?インスタンス生成のことですか?それともaddSubViewのことですか?
退会済みユーザー

退会済みユーザー

2018/02/16 08:10

@fromageblanc さん 説明欄の参考URLを参考にして作った時に確認したの大丈夫なはずです。
退会済みユーザー

退会済みユーザー

2018/02/16 08:16

@fuzzball さん self.view.addSubview(customAlert) の部分が間違っているのかなって思っています。
fuzzball

2018/02/16 08:20

回答書いてます。そこコメントアウトしても落ちますよね?
guest

回答1

0

ベストアンサー

swift

1UINib(nibName: "CustomAlert", ...(以下略)

これはxibのファイル名です。
ここを"View"に変更するか、xibのファイル名をCustomAlert.xibに変更して下さい。

投稿2018/02/16 08:14

fuzzball

総合スコア16731

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

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

退会済みユーザー

退会済みユーザー

2018/02/16 08:31

その一文を //xibで作ったカスタムアラートについて @IBAction func customalertbtr(_ sender: Any) { のなかに加えれば良いのでしょうか?
fuzzball

2018/02/16 08:32

いや、あなたのコードから抜粋したのですが‥。
退会済みユーザー

退会済みユーザー

2018/02/16 08:42

すいません。勘違いしてました。 つまり、custom alert.swiftの guard let view = UINib(nibName: "CustomAlert", bundle: nil).instantiate(withOwner: self, options: nil).first as? UIView else { の中のCustomAlertをViewに書き換えるか、CustomAlert.swiftを***.xibに変えれば良いのでしょうか?
fuzzball

2018/02/16 09:18

やってみれば分かりますから。自分の手を動かして下さい。 間違っても死にはしませんから。不安ならバックアップを取っておいて下さい。
退会済みユーザー

退会済みユーザー

2018/02/17 08:05

指摘された箇所のxibファイル名を変更したところボタンをタップしてもsignal sigabrtが起きなくなりました。しかしボタンをタップしてもアラートが表示されずに困っています。 それでView controllerを見て見たのですがインスタンスが結ばれていないから表示されていないのかそれとも呼び出すコードが足りないのかでアラートが表示されないのかなと思うのですが自分では解決方法が分からないので教えて頂けないでしょうか?
fuzzball

2018/02/17 08:22

customalertbtr()内の self.view.addSubview(customAlert) で、ViewControllerに乗っているはずです。 一度、CustomAlertの代わりに普通のViewを乗せて確認してもらえますか? let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 300 , height: 200)) view.backgroundColor = .orange self.view.addSubview(view) CustomAlertの方は一時的にコメントアウトしておいて下さい。
退会済みユーザー

退会済みユーザー

2018/02/17 09:01 編集

@fuzzball さんの下記のコードにしたところviewがで出てきました。恐らくバックグランドカラーが指定されなかったので真っ白の状態で表示されそれによって気づかなかったんだと思います。 ですがこのviewって恐らく自分がxibで作成したalertviewでは無いですよね? それかxibで作ったものが反映されていないのでしょうか?
fuzzball

2018/02/17 10:16 編集

そのViewはCustomAlertの代わりに、お試しで表示させただけです。それが表示されたということは、ViewControllerに乗せるところのコードは正しいということで、問題はCustomAlert側にあるということです。 さきほどのコードは削除して、元のCustomAlertのコードに戻しておいて下さい。戻した上で、下記のコードを追加し出力を教えて下さい。 let customAlert = CustomAlert(frame: ...(以下略) print(customAlert) //これ追加
退会済みユーザー

退会済みユーザー

2018/02/17 11:05

やはり元に戻すと何も表示されなくなってしまいます。ですのでcustomViewの方を見直して見たのですが私程度の知識レベルだとどこがどう間違っているのかもしくは反映させるコードが分からないです。 https://qiita.com/fromage-blanc/items/3a635ea160e20897831c 一応を似たことをしているサイトを参考に塾考してみたのですが分かりませんでした。
fuzzball

2018/02/17 11:07

「出力を教えて下さい」というのは画面のことではありません。 Consoleに表示されている出力を教えてください。
退会済みユーザー

退会済みユーザー

2018/02/17 12:28

console載せました。
fuzzball

2018/02/17 14:33 編集

ログは画像ではなくテキストで書くようにして下さい。 で、落ちてるじゃないですか‥。 alert_pickerって何なんでしょうか?
退会済みユーザー

退会済みユーザー

2018/02/17 14:52

alert_pickerについてご指摘して頂いたところ自分で確認しましたら custom alert.swiftでの記述で //self.commonInit() と /*/ デリゲート設定 sub.delegate = self sub.dataSource = self*/ //view.frame = self.bounds があるとalert_pickerがコンソールに表示されそれらをコメントアウトするとエラーが起きずにxibで作成したものでは無いview controllerで描いた普通のオレンジのviewが表示されました。
fuzzball

2018/02/17 14:55

>>普通のオレンジのviewが表示されました。 そのコードは削除して下さいと書いたはずですが。
退会済みユーザー

退会済みユーザー

2018/02/17 15:03

@fuzzballさんに教えて頂いたコードは削除してます。 viewを分かりやすくするために自分のコードの中にバックグランドカラーを加えただけなので特にこれに関しては問題は無いかかと思います。
fuzzball

2018/02/17 15:17

??? >>xibで作成したものでは無いview controllerで描いた普通のオレンジのview というのはCustomAlertのことなのでしょうか? ちょっと質問内のコードを現状のコードに更新してもらえますか? そちらで勝手に書き換えたコードは、私には把握出来ないのですよ。
退会済みユーザー

退会済みユーザー

2018/02/17 15:22

申し訳ございません。先程スクショを追加した時の最新のコードに更新しましたのでお手数ですが確認していただけると嬉しいです。
fuzzball

2018/02/17 15:36

//self.commonInit() のコメントを外すと落ちますか? 落ちるのであれば、一度CustomAlert.xibのOutletを再確認して下さい。(全て繋がっているかどうか、不要なOutletが無いかどうか)
退会済みユーザー

退会済みユーザー

2018/02/18 08:41

outletのスクショを追加しました。私的には繋がっていると思うのですが抜けているのでしょうか?
fuzzball

2018/02/18 08:44

コードではCustomAlertに9個のOutletがありますが、残りの6個はどうなっているのでしょうか?
退会済みユーザー

退会済みユーザー

2018/02/18 08:58

スクショを追加しました。 今全てのoutletを確認したとこmyviewを含めて2重になっていたoutletがいくつかあったので一回全てのoutletを切ってみて実行して見たらxibで作成したaletが表示されました。 それでなんですがもちろんoutletを繋げないとUIが機能しないのは分かるのですがまた繋げた場合にまた落ちるのでは無いかと思うのですが2重に繋げなければ大丈夫なんでしょうか?
fuzzball

2018/02/18 09:00

試してみてはどうですか?
退会済みユーザー

退会済みユーザー

2018/02/18 09:27

早速もう一度outletを繋げ直し、実行してみたら大丈夫でした。 数日間に渡り私の勉強不足により何度も丁寧に教えて頂きありがとうございました。 それと最後にキャンセルボタンの処理に以下のコードを追加したのですが myview.removeFromSuperview() そうするとxibのalertはなくなったのですがview controllerの方のコードのせいかオレンジの正方形が出てきたのですがこの場合、2重にviewが表示されているのでしょうか?
fuzzball

2018/02/18 09:34

現在環境が無いので確認できませんが、ViewControllerで生成したCustomAlertと、myViewは別物ですよ。(たぶん) self.removeFromSuperview() にすればいいのかな。
退会済みユーザー

退会済みユーザー

2018/02/18 09:39

self.removeFromSuperview()に変えましたら大丈夫でした。質問それてしまい申しわけございませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問