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

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

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

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

Swift

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

Swift 2

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

Q&A

解決済

1回答

4514閲覧

[Swift]カスタムビューで作成したUIButtonにaddTargetする方法

yukitoto

総合スコア53

iOS

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

Swift

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

Swift 2

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

0グッド

0クリップ

投稿2016/05/11 10:51

編集2016/05/11 12:44

現在iOSのアプリケーションを作成しております。
経験がとても浅いため、苦労しております。
何卒皆様のお力をお貸し貰えると助かります。

前提として、ストーリーボードを利用しない形で、コードで部品の生成を行っております。

状況といたしましては、UIViewを継承したクラス(以後、HeaderView)を作成し、その上にボタンを配置しております。
そしてそれを別のUIViewを継承したクラス(以後、BaseView)にてSubViewとして配置しております。
そして、そのBaseViewをViewControllerにて配置しております。

今回出来なくて困っているのが、ViewControllerでよびだしたBaseViewのSubViewであるHeaderViewにのっているボタンにViewControllerからaddTargetが出来ないという点です。
希望としては、HeaderViewにのっているUIButtonへのaddTargetをViewControllerから行うことです。

swift

1class HeaderView: UIView { 2 init() { 3 let headerButton = UIButton() 4 self.addSubView(headerButton) 5 } 6} 7 8class baseView: UIView { 9 init() { 10 self.addSubView(HeaderView()) 11 } 12} 13 14 15class ViewController: UIViewController { 16 override viewDidLoad() { 17 self.addSubView(baseView()) 18 // ここでHeaderViewのheaderButtonに対してaddTargetをしたい。 19 } 20}

とても複雑な状況かつ、稚拙な表現で申し訳ないのですが、何卒よろしくお願いします!

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

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

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

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

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

t_obara

2016/05/11 12:32

一般的に、問題となる最小限のコードを提示すると回答がつきやすいかと思われます。また、xxということを実現したいために、addTargetをしたいというように記載することで、それはそもそも異なるやり方をすべきという回答がでるかもしれません。(要は目的を達成するための手段が間違っているケース) さらに付け加えるならば、storyboardを利用しているのか否かも回答をするためには必要な情報かと思われます。
yukitoto

2016/05/11 12:39

丁寧にご指摘していただきありがとうございます!さっそく修正させていただきます!
fuzzball

2016/05/12 23:41 編集

解決しているのにアレですが、なぜViewControllerでaddTargetする必要があるのでしょうか?(tomohiro_obaraさんからも同様の指摘がありますが)
yukitoto

2016/05/13 00:43

ご質問ありがとうございます。 addTargetによって行いたいのが画面の遷移になり、ViewControllerの中にロジックを書くことになるので、ViewController内でやるのが自然だと思っていました。
fuzzball

2016/05/13 02:03

確かにそれは自然だと思いますが、その為に不自然なコードになってしまうのは良くないですよね。Kenterouさんの書かれているように、delegateやnotificationを使うなど、自然なコードにすることを今後の課題としてみてはどうでしょうか。(こういうの面倒臭いんですけど一度やればパターン化出来ますので) なんだか変なまとめになってしまってすみませんw
yukitoto

2016/05/13 02:25

そうなんですね!プロトコル指向的な考え方ですかね...? delegateやnotificationに対する知識がなさすぎてこういった未熟な考えしかできなかったです..!ご指摘を受け止めて、勉強してみたいと思います。
guest

回答1

0

ベストアンサー

頑張ればできますが、、、あまりおすすめしません。

swift

1import UIKit 2 3class HeaderView: UIView { 4 5 let headerButton = UIButton() 6 7 init() { 8 super.init(frame: CGRectMake(0, 0, 100, 100)) 9 10 self.backgroundColor = UIColor.greenColor() 11 12 headerButton.frame = CGRectMake(0, 0, 100, 50) 13 headerButton.setTitle("Button", forState: .Normal) 14 self.addSubview(headerButton) 15 } 16 17 required init?(coder aDecoder: NSCoder) { 18 fatalError("init(coder:) has not been implemented") 19 } 20} 21 22class BaseView: UIView { 23 24 let headerView = HeaderView() 25 26 init() { 27 super.init(frame: CGRectMake(0, 0, 200, 200)) 28 29 self.backgroundColor = UIColor.yellowColor() 30 self.addSubview(headerView) 31 } 32 33 required init?(coder aDecoder: NSCoder) { 34 fatalError("init(coder:) has not been implemented") 35 } 36} 37 38 39class ViewController: UIViewController { 40 41 let baseView = BaseView() 42 43 override func viewDidLoad() { 44 super.viewDidLoad() 45 46 47 baseView.headerView.headerButton.addTarget(self, action: #selector(ViewController.pushButton), forControlEvents: .TouchUpInside) 48 view.addSubview(baseView) 49 } 50 51 func pushButton() { 52 print("Push HeaderButton!") 53 } 54}

投稿2016/05/12 04:32

編集2016/05/12 05:42
_Kentarou

総合スコア8490

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

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

yukitoto

2016/05/12 22:49

ご回答ありがとうございます!! ViewControllerに元々あるViewを置き換えるときにはこういったことが多く起きるかなと思っていたのですがやり方が悪いんですかね...??
yukitoto

2016/05/12 23:01

` let headerView = HeaderView()`ここの部分がポイントですね!! ずっと let headerView: UIView? といった形で実装してたのでプロパティにアクセス出来ませんでした。これですっきりしました!!ありがとうございます!
_Kentarou

2016/05/12 23:07

やり方はいろいろあるので、実現したいことにより方法は選べばいいと思います。 一番上のViewのアクションを下に伝えるのに、Delegate、もっと離れている相手に伝えるのにNotification等の方法があります。そちらも覚えておくと違うところでも役に立つと思います。
yukitoto

2016/05/13 02:27

ご丁寧にありがとうございます! 調べて勉強してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問