こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

xcode4.5(iOS6)でiPhoneアプリを作っています。
まだまだわからないことが多いですが・・・。

storyboard上でボタンを複数設置した際、
各ボタンに名称を設定して、プログラム上で
その名称を取得し、処理を行いたいと思っています。

すべてのボタンのアクションを1つのメソッドで受け、
senderの『名称』に応じて処理を変更したいということです。
いちいちswitchで処理を切り替えるのではなく、その『名称』を
そのまま利用したい為、任意で『名称』を設定したいのです。

C#などで言うと、Nameプロパティなるものがあれば
済むと思うのですが、Object-IDしかなく、任意に文字を
決められるプロパティが見当たりません。
文字で設定したい為、Tagプロパティ以外が欲しいです。

上記のようなことは出来ないのでしょうか?

投稿日時 - 2012-12-01 18:13:23

QNo.7824777

すぐに回答ほしいです

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

沢山ボタンがあって、それで、storyboardを切り替える、というのは、わからない状況ですが。

私は、使ったことありませんが、identity inspectorのuser defined attributes が使えるかもしれません。

投稿日時 - 2012-12-03 09:47:47

お礼

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];
}

投稿日時 - 2012-12-05 00:44:49

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

投稿日時 - 2012-12-02 11:30:25

お礼

ありがとうございます。
CS193Pというのをキーワードに調べて、見つけました。

しかしながら、この電卓の場合、画面に表示されている数字をそのまま利用しているから
実現できているだけと思われます。

画面の表示文字としては「あいうえお」などの人間が見て分かりやすいもの、
オブジェクトの名称としては「aiueo」などのコンピュータが見て分かりやすいもの、
といった具合に、画面の表示文字は利用したくないのです。


イメージ的には、
 ・Aボタンに任意の識別文字「aiueo」を設定
 ・Bボタンに任意の識別文字「abcde」を設定
 ・ボタンが押された際のメソッド内で、「aiueoStoryboard」や「abcdeStoryboard」という文字列を
  を生成してストーリーボードを取得し、そのStoryBoardに含まれるViewControllerを呼び出す

ということがしたいです。

投稿日時 - 2012-12-02 12:20:55