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

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

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

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

Q&A

解決済

2回答

1608閲覧

swift3 viewController上のUIViewをボタンからカウントダウンする方法

sandalwalk

総合スコア77

Swift

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

0グッド

0クリップ

投稿2017/06/13 09:07

編集2017/06/13 09:08

この質問で、UIViewをflipしながらUIView上のラベルにカウントアップした整数を表示する方法を教えて頂きました。この回答を参考に、カウントダウンのボタンも設置し、カウントダウンの機能を実装しようとしたのですが、うまく動作しません。以下がコードですが、どの様に修正すれば良いでしょうか。

import UIKit class ViewController: UIViewController { var count = 0 @IBOutlet weak var countView: UIView! @IBOutlet weak var countLabel: UILabel! @IBAction func countUp(_ sender: Any) { sender.isEnabled = false // ボタンを使用不能にし、連続クリックを防止 UIView.transition( with: self.countView, // 緑のビューをアニメーション duration: 1.0, // 1.0秒でアニメーション options: UIViewAnimationOptions.transitionFlipFromLeft, // 左辺が持ち上がり垂直回転軸でフリップ animations: {() -> Void in self.countUp()}) // 裏返ったらカウントを増加 completion: {(_) -> Void in (sender as AnyObject).isEnabled = true}) // アニメーション終了後にボタンを使用可能にする } @IBAction func countDown(_ sender: Any) { sender.isEnabled = false // ボタンを使用不能にし、連続クリックを防止 UIView.transition( with: self.countView, // 緑のビューをアニメーション duration: 1.0, // 1.0秒でアニメーション options: UIViewAnimationOptions.transitionFlipFromLeft, // 左辺が持ち上がり垂直回転軸でフリップ animations: {() -> Void in self.countDown()}) // 裏返ったらカウントを増加 completion: {(_) -> Void in (sender as AnyObject).isEnabled = true}) // アニメーション終了後にボタンを使用可能にする } private func countUp(){ count += 1 countLabel.text = String("Count=\(self.count)") print(self.count) } private func countDown(){ count -= 1 countLabel.text = String("Count=\(self.count)") print(self.count) } override func viewDidLoad() { super.viewDidLoad() self.countUp() self.countDown() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

「動作しない」とおっしゃるのは、「Value of type 'Any' has no member 'isEnabled'」や「Cannot assign to immutable expression of type 'Bool!'」に類するメッセージが出てビルドできない、ということでしょうか?
もしそうでしたら、アクションの引数(_ sender: Any)(_ sender: UIButton)(_ sender: UIControl)にしてみてください(「UIControl」にすると、ボタン以外のコントロールをアクションに繋いでも動くようになるかと思います)。

説明図

「sender」はアクションを実行したオブジェクト(今回の場合ボタン)です。
その型が「Any」だと任意のオブジェクトがアクションを実行できるのですが、そのsenderオブジェクトがどんなプロパティやメソッドを持っているか分からなくなってしまうため(今回の場合「isEnabled」を持っていることが分からなくなっている)、アクションのコード中でsenderを使う際には適宜型を変換してやる必要があります。
一方「UIButton」や「UIControl」にすると、Swiftはそれを見て「senderはisEnabledを持っている」ことを知ることができるので、型変換なしにisEnabledプロパティにアクセスできます。

※もしsenderがややこしいと思われるのでしたら、senderは使わずに、ボタンを別途アウトレットとして接続してself.countUpButton.isEnabled = falseのようにしてボタンの使用可否を操作してもいいと思います。

投稿2017/06/13 11:20

Bongo

総合スコア10807

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

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

sandalwalk

2017/06/13 22:56

確かにご指摘いただいた部分は、コンパイルエラーが出ていたので、とりあえずコメントアウトしていましたが、今回のご指摘でOKになりました。 今回の質問は、countUp()と同様に、countDown()を作成し、全く同じ方法で実装したのですが(上記のコード)、(1)ラベル上の整数はカウントダウンボタンを押しても変更されない(2)countDown() { }の中でprint()を使って変数countをログに出力していみると、全く理解できない動きをします。例えば、countUpのボタンを3回押し、countDownのボタンを1回押した場合のログですが、 1 2 3 2 3 となります。最後の2,3がcountDownボタンを1回押した際に出力されたものです。単純にcountUp()と同様の方法を付け加えるだけではダメなのでしょうか。
Bongo

2017/06/14 00:08

今はXcodeが手元になく、こちらで確認できないのですが、もしかして3回目のcountUpボタンを押した後、アニメーションが終わる前にcountDownボタンを押すとそのようになりますか?もしそうなら、やはりsenderでボタンのisEnabledを操作するのは止めて、countUpボタンとcountDownボタンを両方ともアウトレットとして接続し、アニメーションアクションの中でそれらボタンを両方とも使用不能にして、アニメーション中はカウントアップもカウントダウンもできなくしてみるといいかもしれません。
sandalwalk

2017/06/14 00:46

ボタンを押すタイミングとは無関係です。新たなご指摘の方法も試しましたが、結果は同じでした。1番不思議なのは、countDownボタンを1回しか押していないのに、2,3と2つの数値が出力されることです。
sandalwalk

2017/06/14 02:03

コードを最初から書き直したら動作しました。(原因不明ですが、、とにかく動くようになりました) ありがとうございました。
guest

0

countUp()/Down()はcompletionの中で呼んでください。

投稿2017/06/13 23:56

fuzzball

総合スコア16731

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問