3

我是来自 C# .NET 的 Objective C 新手,我有这种情况:

假设我有 5 个 NSArrays 对应于 5 个 UIButtons。UIButtons 与 NSArray 具有完全相同的名称,因此例如一个 UIButton 称为 mainScreen,还有一个 NSArray 称为 mainScreen。

这五个按钮链接到一个 IBAction,我在其中执行以下操作:

- (IBAction)btnClick:(id)sender {
    NSString *category = [(UIButton *)sender currentTitle];
    NSLog(category);
   //Here I need to call the NSArray which has the same name as category
}

现在我可以得到 UIButton 的实际名称,但我怎样才能得到与该标题相同的 NSArray 呢?没有进入很多 if else 或 switch 语句?

4

5 回答 5

1

将名称与对象关联的最简单方法是使用NSDictionary(或它的可变子类NSMutableDictionary)。字典将唯一键映射到对象。键可以是任何对象(实现NSCopying协议),但通常NSString

查看NSDictionary ReferenceProgramming with Objective-C指南。

请注意,如果您使用按钮标题,如果您本地化您的应用程序,这可能会中断。

于 2013-07-10T06:24:55.473 回答
1

我要做的是将数组存储在NSDictionary. 然后,您可以将“键”设置为数组的名称,然后值就是数组本身。

这样你就可以说:

- (IBAction)btnClick:(id)sender {
    NSString *category = [(UIButton *)sender currentTitle];
    NSLog(category);
    //Here I need to call the NSArray which has the same name as category
    NSArray *theArray = (NSArray*)[self.myDictionary valueForKey:category];
}

希望这可以帮助!

于 2013-07-10T06:24:58.287 回答
1

你所做的并不是最好的方法。您应该为每个按钮提供标签,例如从 1 到 5。此外,您应该将五个数组放入一个数组中。现在你需要的是:

- (IBAction)btnClick:(id)sender
{
  NSInteger index = [sender tag] - 1;

  NSArray *array = [bigArray objectAtIndex:index];
} 

而已。

于 2013-07-10T06:25:05.183 回答
0

为所有 UIButton 分配不同的标签,然后使用它们的标签显式访问它们。

- (IBAction)btnClick:(id)sender {

    int tagIs  = [(UIButton *)sender tag];
    switch (tagIs) {
        case 1:
            // Access first button array
            break;
        case 2:
            // Access second button array

            break;
        default:
            break;
    }
}

或者您可以使用 AssociationObjects 方法将数据与对象关联,如下所示:首先导入:

#import <objc/runtime.h>

然后将密钥创建为:

static char * firstBtnKey = "firstBtnKey";
static char * secondBtnKey = "secondBtnKey";
  • -- -- 其他按键同理 ---

然后使用:

// Do any additional setup after loading the view, typically from a nib.
NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects:@"object1",@"object 2", nil];
objc_setAssociatedObject((UIButton *)[self.view viewWithTag:1],
                         firstBtnKey,
                         firstArray,
                         OBJC_ASSOCIATION_RETAIN);

NSMutableArray *secondArray = [[NSMutableArray alloc] initWithObjects:@"object1",@"object 2", nil];


objc_setAssociatedObject((UIButton *)[self.view viewWithTag:2],
                         secondBtnKey,
                         secondArray,
                         OBJC_ASSOCIATION_RETAIN);

`

然后访问这些数组:

- (IBAction)btnClick:(id)sender {

    int tagIs  = [(UIButton *)sender tag];
    switch (tagIs) {
        case 1:
            // Access first button array
    NSMutableArray *tempArr = (NSMutableArray *)objc_getAssociatedObject((UIButton *)sender, firstBtnKey);

            break;
        case 2:
            // Access second button array
    NSMutableArray *tempArr = (NSMutableArray *)objc_getAssociatedObject((UIButton *)sender, secondBtnKey);

            break;
        default:
            break;
    }
}

希望能帮助到你。

于 2013-07-10T06:25:17.100 回答
0

在大多数编程语言中,对象没有名称。[1]仅仅因为 UIButtons 与 NSArray(mainScreen) 具有完全相同的名称,并不意味着您的对象被“称为”mainScreen。
使用NSDictionary, 数组作为对象,按钮标题作为键。或使用按钮标签

title1= [[NSArray alloc] initWithObjects:@"1",nil];
title2= [[NSArray alloc] initWithObjects:@"2",nil];
title3= [[NSArray alloc] initWithObjects:@"3",nil];
title4= [[NSArray alloc] initWithObjects:@"4",nil];
title5= [[NSArray alloc] initWithObjects:@"5",nil];

dict = [[NSDictionary alloc] initWithObjectsAndKeys:title1,@"title1",title2,@"title2",title3,@"title3",title4,@"title4",title5,@"title5",nil];  

- (IBAction)btnClick:(id)sender {
    NSString *category = [(UIButton *)sender currentTitle];
    NSArray *arr = [dict objectForKey:category];

}
于 2013-07-10T06:43:17.013 回答