現在iOSのアプリケーションを作成しております。
経験がとても浅いため、苦労しております。
何卒皆様のお力をお貸し貰えると助かります。
前提として、ストーリーボードを利用しない形で、コードで部品の生成を行っております。
状況といたしましては、UIViewを継承したクラス(以後、HeaderView)を作成し、その上にボタンを配置しております。
そしてそれを別のUIViewを継承したクラス(以後、BaseView)にてSubViewとして配置しております。
そして、そのBaseViewをViewControllerにて配置しております。
今回出来なくて困っているのが、ViewControllerでよびだしたBaseViewのSubViewであるHeaderViewにのっているボタンにViewControllerからaddTargetが出来ないという点です。
希望としては、HeaderViewにのっているUIButtonへのaddTargetをViewControllerから行うことです。
class HeaderView: UIView {
init() {
let headerButton = UIButton()
self.addSubView(headerButton)
}
}
class baseView: UIView {
init() {
self.addSubView(HeaderView())
}
}
class ViewController: UIViewController {
override viewDidLoad() {
self.addSubView(baseView())
// ここでHeaderViewのheaderButtonに対してaddTargetをしたい。
}
}
とても複雑な状況かつ、稚拙な表現で申し訳ないのですが、何卒よろしくお願いします!
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
頑張ればできますが、、、あまりおすすめしません。
import UIKit
class HeaderView: UIView {
let headerButton = UIButton()
init() {
super.init(frame: CGRectMake(0, 0, 100, 100))
self.backgroundColor = UIColor.greenColor()
headerButton.frame = CGRectMake(0, 0, 100, 50)
headerButton.setTitle("Button", forState: .Normal)
self.addSubview(headerButton)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class BaseView: UIView {
let headerView = HeaderView()
init() {
super.init(frame: CGRectMake(0, 0, 200, 200))
self.backgroundColor = UIColor.yellowColor()
self.addSubview(headerView)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class ViewController: UIViewController {
let baseView = BaseView()
override func viewDidLoad() {
super.viewDidLoad()
baseView.headerView.headerButton.addTarget(self, action: #selector(ViewController.pushButton), forControlEvents: .TouchUpInside)
view.addSubview(baseView)
}
func pushButton() {
print("Push HeaderButton!")
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
t_obara
2016/05/11 21:32
一般的に、問題となる最小限のコードを提示すると回答がつきやすいかと思われます。また、xxということを実現したいために、addTargetをしたいというように記載することで、それはそもそも異なるやり方をすべきという回答がでるかもしれません。(要は目的を達成するための手段が間違っているケース)
さらに付け加えるならば、storyboardを利用しているのか否かも回答をするためには必要な情報かと思われます。
yukitoto
2016/05/11 21:39
丁寧にご指摘していただきありがとうございます!さっそく修正させていただきます!
fuzzball
2016/05/13 08:41 編集
解決しているのにアレですが、なぜViewControllerでaddTargetする必要があるのでしょうか?(tomohiro_obaraさんからも同様の指摘がありますが)
yukitoto
2016/05/13 09:43
ご質問ありがとうございます。
addTargetによって行いたいのが画面の遷移になり、ViewControllerの中にロジックを書くことになるので、ViewController内でやるのが自然だと思っていました。
fuzzball
2016/05/13 11:03
確かにそれは自然だと思いますが、その為に不自然なコードになってしまうのは良くないですよね。Kenterouさんの書かれているように、delegateやnotificationを使うなど、自然なコードにすることを今後の課題としてみてはどうでしょうか。(こういうの面倒臭いんですけど一度やればパターン化出来ますので)
なんだか変なまとめになってしまってすみませんw
yukitoto
2016/05/13 11:25
そうなんですね!プロトコル指向的な考え方ですかね...?
delegateやnotificationに対する知識がなさすぎてこういった未熟な考えしかできなかったです..!ご指摘を受け止めて、勉強してみたいと思います。