1

12個のボタン、12個の小さいボタン、12個のラベルを備えたストーリーボードを作成しました。

それはそのようなものです:

btnBig1.tag = 1
btnSmall1.tag = 1
lbl1.tag = 1

btnBig2.tag = 2
btnSmall2.tag = 2
lbl2.tag = 2

等...

プロシージャが呼び出されたとき

- (IBAction)processButtonUpInside:(id)sender
{
     UIButton *nButton = (UIButton*)sender;
     int nInt =  nButton.tag;
}

... 3つのコントロール(大きなボタン、小さなボタン、ラベル)すべてで何かをしたいと思います。

次のようになります(擬似コード):

- (IBAction)processButtonUpInside:(id)sender
{
     UIButton *nButton = (UIButton*)sender;
     int nInt =  nButton.tag;

     UIButton *nButtonBig (UIButton*)CastFromTagID(nInt)
     //do something with the big button

     UIButton *nButtonSmall (UIButton*)CastFromTagID(nInt)
     //do something with the small button

     UILabel *nLabel (UILabel*)CastFromTagID(nInt)
     //do something with the label

}

ご覧のとおり、これCastFromTagIDは私の「独自の発明」です。私は実際にこれをどのように行うべきかわかりません。

誰かが助けることができますか?どうもありがとうございます。

4

3 に答える 3

2

ボタンファミリごとに3つの異なる開始点を使用できます。

enum {
    kTagFirstBigButton = 1000,
    kTagFirstSmallButton = 2000,
    kTagFirstLabel = 3000,
}

それらを使用してタグを割り当てます。

btnBig1.tag = kTagFirstBigButton + 1;
btnSmall1.tag = kTagFirstSmallButton + 1;
lbl1.tag = kTagFirstLabel + 1;

btnBig2.tag = kTagFirstBigButton + 2;
btnSmall2.tag = kTagFirstSmallButton + 2;
lbl2.tag = kTagFirstLabel + 2;
...

今では何でも簡単に見つけることができます。

- (IBAction)processButtonUpInside:(id)sender
{
     UIButton *nButton = (UIButton*)sender;
     /* I'm not sure what button is `sender` here
        If it's a big or small one you can guess 
        comparing its tag with the first tag 
     */
     int offset =  nButton.tag;

     UIButton *nButtonBig = (UIButton*)[view viewWithTag:kTagFirstBigButton + offset];
     //do something with the big button

     UIButton *nButtonSmall = (UIButton*)[view viewWithTag:kTagFirstSmallButton + offset];
     //do something with the small button

     UILabel *nLabel = (UILabel*)[view viewWithTag:kTagFirstLabel + offset];
     //do something with the label
}
于 2012-11-22T10:36:01.357 に答える
1

同じタグIDを異なるビューに割り当てないでください。

確かに、次のようなことをしてください。

btnBig1.tag = 11 btnSmall1.tag = 12 lbl1.tag = 13;
btnBig2.tag = 21 btnSmall2.tag = 22 lbl2.tag = 23;

次に、タグIDの最後の桁を検討します。

UIView *nView = (UIView *)sender;
if (lastDigit(sender.tag) == 3)
// this is a label 
{
    UIButton *nButtonBig = [nView.superview viewWithTag:nInt-2];
    UIButton *nButtonSmall = [nView.superview viewWithTag:nInt-1];
    UILabel *nLabel = (UILabel *)sender;
}
else if (lastDigit(sender.tag) == 2)
.....

ここで、lastDigit(sender.tag)は、指定された整数の最後の桁を返す関数です。

于 2012-11-22T09:43:21.747 に答える
-1

同じタグで編集したいサブビューへの参照がない場合は、特定のビューのすべてのサブビューを取得し、それらすべてをループして、タグが一致するかどうかを確認します。いくつかのコードを実行します。例えば..

#define kSameViewTag 9500001

for (int i = 0; i < 10; i++) // add a bunch of same tag views // 
{
  UIView *someview = [UIView new];
  someview.tag = kSameViewTag;
  [YourParent addSubview:someview];
}

その後、またはビューをループする必要があるときはいつでも、実行できます。

NSArray *subviews = [[YourParent subviews] copy];
for (UIView *v in subviews)
{
  if (v.tag == kSameViewTag)
  {
    // Do some code //
  }
}

サブビューが多数ある場合、これはパフォーマンスの問題になる可能性があるため、いつでもバックグラウンドスレッドで実行してから、メインスレッドにジャンプしてUIを更新できます。例えば:

NSArray *subviews = [[YourParent subviews] copy];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    for (UIView *v in subviews)
    {
        if (v.tag == kSameViewTag)
        {
            dispatch_async(dispatch_get_main_queue(), ^{
                // Do Some UI Stuff Here //
            });
        }
    }
});
于 2015-10-14T14:15:43.697 に答える