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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Xcode

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

Swift

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

Swift 2

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

Q&A

解決済

2回答

1566閲覧

UIButtonと.removeSuperViewについて

JectABC

総合スコア34

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Xcode

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

Swift

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

Swift 2

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

0グッド

0クリップ

投稿2016/11/18 12:59

これはモンスターと戦闘するプログラムです。
ボタンを押すとまた新たなボタンが作られていくようにしていて
”進む”ボタンの表示まではきちんと動作し、次の”攻撃”ボタンが出てきます。しかしその”攻撃”ボタンを押すと前の進むボタンの動作ttt()と攻撃ボタンの動作AtackFase()が両方行われます。

ボタンを消す時に.removeSuperView()を使っているのですが、
これを使ってボタンを消した場合fildButtonのプロパティは残ってしまうのでしょうか?

他にも要因があるのかもしれません
長いですが記述していることはそんなに難しくないので
ご指摘お願いします。

import Foundation import UIKit class ViewController3: UIViewController { //上からモンスター用、敵hp、name,playlerクラスインスタンス(自分のステータスなどが定義されている) var ImageView = UIImageView() var hpLavel = UILabel() var namelabel = UILabel() var player3 = mystetas() var tikarank = 1 var tikarank2 = 0 var b:Int = 0 //乱数 //フィールドでのボタン定義 let fildButton = UIButton() let fildButoon2 = UIButton() let fildButton3 = UIButton() let fildButton4 = UIButton() //enemyクラスをインスタンス化 var monster1 = sraim() var monster2= minidragon() var monster3= busi() var vsHp:Int = 0 //戦闘時hp var metamol = Anemmystate(name: "不明") //城門選択フォーム(最初に実行) func joumon(){ fildButton.frame = CGRect(x: 50,y: 200,width: 100,height: 21) fildButton.backgroundColor = UIColor.grayColor() fildButton.setTitle("西門", forState: .Normal) fildButton.addTarget(self, action: #selector(ViewController3.west(_:)), forControlEvents: UIControlEvents.TouchUpInside) view.addSubview(fildButton) fildButoon2.frame = CGRect(x: 150,y: 200,width: 100,height: 21) fildButoon2.backgroundColor = UIColor.grayColor() fildButoon2.setTitle("東門", forState: .Normal) fildButoon2.addTarget(self, action: #selector(ViewController3.ertht(_:)), forControlEvents: UIControlEvents.TouchUpInside) view.addSubview(fildButoon2) fildButton3.frame = CGRect(x: 50,y: 400,width: 100,height: 21) fildButton3.backgroundColor = UIColor.grayColor() fildButton4.frame = CGRect(x: 150,y: 400,width: 100,height: 21) fildButton4.backgroundColor = UIColor.grayColor() } //西区の選択画面 func west(sender:AnyObject){ sender as! UIButton reMove() fildButton.setTitle("A地区", forState: .Normal) fildButton.addTarget(self, action: #selector(ViewController3.Forward(_:)), forControlEvents: UIControlEvents.TouchUpInside) view.addSubview(fildButton) fildButoon2.setTitle("B地区", forState: .Normal) fildButoon2.addTarget(self, action: #selector(ViewController3.Forward(_:)), forControlEvents: UIControlEvents.TouchUpInside) view.addSubview(fildButoon2) } //東区の選択画面 func ertht(sender:AnyObject){ sender as! UIButton reMove() fildButton.setTitle("C地区", forState: .Normal) fildButton.addTarget(self, action: #selector(ViewController3.Forward(_:)), forControlEvents: UIControlEvents.TouchUpInside) view.addSubview(fildButton) fildButoon2.setTitle("D地区", forState: .Normal) fildButoon2.addTarget(self, action: #selector(ViewController3.Forward(_:)), forControlEvents: UIControlEvents.TouchUpInside) view.addSubview(fildButoon2) fildButton3.setTitle("E地区", forState: .Normal) fildButton3.addTarget(self, action: #selector(ViewController3.Forward(_:)), forControlEvents: UIControlEvents.TouchUpInside) view.addSubview(fildButton3) } //フィールドコマンド表示 func Forward(sender:UIButton){ reMove() fildButton.setTitle("進む", forState: .Normal) fildButton.addTarget(self, action: #selector(ViewController3.ttt(_:)), forControlEvents: UIControlEvents.TouchUpInside) view.addSubview(fildButton) print("進む出た") } //攻撃ボタン表示 func ATT(sender:UIButton){ reMove() fildButton.setTitle("攻撃", forState: .Normal) fildButton.addTarget(self, action:#selector(ViewController3.AtackFase(_:)),forControlEvents: UIControlEvents.TouchUpInside) view.addSubview(fildButton) print("攻撃ボタン表示") } //攻撃処理 func AtackFase(sender: UIButton){ print("攻撃した") reattack(player3.myap) hphyuji() if vsHp < 1 { //倒した時の処理 print("hp0で進むが出る") hpLavel.text = "" Forward(fildButton) ImageView.removeFromSuperview() }else{ //倒せてない時の処理 print("倒せてない") metamol.attack() print(String(vsHp)) } hphyuji() } func reMove(){ print("remove") fildButton.removeFromSuperview() fildButoon2.removeFromSuperview() fildButton3.removeFromSuperview() fildButton4.removeFromSuperview() } func reattack(ac:Int) { vsHp -= ac if vsHp <= 0{ vsHp = 0 print(String(vsHp) + ",0のはず") } print(String(vsHp)) print("モンスターが攻撃を受けた") } //敵表示 func ttt(sender:UIButton){ tikarank += 1 b = Int(arc4random_uniform(5)) tikarank2 = tikarank + b switch tikarank2 { case (0...6): ImageView.image = UIImage(named: "sraim") srim2.change(player3.mylevel) metamol.statse(monster1) case (7...13): ImageView.image = UIImage(named: "mini") mini2.change(player3.mylevel) metamol.statse(monster2) case (14...17): ImageView.image = UIImage(named: "busi") busi2.change(player3.mylevel) metamol.statse(monster3) default : srim2.change(player3.mylevel) ImageView.image = UIImage(named: "sraim") metamol.statse(monster1) } vsHp = metamol.hitpoint view.addSubview(ImageView) print("vsHPは" + String(vsHp)) hphyuji() ATT(fildButton) } //hp表示 func hphyuji(){ hpLavel.text = String(vsHp) + "/" + String(metamol.maxpoint) namelabel.text = metamol.name + ":" + String(metamol.anlevel) + "Level" view.addSubview(hpLavel) view.addSubview(namelabel) print("表示した") } class Anemmystate { var name:String var anap:Int = 0 //攻撃 var andp:Int = 0//防御 var maxpoint:Int = 0 var anlevel:Int = 1{ didSet{ maxpoint = anlevel * 5 hitpoint = anlevel * 5 anap = anlevel * 1 } } var hitpoint:Int = 0 var player = mystetas() init (name:String,anlevel:Int = 1) { self.name = name self.anlevel = anlevel } func attack() { player.myhp -= anap print("プレイヤーが攻撃を受けた") } func statse(enemy: Anemmystate){ self.name = enemy.name self.anlevel = enemy.anlevel self.anap = enemy.anap self.hitpoint = enemy.hitpoint self.maxpoint = enemy.maxpoint print("ステータスリセット") } } class sraim:Anemmystate{ override var anlevel: Int{ didSet{ maxpoint = anlevel * 5 hitpoint = anlevel * 5 anap = anlevel * 1 } } init(anlevel:Int = 1){ super.init(name: "スライム", anlevel: anlevel) } var a:Int = 0 func change(plylevel:Int){ anlevel = plylevel + Int(arc4random_uniform(3)) } } class minidragon:Anemmystate{ override var anlevel: Int{ didSet{ maxpoint = anlevel * 7 hitpoint = anlevel * 7 anap = anlevel * 2 } } init(anlevel:Int = 1){ super.init(name: "ミニマムドラゴン", anlevel: anlevel) } var a:Int = 0 func change(plylevel:Int){ anlevel = plylevel + Int(arc4random_uniform(3)) } } class busi:Anemmystate{ override var anlevel: Int{ didSet{ maxpoint = anlevel * 10 hitpoint = anlevel * 10 anap = anlevel * 5 } } init(anlevel:Int = 1){ super.init(name: "武士", anlevel: anlevel) } var a:Int = 0 func change(plylevel:Int){ anlevel = plylevel + Int(arc4random_uniform(3)) } } //プレイヤークラス class mystetas {---} override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. joumon() hpLavel.frame = CGRect(x: 80,y: 80, width: 200,height: 21) hpLavel.textColor = UIColor.blackColor() namelabel.frame = CGRect(x: 120,y: 120, width: 200,height: 21) ImageView.frame = CGRect(x: 120,y: 100,width: 150,height: 200) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

print結果
最初に進むボタンが表示され、そのボタンを押した瞬間の結果から書いていきます。

remove
remove
進む出た
ステータスリセット
5
表示した
remove
攻撃ボタン表示

・次に表示された攻撃ボタンを押した時

remove
remove
進む出た
ステータスリセット
10
表示した
remove
攻撃ボタン表示
攻撃した
9
モンスターが攻撃を受けた
表示した
倒せてない
プレイヤーが攻撃を受けた
表示した
9

・以降進むボタンは出てこず、表示は攻撃ボタンのままで、結果も同じです。

swift2 xcode7利用

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

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

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

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

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

guest

回答2

0

ベストアンサー

removeFromSuperviewしてもオブジェクトが削除されるわけではありませんので、プロパティは残ったままです。
また、addTargetは、イベントの設定(上書き)ではなく追加です。今のままだと、addTargetするたびに複数の関数が呼ばれることになります。

おまけ

  • ステータス: status
  • フィールド: field
  • スライム: slime
  • 敵: enemy
  • 東: east
  • 攻撃: attack
  • フェーズ: phase

投稿2016/11/20 23:50

編集2016/11/21 00:17
fuzzball

総合スコア16731

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

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

0

ボタンを消す時に.removeSuperView()を使っているのですが、

これを使ってボタンを消した場合fildButtonのプロパティは残ってしまうのでしょうか?

インスタンスは破棄されませんので残りますね。

投稿2016/11/19 05:39

fromageblanc

総合スコア2724

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

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

JectABC

2016/11/20 20:57

同じインスタンスオブジェクトを使いまわしていて、毎回プロパティは変えているのですが、同じボタンが表示されている状態です。最初の辺り、城門から地区まではきちんと名前もaddTargetの内容も変わっています。何が違うのでしょう?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問