Использование тега buttons для присвоения переменной в Cocoa

#objective-c #cocoa #xcode

#objective-c #cocoa #xcode

Вопрос:

Можно ли использовать тег кнопки для установки переменной?

Вот что я имею в виду:

Нажатие кнопки извлекает ее тег, который также будет переменной.

Затем откройте NSPanel, позвольте пользователю выбрать файл и нажмите OK, который сохранит путь к выбранному файлу в виде строки.

Затем задайте строку пути к соответствующей переменной…

Я думаю, что задаю это правильно. Я только начинаю, поэтому, пожалуйста, не отвергайте меня, просто попросите разъяснений, и я их предоставлю.

Я думаю, все, что мне нужно знать, как это сделать, это запросить кнопку для ее тега… но я довольно долго гуглил это, и пока мне не везло.

Дополнения:

Вот что я пытаюсь сделать.

Допустим, я создаю небольшой массив:

 NSMutableArray *myArray = [NSMutableArray array];
[myArray addObject:@"blank"];
[myArray addObject:@"blank"];
[myArray addObject:@"blank"];
  

У меня есть 3 кнопки, каждая с тегами 0, 1 и 2 соответственно.

У меня также есть функция, скажем, setPath.

Что я хотел бы, чтобы setPath использовал тег кнопки, поэтому, если я нажму buttonOne, тег who’s равен 0, объекту будет присвоен индекс 0 с путем, который хранится с использованием NSOpenPanel, но если я нажму buttonTwo, тег who’s равен 1, объекту будет присвоен индекс 1, используя путь, который получает NSOpenPanel.

Я думаю, что это лучшее описание…

Комментарии:

1. MyButton. тег должен давать вам тег. Не уверен, что вы действительно ищете.

Ответ №1:

Я не уверен, что это то, что вы хотите, но вы можете взять значение из поля тега и присвоить его переменной, т.Е.:

 int a = myButton.tag;
  

Поле тега — это просто значение int, которое является частью класса UIButton.

Ответ №2:

Тегом представления является NSInteger . Из вашего описания звучит так, будто вы либо верите, что тегом может быть NSString , либо хотите, чтобы кнопка tag была указателем на NSString , который вы извлекли бы из sender тега в методе действия кнопки.

Я подозреваю, что вы просто не понимаете, что tag может содержать представление, но если вы рассматривали возможность присвоения значению тега значения указателя на объект, я не советую этого делать. Это антишаблон и хрупкий при загрузке.

Вам гораздо лучше переосмыслить то, что вы пытаетесь сделать. Это значение, которое вы получаете обратно из NSOpenPanel или NSSavePanel чего-то, что вы хотите сохранить до тех пор, пока существует ваш объект? Или это то, что вам нужно достаточно долго, чтобы обработать значение?

Если вам просто нужен путь, скажем, для чтения содержимого файла, локальная переменная вполне подойдет. Если вам нужно значение на неопределенный срок, используйте свойство.

Ответ №3:

У вас есть пара вариантов, и я делаю это время от времени, это практически единственный способ сделать это, если у вас огромное количество NSResponders, отправляющих одно и то же действие.

 -(IBAction)someAction:(NSButton *)sender
{
    switch(sender.tag)
    { 
    //one possibility
    case 0:
    //do something
        break;
    }
    //another possibility
    id objectOfInterest = [someArray objectAtIndex:sender.tag];
}
  

Ответ №4:

Поскольку теги являются значениями int, вы могли бы сопоставить теги объектам NSString с помощью NSDictionary:

 self.pathsForTags = [[NSDictionary alloc] initWithObjectsAndKeys:
    @"/path/one", [NSNumber numberWithInt:1],
    @"/path/two", [NSNumber numberWithInt:2],
    @"/path/three", [NSNumber numberWithInt:3],
    nil];
  

 - (IBAction)buttonClicked:(UIButton *)sender
{
    NSNumber *key = [NSNumber numberWithInt:sender.tag];
    NSString *path = [self.pathsForTags objectForKey:key];
    // Use path here
}  

Было бы еще проще использовать индексы NSArray (как предложил Grady Player), а не NSDictionary, но у вас было бы меньше контроля над возможными значениями тега (они должны были бы быть последовательными, начиная с 0).