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

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

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

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

Swift

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

Swift 2

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

Q&A

解決済

2回答

2619閲覧

swift 異なるクラスからビューに追加

A-B-fly_man

総合スコア27

Xcode 7

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

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/04 04:54

編集2016/05/04 08:04

###前提・実現したいこと
一つのビューコントローラーにクラスを複数個置き、
仮にクラスAとクラスBとしたとき、クラスBからクラスAにオブジェクトを追加したいです。

###該当のソースコード

app. というのはDelegateを参照する変数です。

func onUpdate(timer : NSTimer){ app.deletealertInt += 1 print(app.deletealertInt) if app.deletealertInt == 20{ app.deletealertInt = 0 app.deletealert.invalidate() app.view3 = UIView(frame:CGRectMake(0,0,768,1024)) TimeEdit2 = UIImageView(frame: CGRectMake(187,159,650,450)) TimeEdit2.image = UIImage(named:"time edit.png") app.view3.addSubview(TimeEdit2) EffectView2.frame = CGRectMake(0,0,1024,768) self.EffectView2.alpha = 0.7 app.view3.addSubview(EffectView2) view.addSubview(app.view3) 〜〜}

クラスBでTimerを動かしています。viewがクラスAとなっています。

私が困っているのはview.addSubview(app.view3)
にてエラー(クラスAにクラスBでview3を追加しようとしているが参照できない的なもの)です。

###試したこと
TimerをDelegateに入れたりと、
追加する対象であるオブジェクトをDelegateに入れたりと
いろいろ考えてみましたが、できませんでしたので、できるよ、という方はよろしくお願いお致します。

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

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

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

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

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

guest

回答2

0

例文になりますが、例えば、1番目のビューコントローラ(ViewController)から、2番目のビューコントローラ(ViewController2)にボタンを配置したい時のコードを書きます。

ViewDidAppearの時にボタンを作って、次のビューに配置して画面遷移します。

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 // Do any additional setup after loading the view, typically from a nib. 7 } 8 override func viewDidAppear(animated: Bool) { 9 let Button = UIButton() 10 Button.backgroundColor = .redColor() 11 Button.frame = CGRectMake(100, 100, 100, 100) 12 13 let secondView = ViewController2() 14 secondView.view.addSubview(Button) 15 self.presentViewController(secondView, animated: true, completion: nil) 16 17 } 18 19} 20

これで、起動時に一つ目のビューコントローラで作成したボタンが2つ目のビューコントローラに配置されます。つまり、質問者様がおっしゃる、「異なるクラスからビューに追加」といった感じになります。

投稿2016/05/04 06:25

編集2016/05/04 06:26
ponyota

総合スコア38

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

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

A-B-fly_man

2016/05/04 08:16

コメントありがとうございます。 クラスBはclass UIButtonなのでViewじゃないのです。 勉強不足なためあまりわかりませんでしたので ponyota様 の書いてくださったコードをいろいろ調べながらやります。 ありがとうございます。
guest

0

ベストアンサー

細かい仕様は分からないので、カスタムボタンを押下した時にタイマーを開始して、3秒後にカスタムボタンが乗っているViewController赤いViewを乗せるようにしました。

カスタムボタンの中で赤いViewを作成してsuperViewViewControllerに乗せることもできますが、
Viewの管理が複雑になってしまうので、ViewControllerのメソッドを呼ぶようにしてViewControllerで管理したほうが良いと思います。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 let button1 = CustomButton(type: .Custom) 6 var viewArray: [UIView] = [] 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 // ボタン1を生成 12 button1.frame = CGRectMake(100, 100, 200, 50) 13 button1.setTitle("Button1", forState: .Normal) 14 button1.setTitleColor(UIColor.blueColor(), forState: .Normal) 15 button1.backgroundColor = UIColor.yellowColor() 16 button1.addTarget(self, action: #selector(ViewController.buttonPressed(_:)), forControlEvents: .TouchUpInside) 17 button1.userInteractionEnabled = true 18 button1.parent = self 19 button1.tag = 1 20 view.addSubview(button1) 21 } 22 23 func buttonPressed(sender: UIButton) { 24 if !button1.isMoveing && sender.tag == 1 { 25 // ボタン1押下時のイベント 26 print("Push! Button1") 27 } 28 } 29 30 func addView() { 31 let redView = UIView(frame: CGRectMake(CGFloat(10 + (viewArray.count * 55)), 100, 50, 50)) 32 redView.backgroundColor = UIColor.redColor() 33 view.addSubview(redView) 34 viewArray.append(redView) 35 } 36} 37 38 39// CustomButton Class 40class CustomButton: UIButton { 41 42 var isMoveing: Bool = false 43 weak var parent: ViewController? 44 45 var position: CGPoint! 46 var timer = NSTimer() 47 48 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 49 super.touchesBegan(touches, withEvent: event) 50 position = self.frame.origin 51 } 52 53 override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 54 super.touchesMoved(touches, withEvent: event) 55 56 isMoveing = true 57 58 let touchEvent = touches.first! 59 60 // ドラッグ前の座標 61 let preDx = touchEvent.previousLocationInView(superview).x 62 let preDy = touchEvent.previousLocationInView(superview).y 63 64 // ドラッグ後の座標 65 let newDx = touchEvent.locationInView(superview).x 66 let newDy = touchEvent.locationInView(superview).y 67 68 // ドラッグしたx座標の移動距離 69 let dx = newDx - preDx 70 71 // ドラッグしたy座標の移動距離 72 let dy = newDy - preDy 73 74 // 画像のフレーム 75 var viewFrame: CGRect = self.frame 76 77 // 移動分を反映させる 78 viewFrame.origin.x += dx 79 viewFrame.origin.y += dy 80 self.frame = viewFrame 81 } 82 83 override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 84 super.touchesEnded(touches, withEvent: event) 85 isMoveing = false 86 if position == self.frame.origin { 87 self.sendActionsForControlEvents(.TouchUpInside) 88 timer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: #selector(CustomButton.timerAction), userInfo: nil, repeats: false) 89 } 90 } 91 92 func timerAction() { 93 print("timerAction!") 94 parent?.addView() 95 } 96}

投稿2016/05/04 06:24

編集2016/05/04 09:57
_Kentarou

総合スコア8490

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

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

A-B-fly_man

2016/05/04 08:13

毎度コメントありがとうございます。 コピペさせていただき、実行に移しましたが私の勉強不足なためこれがどういう働きをしているものなのかを理解することができなかったので質問文を修正致しました。再読お願いお致します。 前回の カスタムボタンについてお願い致します。 というものの続きなのですが 普通の ViewController がクラスA で CustomButton がクラスB という考え方でお願い致します。上記のTimerのコードは全てクラスB内です。そこでクラスAのViewControllerにviewを追加しようとしたところ追加できなかった、ということなのですが、詳しく教えていただいてもよろしいでしょうか?申し訳ございません。  
_Kentarou

2016/05/04 09:59

回答を変更しました、確認してみてください。
A-B-fly_man

2016/05/06 07:15

返信が遅れ申し訳ございません。 ありがとうございます。 わがままを理解していただいたことを感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問