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

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

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

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

1308閲覧

ios 8 UIButton

tosi_1211

総合スコア138

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/09/16 04:09

編集2016/09/16 05:45

質問です。

今までsimulatorのバージョン9.3.1でビルドしてたのですが、
8.0もビルドしたくて、インストールしたのですが、

import UIKit class CustomView: UIView { override init(frame: CGRect) { super.init(frame: frame) backgroundColor = UIColor.whiteColor() let button = UIButton() button.frame.size = CGSize(width: 100, height: 100) button.frame.origin = CGPoint(x: 100, y: 100) button.backgroundColor = UIColor.blueColor() button.addTarget(ViewController(), action: #selector(ViewController.tapButton), forControlEvents: .TouchUpInside) self.addSubview(button) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
class ViewController: UIViewController { override func loadView() { super.loadView() let customView = CustomView(frame: view.frame) self.view = customView } func tapButton() { print("call") } }

このコードがiOS9.3だと大丈夫なのですが、ios8.1のシュミレーターだと落ちてしまいます。
原因がわかる方いらっしゃいますか?

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

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

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

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

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

fuzzball

2016/09/16 04:17

customViewとViewControllerの関係を教えて下さい。また、iOS9.3だと落ちないとのことですが、動作も正常なのでしょうか?
_Kentarou

2016/09/16 04:17

こちらのコードではいろいろ間違えている部分があり、ビルドすらできません。 最低限自身が確認しているような動くコードを載せてください。
tosi_1211

2016/09/16 04:33

コードを修正しました。 CustomViewはViewControllerのBaseViewです。 iOS9.3だと正常に動きます。
fuzzball

2016/09/16 05:07 編集

まだエラー出てますが?質問する気あるんでしょうか?あと、コードは ``` で囲って下さい。
fuzzball

2016/09/16 05:12

Storyboard上の質問です。Viewのカスタムクラスはどうなっていますか?buttonはどこに配置していますか?
tosi_1211

2016/09/16 05:18

すみませんstoryboardの画面をどうやって投稿していいかわからないので、 コードのみで書くと、上のコードです。
tosi_1211

2016/09/16 05:19

どこでエラーが発生しているでしょうか? 自分の手元ではエラーがありません
fuzzball

2016/09/16 05:29

まだエラー出てますが。新規にプロジェクトを作って試してみてはどうですか?
tosi_1211

2016/09/16 05:45

新規でプロジェクト作って動作確認できました
guest

回答2

0

fuzzballさんが解説している通りかと思います。

記載されているコードを変更する形で修正するとButtonのイベントを受けるViewControllerのインスタンスを初期化時に渡してそれに対してActionを設定するといいと思います。

swift

1class ViewController: UIViewController { 2 override func loadView() { 3 super.loadView() 4 let customView = CustomView(vc: self, frame: view.frame) 5 self.view = customView 6 print(UIDevice.currentDevice().systemVersion) 7 } 8 9 func tapButton() { 10 print("call") 11 } 12} 13 14import UIKit 15class CustomView: UIView { 16 17 init(vc: ViewController, frame: CGRect) { 18 super.init(frame: frame) 19 backgroundColor = UIColor.whiteColor() 20 let button = UIButton() 21 button.frame.size = CGSize(width: 100, height: 100) 22 button.frame.origin = CGPoint(x: 100, y: 100) 23 button.backgroundColor = UIColor.blueColor() 24 button.addTarget(vc, action: #selector(vc.tapButton), forControlEvents: .TouchUpInside) 25 self.addSubview(button) 26 } 27 28 required init?(coder aDecoder: NSCoder) { 29 fatalError("init(coder:) has not been implemented") 30 } 31}

投稿2016/09/17 00:06

_Kentarou

総合スコア8490

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

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

tosi_1211

2016/09/19 08:17

初期化の仕方とても参考になりました。ありがとうございます!
guest

0

ベストアンサー

CustomViewのこの部分、

swift

1button.addTarget(ViewController(), action: ... )

これだと、新しいViewControllerを生成し、それに対してイベントを割り当てていますが、この新しいViewControllerはどこにも使われていないので、直後に解放されてしまっているのではないかと思います。
タップされたときにイベントの主(ぬし)がいないので落ちてしまうんじゃないかと。(想像)

iOS9で落ちないのは、イベントの飛び先が無かったときに、同名の関数(tapButton)を勝手に探しているんじゃないかと。(これも想像です)

で、直し方ですが、

  1. CustomViewからViewControllerのインスタンスを拾えるようにして、addTarget時にそれを使う。
  2. ViewControllerの中でtapButton()をbuttonにaddTargetする。
  3. tapButton()をCustomViewの中に持ってくる。

などなど。

とりあえず3番が手っ取り早いですが。

投稿2016/09/16 06:39

fuzzball

総合スコア16731

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

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

tosi_1211

2016/09/19 08:18

複数の解決方法のご提案ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問