Можно ли добавить второй тег к кнопке UI? - PullRequest
4 голосов
/ 01 мая 2011

Мне было интересно, можно ли добавить второй тег в UIButton?Я создал несколько кнопок программно в цикле for и мне нужна ссылка на номер кнопки (например, 0, 1, 2) и другая ссылка (целое число), в которой я сохраняю ссылку на страницу, на которую ссылается кнопкак (например, 22, 30, 49).Числа не связаны, поэтому я не могу определить первое через второе.

Вот что я хотел бы иметь:

for (int k=0; k < numberOfTabs; k++) // k < 4 (e.g. 3 < 4) 
{
    UIButton* btn = [[[UIButton alloc] initWithFrame:frame] autorelease];
    btn.tag = k;

btn.tag2 = someReference;

    btn.frame = CGRectMake(-10, 0, buttonWidth, buttonHeight);
    [btn    addTarget:self
            action:@selector(tabAction:)
  forControlEvents:UIControlEventTouchUpInside];
    [btn    addTarget:self
                action:@selector(tabDelete:)
      forControlEvents:UIControlEventTouchDragOutside];
/...

Буду очень признателен за любые предложения.

Ответы [ 5 ]

5 голосов
/ 01 мая 2011

Нет, вы не можете. По крайней мере, не напрямую. Вы можете создать подкласс UIButton и добавить еще одно свойство int, но это кажется излишним для того, что вы хотите ..

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

например. если у вас есть pageNumber и buttonNumber, вы можете создать тег для кнопок, например:

button.tag = pageNumber*100 + buttonNumber;

и когда вы хотите, к какой странице принадлежит кнопка или каков индекс кнопки на странице, вы можете дакодировать тег:

int pageNum = button.tag /100;
int buttonNum = button.tag % 100;
3 голосов
/ 01 мая 2011
  • Создайте подкласс UIButton с вашим вторым тегом, объявленным как свойство.

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

Я бы предпочел решение с массивами, так как я стараюсь по возможности предотвращать создание подклассов.

2 голосов
/ 01 мая 2011

Почему бы не сохранить вторые (больше, если нужно) параметры в чем-то вроде NSMutableArray?

NSMutableArray *button_to_page = [[NSMutableArray alloc] init];

...

for(...)
{

// Your button creation code

[button_to_page addObject:[NSNumber numberWithInt:my_button.tag];

}

Вы можете получить номер своей страницы в любое время, просто проиндексировав массив button_to_page.Вы также можете найти в массиве номер страницы и получить индекс кнопки (при необходимости).

Теперь, сказав, что здесь вы создаете новый объект NSNumber для тега страницы каждой кнопки, а также переносите вокругNSMutableArray для загрузки.Я действительно думаю, что подкласс UIButton - это путь.Мне не нравится идея кодировать вещи в один тег, если нет веской причины.Если вы подкласс, вы все еще сохраняете UIButton довольно легковесным, и все ваши данные очень четко инкапсулированы в одном и том же объекте:

MultiTag_UIButton.h

#import <Foundation/Foundation.h>

@interface MultiTag_UIButton : UIButton {

}
@property (nonatomic, assign) int page;

@end

MultiTag_UIButton.m

#import "MultiTag_UIButton.h"

@implementation MultiTag_UIButton

@synthesize page;

@end

Это действительно так просто, вам не нужно писать какой-либо код, просто добавьте свойство страницы, и вы начнете участвовать в гонках.Тогда вы можете сделать это:

MultiTag_UIButton *test_button = [[MultiTag_UIButton alloc] init];

test_button.tag = 1;
test_button.page = 23;

NSLog(@"tag %i  page %i", test_button.tag, test_button.page);

[test_button release];

Чисто и просто.Реально вам нужно было бы сделать немного больше в новом классе, но вы поняли.

1 голос
/ 01 мая 2011

Вы можете создать подкласс, но затем, когда вы его обрабатываете (если вы смешиваете его с кнопками, не относящимися к подклассам), вам придется спросить объект, является ли он новым типом объекта или реализует новый метод доступа, чтобы получить к нему доступ , что является немного неполиморфным.

Что если вы просто оставите класс как есть, но разделите существующие биты тега так, чтобы младшие 16 бит были предназначены для одной цели, а верхние - для другой вашей цели? Ничто не меняет интерфейс, вы просто делаете некоторые маски для .tag, чтобы получить ваши значения.

1 голос
/ 01 мая 2011

Согласно тому, что я вижу, просматривая документацию Apple для UIView, где определено свойство тега (поскольку UIButton наследует от UIView), оказывается, что вы можете иметь только одно.

Ничто не мешает вам создать подкласс UIButton для добавления другого свойства тега, если это необходимо, как уже упоминалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...