🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Xcode

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

Q&A

解決済

2回答

1189閲覧

Objective-Cでリセットボタンを作成したい

creater_ks

総合スコア7

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Xcode

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

0グッド

0クリップ

投稿2019/09/24 08:03

前提・実現したいこと

今月からObjective-Cの勉強を独学で始め、練習としてBMIの計算アプリを作成しています。
体重・身長を入力し、計算ボタンを押すとBMIの計算結果が表示される仕組みになっています。
Xcodeを使用しており、見た目はstorybordで作成してます。

今回はその計算が終わった後に、リセットボタンを押すことで、起動時の画面状態に戻したいと思っています。
リセットボタンの作成まではしましたが、これ以降わからず質問させていただきました。

現在のコード

Objective

1// 2// ViewController.h 3// BMI 4// 5// Created by Admin on 2019/09/10. 6// Copyright © 2019年 Admin. All rights reserved. 7// 8 9#import <UIKit/UIKit.h> 10 11@interface ViewController : UIViewController { 12 IBOutlet UITextField *tfHeight;//身長 13 IBOutlet UITextField *tfWeight;//体重 14 IBOutlet UIButton *btnCalc;//BMI計算ボタン 15 IBOutlet UILabel *labelBmiTitle;//BMIの文字 16 IBOutlet UILabel *labelBmiValue;//BMIの計算結果の数値 17 IBOutlet UILabel *labelBmiText;//BMIの計算結果の体重区分 18 IBOutlet UIButton *trashBtn;//リセットボタン 19 20} 21 22 23@end 24 25

Objective

1 2// 3// ViewController.m 4// BMI 5// 6// Created by Admin on 2019/09/10. 7// Copyright © 2019年 Admin. All rights reserved. 8// 9 10#import "ViewController.h" 11#import "SVProgressHUD.h" 12 13@interface ViewController () 14 15@end 16 17@implementation ViewController 18 19- (void)viewDidLoad { 20 [super viewDidLoad]; 21 // Do any additional setup after loading the view, typically from a nib. 22 23 labelBmiTitle.hidden = YES; //hide 24 labelBmiValue.hidden = YES; 25 labelBmiText.hidden = YES; 26 trashBtn.hidden = YES; 27 28 tfHeight.placeholder = @"0"; 29 tfWeight.placeholder = @"0"; 30 31 tfHeight.clearButtonMode = UITextFieldViewModeAlways; 32 tfWeight.clearButtonMode = UITextFieldViewModeAlways; 33 34} 35 36- (BOOL)textFieldShouldReturn:(UITextField*)textField{ 37 38 [textField resignFirstResponder]; //method 39 return YES; 40 41} 42 43float progress; 44 45- (IBAction)calcBmi{ 46 47 float height = [tfHeight.text floatValue] / 100; 48 float weight = [tfWeight.text floatValue]; 49 float bmiValue = weight / (height*height); 50 51 labelBmiValue.text = [[NSString alloc] initWithFormat:@"%.2f" , bmiValue]; 52 53 if(bmiValue < 18.5){ 54 labelBmiText.text = @"痩せ型"; 55 } else if (bmiValue < 25){ 56 labelBmiText.text = @"標準体重"; 57 } else { 58 labelBmiText.text = @"肥満"; 59 } 60 61 progress = 0.1; 62 [SVProgressHUD showProgress:progress]; 63 // 0.3秒後にintevalを呼ぶ 64 [self performSelector:@selector(interval) withObject:nil afterDelay:0.3f]; 65 66 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 67 68 labelBmiTitle.hidden = NO; 69 labelBmiValue.hidden = NO; 70 labelBmiText.hidden = NO; 71 trashBtn.hidden = NO; 72 73 }); 74 75} 76 77- (void)interval { 78 progress += 0.0001f;// 数値を上げて 79 [SVProgressHUD showProgress:progress]; // HUD表示 80 81 if(progress < 1.0f){ 82 // 0.3秒後にintervelを呼ぶ 83 [self performSelector:@selector(interval) withObject:nil afterDelay:0.0002f]; 84 } else { 85 // HUDを消す 86 [SVProgressHUD dismiss]; 87 } 88} 89 90//- (IBAction)reload{ 91// 92// 93//} 94 95 96- (IBAction)reloadInputViews{ 97 98 99 progress = 0.1; 100 [SVProgressHUD showProgress:progress]; 101 // 0.3秒後にintevalを呼ぶ 102 [self performSelector:@selector(interval) withObject:nil afterDelay:0.3f]; 103 104 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 105 106 107 }); 108 109} 110 111@end 112 113

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

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

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

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

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

takabosoft

2019/09/24 08:36

念の為確認しておきますが、Swiftではなく、あえてObjective-Cを選択した何かしらの理由があるんですよね?既存のプロジェクトがObjective-Cを使っているとか。
creater_ks

2019/09/25 05:02

その通りです。 現在進行しているプロジェクトがObjective-Cを使用しているため、が勉強する経緯になります。
guest

回答2

0

助言をいただき自己解決できましたので、こちらに記載させていただきます。

OBJECTIVE

1- (IBAction)reload{ 2 3 progress = 0.1; 4 [SVProgressHUD showProgress:progress]; 5 // 0.3秒後にintevalを呼ぶ 6 [self performSelector:@selector(interval) withObject:nil afterDelay:0.25f]; 7 8 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 9 10 self->labelBmiTitle.hidden = YES; 11 self->labelBmiValue.hidden = YES; 12 self->labelBmiText.hidden = YES; 13 self->trashBtn.hidden = YES; 14 15 self->tfHeight.text = @""; 16 self->tfWeight.text = @""; 17 18 }); 19 20}

投稿2019/09/25 06:44

creater_ks

総合スコア7

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

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

0

ベストアンサー

まずリセットボタンを押した時に、何をしないといけないかを整理しましょう。
つまりリセットボタンの仕様を考えてください。

一応ViewControllerを再構築する、なんて方法もありますが、今回はそこまでする必要はないでしょう。

投稿2019/09/24 08:34

takabosoft

総合スコア8356

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

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

creater_ks

2019/09/25 05:16 編集

計算するために数字が入っているテキストエリアを初期値に戻す、計算後表示されている計算結果のBMIを再び非表示にする。 この二つを一つのボタンに組み込みたいと思っています。
takabosoft

2019/09/25 05:55

ではリセットボタンが押されたら、そのような処理を行うように、実際にコーディングしてください(躓いているようには見えませんが・・・)。
creater_ks

2019/09/25 06:41

深く考えすぎてしまい、自分から難しいことをしようとしてました・・・。 一応自分で解決できました。 ひとつ教えていただきたいのが、ViewControllerを再構築する場合はどうなるのでしょうか。
takabosoft

2019/09/25 07:37

StoryboardからViewControllerのインスタンスを生成できますので、そのViewControllerをKeyWindowのrootViewControllerにセットしてあげる感じで実装すれば、ほぼ初期状態に戻せます(ViewControllerをを手動で差し替える感じです)。もちろんグローバル変数やクラス変数といったものがあれば、完全に初期状態に戻るわけではありませんので、ご注意ください。
creater_ks

2019/09/25 08:35

わざわざありがとうございます。 今後、勉強していく中で必要になった時にはこちらを参考にさせていただきます。 今回はありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問