【iOS】コントロールに名前を付けたい

このQ&Aのポイント
  • xcode4.5(iOS6)でiPhoneアプリを作っています。まだまだわからないことが多いですが・・・。
  • storyboard上でボタンを複数設置した際、各ボタンに名称を設定して、プログラム上でその名称を取得し、処理を行いたいと思っています。すべてのボタンのアクションを1つのメソッドで受け、senderの『名称』に応じて処理を変更したいということです。いちいちswitchで処理を切り替えるのではなく、その『名称』をそのまま利用したい為、任意で『名称』を設定したいのです。
  • C#などで言うと、Nameプロパティなるものがあれば済むと思うのですが、Object-IDしかなく、任意に文字を決められるプロパティが見当たりません。文字で設定したい為、Tagプロパティ以外が欲しいです。上記のようなことは出来ないのでしょうか?
回答を見る
  • ベストアンサー

【iOS】コントロールに名前を付けたい

xcode4.5(iOS6)でiPhoneアプリを作っています。 まだまだわからないことが多いですが・・・。 storyboard上でボタンを複数設置した際、 各ボタンに名称を設定して、プログラム上で その名称を取得し、処理を行いたいと思っています。 ↑ すべてのボタンのアクションを1つのメソッドで受け、 senderの『名称』に応じて処理を変更したいということです。 いちいちswitchで処理を切り替えるのではなく、その『名称』を そのまま利用したい為、任意で『名称』を設定したいのです。 C#などで言うと、Nameプロパティなるものがあれば 済むと思うのですが、Object-IDしかなく、任意に文字を 決められるプロパティが見当たりません。 文字で設定したい為、Tagプロパティ以外が欲しいです。 上記のようなことは出来ないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

沢山ボタンがあって、それで、storyboardを切り替える、というのは、わからない状況ですが。 私は、使ったことありませんが、identity inspectorのuser defined attributes が使えるかもしれません。

naktak
質問者

お礼

storyboardを複数使う理由は、1つのstoryboardに全機能のViewControllerを 入れると膨大になり、開発時の視認性が劣ると思われるからです。 その為、機能単位にstoryboardを設けようとしています。 結果、教えて頂いた方法で実現できました。 ありがとうございます。 また、ここまでせずとも、開発時の視認性を高める方法が他にあるようでしたら ご教示ください。 【NameValueButton.h】 #import <UIKit/UIKit.h> @interface NameValueButton : UIButton @property (nonatomic, strong, readwrite) NSString* name; @end 【NameValueButton.m】 #import "NameValueButton.h" #import <objc/runtime.h> @implementation NameValueButton static int nameKey; - (id)initWithFrame:(CGRect)frame {  self = [super initWithFrame:frame];  if (self) {   // Initialization code  }  return self; } - (NSString*)name {  return objc_getAssociatedObject(self, &nameKey); } - (void)setName:(NSString*)name {  objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @end 【MenuViewController.m】 - (IBAction)clickAbilityButton:(id)sender {   UINavigationController *navigationController = (UINavigationController *)self.navigationController;   NameValueButton *button = (NameValueButton *)sender;   // 対象storyboardと初期表示ビューを見つけ出す   NSString *storyBoardName = [button.name stringByAppendingString:@"Storyboard"];   UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyBoardName bundle:nil];   UIViewController *initialViewController = [storyboard instantiateViewControllerWithIdentifier:                         button.name];      // ビューの表示   [navigationController pushViewController:initialViewController animated:YES]; }

その他の回答 (1)

回答No.1

できますよ。例は、iTune-Uで、CS193P(2011年秋)の電卓を作るプログラムの回を見ればわかる。

naktak
質問者

お礼

ありがとうございます。 CS193Pというのをキーワードに調べて、見つけました。 しかしながら、この電卓の場合、画面に表示されている数字をそのまま利用しているから 実現できているだけと思われます。 画面の表示文字としては「あいうえお」などの人間が見て分かりやすいもの、 オブジェクトの名称としては「aiueo」などのコンピュータが見て分かりやすいもの、 といった具合に、画面の表示文字は利用したくないのです。 イメージ的には、  ・Aボタンに任意の識別文字「aiueo」を設定  ・Bボタンに任意の識別文字「abcde」を設定  ・ボタンが押された際のメソッド内で、「aiueoStoryboard」や「abcdeStoryboard」という文字列を   を生成してストーリーボードを取得し、そのStoryBoardに含まれるViewControllerを呼び出す ということがしたいです。

関連するQ&A

  • senderに含まれているハンドルしてきたコントロールを知る方法

    VB2008 Vistaです。 似たような処理が3つあるので、subに3つのボタンをハンドルしました。 ただ、その一部をハンドルしてきたボタンによって処理を変えないといけないのですが、どのボタンがハンドルしてきたのかを知るすべがわからず困っています。 senderの中にボタンの名前(textプロパティの内容)が見つかったのですが、取り出し方がわかりません。(もしくは根本的に間違っているのかも知れませんが) どのようにすればよいでしょうか。

  • ASP.NET2.0でのコントロール配列

    早速質問させていただきます。 VB2005のWindowsアプリではtagプロパティを使ってオブジェクトの特定ができたので コントロール配列が可能でした。 '---ハンドラー作成 For i = 0 To 9 '//コイル1 AddHandler txt_(i).MouseDoubleClick, AddressOf txt_MouseDoubleClick txt_(i).Tag = i Next '---イベント処理 Private Sub txt_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim i As Integer i = CType(sender, TextBox).Tag end sub しかしASP.NET2.0のテキストボックスやコマンドボタンにはtagプロパティがない?ため、 イベント元オブジェクトを特定できません。これは代わりとなるプロパティがあるのでしょうか? それとも、ASP.NET2.0ではWindowsアプリのようなコントロール配列はできないのでしょうか? ご教授のほどよろしくお願い致します。

  • splitView 詳細画面左上[戻る]の動作

    初めて質問させていいただきます。 iOS開発の初心者です。Xcode4.6.3 storyboard(iPad) にてspritVewControllerを使った場合に、以下の実装をしたいのですが、その方法が分からず困っております。 何卒、よろしくお願いいたします。 【前提】 ・Single View Applicationテンプレート使用して、最初のviewControllerは削除します。 ・splitViewControllerを追加します。 ・splitViewControllerの「Is Initial View Controller」にチェックします。 ・下記サイトを参考にして、Main と Detail 画面は表示されるまでの最低限の実装はしています。(iPad 横、縦切り替えによって、Main と Detail 画面も切り替わる状態です)  http://program.station.ez-net.jp/special/handbook/objective-c/uisplitviewcontroller/implement.asp 【困っている事(やりたい事)】 ・iPad縦向きのときだけ、detail画面の左上ボタン(Mainに戻るボタン)をタップしたとき、自前で実装するactionメソッド(下記参照:backButtonEvent)へ飛ばして、また、このとき、左上ボタンをタップしたときの既存動作(左側からMain画面がスライド表示される)は維持したいのですが、以下の実装をしたところ、自前で追加したactionメソッドには飛びましたが、既存動作(左側からMain画面がスライド表示される)がされなくなりました。 =(EzDetailViewController.h)==★行が追加したところです ★- (IBAction)backButtonEvent:(id)sender; === =(EzDetailViewController.m)==★行が追加したところです - (void)splitViewController:(UISplitViewController*)splitController willHideViewController:(UIViewController*)viewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController:(UIPopoverController*)popoverController { // 渡された UIBarButtonItem に表示するタイトルを設定します。 barButtonItem.title = @"戻る"; ★ barButtonItem.target = self; ★ barButtonItem.action = @selector(backButtonEvent:);     :     : } ★- (IBAction)backButtonEvent:(id)sender ★{ ★ NSLog(@"Call in backButtonEvent."); ★} === そもそも、既存のbarButtonItemにaction追加したのがいけないのでしょうか。 ※これによって、既存動作処理が行われなくなったと推察していますが。。。 それとも、追加したactionメソッド内で、既存動作処理と同等のことを実装してあげないといけないのでしょうか。(もしそうであれば、この既存動作処理と同等の実装方法をご教授ください) はたまた、他の解決方法等ありましたら、是非、お教えいただきたく、よろしくお願いいたします。

  • 仮想メソッドをoverrideすると怪しい動作

    こんにちは。C#で仮想メソッドの勉強をしています。Form1でボタンを押すとフォームが閉じるメソッドを書きました。 Form2でoverrideしてメッセージボックスを表示するようにメソッドを再定義しました。 ここで問題なのですが、Form2でcmdCloseボタンをクリックすると「閉じます」というメッセージを表示した後に、もう一度「閉じます」というメッセージが表示されます。 2回メッセージが表示されるのが腑に落ちなく、何が原因なのかお教え頂きたく思います。よろしくお願いします。 Form1 /******************************************************************************/ // フォームクローズ /******************************************************************************/ protected virtual void cmdClose_Click(object sender, EventArgs e) { this.Close(); } Form2 /******************************************************************************/ // フォームクローズ /******************************************************************************/ protected override void cmdClose_Click(object sender, EventArgs e) { MessageBox.Show("閉じます"); }

  • VB.NET2003 カラーダイアログのタイトル

    VB.NET2003のカラーダイアログの左上の 「色の設定」 を任意の文字に変更したいのですが、いくらプロパティやメソッドを探しても見当たりません。 OpenFileDialogとかは変えれますので、こっちも変えれそうですが・・・。

  • タブコントロールの問題 (VB)

    次のようなもんだい問題がVBにて発生しました メソッド 'Private Sub TabControl1_Selected(sender As Object, e As System.Windows.Forms.TabControl)' でイベント 'Public Event Selected(sender As Object, e As System.Windows.Forms.TabControlEventArgs)' を処理できません。シグネチャに互換性がありません。 誰かどうやって修正したらいいか教えてください!!

  • Objective-Cの条件分岐についてお伺いしたい事があります。

    Objective-Cの条件分岐についてお伺いしたい事があります。 ボタンの名前をcurrentTitleプロパティで取得し、その名前を元に条件分岐処理を行いたく、下記の通りコードを書いているのですが、真の条件に適合しません。 コードの書き方が悪いんでしょうか?最近Objective-Cの勉強を始めたばかりで右も左も分からない状態です。どなたかご教授いただけないでしょうか? -(action) action: (id)sender; { UIButton* button = sender NSString * Str = button.currentTitle; if (str == @"ボタンの名前") {   条件が真の場合の処理 } }

  • objective-cでUIButtonを作成後

    xcodeのobjective-cで書いています。 UIButtonをプログラムで複数生成し、 その後別のボタンを作成し、そのボタンを押したら任意のボタンを削除(隠すのではなく)する方法を模索しています。 @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. for (int i = 0; i < 5; i++) { UIButton *bt = [UIButton buttonWithType:UIButtonTypeRoundedRect]; bt.frame = CGRectMake(20.0f, 20.0f + (i * 25), 20.0f, 20.0f); bt.tag = i; [bt addTarget:self action:@selector(pushBt:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:bt]; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)pushBt:(UIButton *)sender { [sender removeFromSuperview]; } 押したボタンを消す事はできるようなのですが、 一度に全て消す、tagの1と2を消す等の方法や考え方などご教授お願いします。

  • 同じソリューション内の別のプロジェクトのメソッド呼び出し

    同じソリューション内の別のプロジェクトのメソッド呼び出し お世話になっております。 Visual Studio でC#で開発をしております。 初心者です。 同じソリューション内にある別のプロジェクトのメソッドを呼び出す方法は どの様にしたら宜しいのでしょうか。 下記の様に記述しましたら、 「静的でないフィールド、メソッド、またはプロパティ ~省略~ で、  オブジェクト参照が必要です」と言うエラーが出てしまいます。 何か根本的に間違っているのかも知れません。 何卒、ご教授頂きたく宜しくお願い致します。         記 呼び出し側 private void button1_Click(object sender, EventArgs e) {   呼び出し先のプロジェクト名.クラス名.メソッド名();  } 呼び出される側 namespace プロジェクト名 { public class クラス名 {    メソッド名()    {      処理内容     }   }  }

  • ボタンのtagの番号を値渡しする方法について

    今、xcodeでiphoneやipad用のアプリを作っています。 VIewController(VC)に30個くらいのボタンを置き、そのボタンのタグ番号に合わせて、SecondVIewContorller(SVC)で、画像がでてきて、それをタップしたら、次の画像へ移動するというようにしたいのですが、VCのボタンのタグ番号をSVCに送ろうとするところでひっかかっています。もし何かご助言が頂けたら誠に幸いです。よろしくお願いします。 以下、自分なりにつくったコードです。 <VCの実装> - (IBAction)pushBtn:(UIButton *)sender { [self performSegueWithIdentifier:@"mySegue" sender:self];} -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if([segue.identifier isEqualToString:@"mySegue"]){ secondViewController*viewcon=segue.destinationViewController; viewcon.Number=[NSString stringWithFormat:@"%d",[sender tag]]; } これをSVCに送ってタグ番号をつけたいのですが、 以下の上から五行目のところの書き方のところでエラーがでてますが、他の書き方が わかりません。 <SVCの実装> - (void)viewDidLoad { [super viewDidLoad]; UIImage*imageDate=[UIImage imageNamed:@"%d,png",_Number]; CGRect rect=CGRectMake(0,0 ,200,200); UIImageView*imageView=[[UIImageView alloc]initWithFrame:rect]; imageView.image=imageDate; imageView.contentMode=UIViewContentModeScaleAspectFit; imageView.center=self.view.center; [self.view addSubview:imageView];} xcodeのバージョンは、5,0です。 重ね重ねよろしくお願いします。