Как мне продолжать добавлять UIButton и программно устанавливать для них разные действия?

Предполагая, что у меня есть контейнер, в котором хранится список элементов. Добавляя эти элементы, я должен добавить один UIView для каждого. Я хочу сделать кнопку удаления, которая позволит пользователю удалить элемент, который ему не нужен. Как я могу продолжать добавлять эти кнопки и разделять их разными действиями? Например, эта кнопка предназначена для удаления элемента А, а эта кнопка предназначена для удаления элемента Б? P.S. Эта ситуация не позволяет использовать tableView, и я уже обработал часть стека представлений. Если вам нужно, чтобы я показал какой-либо код, пожалуйста, не стесняйтесь спрашивать.

Обновлено:

Код добавления Item:

-(void)appendAttachmentRow:(AttachmentItem *)attachment
{
AttachmentRowView * attachmentRowView = [[AttachmentRowView alloc]init];

screenWidth = CGRectGetWidth(self.view.bounds);
screenHeight = CGRectGetHeight(self.view.bounds);

// Set up the view in a single attachment row

// Attachment row container
CGRect attachmentRowFrame = CGRectMake(0, yLastLocation, screenWidth, 50);
UIView *attachmentRow = [[UIView alloc]initWithFrame:attachmentRowFrame];

// Attachment name label
CGRect attachmentNameLabelFrame = CGRectMake(70, 20, screenWidth / 3, 15);
UILabel *attachmentNameLabel = [[UILabel alloc]initWithFrame:attachmentNameLabelFrame];

// Attachment thumbnail image
CGRect attachmentImageThumbnailFrame = CGRectMake(10, 0, 50, 50);
UIImageView *attachmentImageThumbnail = [[UIImageView alloc]initWithFrame:attachmentImageThumbnailFrame];

CGRect attachmentRemoveFrame = CGRectMake(screenWidth - 40, 10, 30, 30);
attachment.attachmentRemove = [[UIButton alloc]initWithFrame:attachmentRemoveFrame];
[attachment.attachmentRemove setImage:[UIImage imageNamed:@"removeAttachmentButton"] forState:UIControlStateNormal];

[attachment.attachmentRemove addTarget:self action:@selector(removeAttachment:) forControlEvents:UIControlStateNormal];


attachmentImageThumbnail.image = attachment.attachmentImage;
attachmentNameLabel.text = attachment.attachmentName;

attachmentRow.layer.borderColor = [UIColor lightGrayColor].CGColor;
attachmentRow.layer.borderWidth = 1.0f;

[attachmentRow addSubview: attachmentImageThumbnail];
[attachmentRow addSubview: attachmentNameLabel];
[attachmentRow addSubview: attachment.attachmentRemove];
[[self attachmentCellCellIt] addSubview: attachmentRow];
[attachmentArray addObject:attachment];

yLastLocation += 50;
[[self attachmentCellCellIt]setFrame:CGRectMake(0, 337, screenWidth, yLastLocation)];

person Johnny Cheuk    schedule 21.03.2016    source источник
comment
Вы добавляете кнопку удаления для каждого элемента и хотите, чтобы действие для всех кнопок было одинаковым, или одна кнопка удаления для всех элементов   -  person Chetan    schedule 21.03.2016
comment
На самом деле я пытался смоделировать что-то вроде метода didSelectRowAtIndexPath.   -  person Johnny Cheuk    schedule 21.03.2016
comment
@Chetan один элемент одна кнопка удаления для удаления этого элемента   -  person Johnny Cheuk    schedule 21.03.2016
comment
Можете показать код добавления кнопки   -  person Chetan    schedule 21.03.2016
comment
я обновил пост   -  person Johnny Cheuk    schedule 21.03.2016


Ответы (4)


Вам нужно указать тег для кнопки после создания UIView для вложения.

Оставьте имя метода таким же и попробуйте работать со значением тега.

Например:

кнопка.тег = 1000; // при его создании.

В методе вы передали UIButton в качестве параметра

Внутри тела метода

Тег NSInteger = button.tag

[массив removeObjectAtIndex:tag];

person Abhishek    schedule 21.03.2016
comment
Ваш код кажется простым в реализации, я думаю, что попробую. - person Johnny Cheuk; 21.03.2016
comment
Удивительно, если у вас есть какие-либо сомнения, дайте мне знать. - person Abhishek; 21.03.2016

Надеюсь, я понимаю вашу ситуацию,

Вы хотите установить selector динамически. Скажем, у вас есть следующие объявления selector.

-(void)onPressA:(id)sender{ ... }
-(void)onPressB:(id)sender{ ... }
-(void)onPressC:(id)sender{ ... }
-(void)onPressD:(id)sender{ ... }

Теперь нужно взять NSArray или другое хранилище для их хранения. Пусть сохранит их в массиве. Для этого вам нужно преобразовать их в NSString следующим образом.

NSArray *selectorArr = @[NSStringFromSelector(@selector(onPressA:)),
                         NSStringFromSelector(@selector(onPressB:)),
                         NSStringFromSelector(@selector(onPressC:)),
                         NSStringFromSelector(@selector(onPressD:))];

Теперь вы можете переходить от NSString к SEL и от SEL к NSString следующим образом.

SEL selector = NSSelectorFromString(selectorArray[/*suitable index*/]);

Теперь вы можете легко добавлять и удалять цели, используя

[btn addTarget:/*target*/ action:/*selector*/ forControlEvents:/*UIControlEvents*/];
[btn removeTarget:/*target*/ action:/*selector*/ forControlEvents:/*UIControlEvents*/];

addTarget:action:forControlEvents: appledoc

removeTarget:action:forControlEvents: appledoc

Вам нужно отслеживать, какой SEL был назначен ранее, чтобы вы могли его удалить.

Удачного кодирования :)

person Ratul Sharker    schedule 21.03.2016
comment
Я вроде как понимаю, как работает ваш способ, но я не очень понимаю, как работает массив? внутри, как мне добавить селектор, который представляет собой строку с номером? - person Johnny Cheuk; 21.03.2016
comment
возьмите NSMutableArray вместо NSArray. Затем добавьте NSString как [mutArr addObject: NSStringFromSelector(@selector(onPressB1:))] - person Ratul Sharker; 21.03.2016
comment
Я имею в виду: NSStringFromSelector(@selector(onPressB1:))]; Это очень похоже на жесткий код в селекторе. Могу ли я написать что-то вроде: int i = 0; NSStringFromSelector(@selector([NSString stringWithFormat:@button%d,i])); нравится? - person Johnny Cheuk; 21.03.2016
comment
теперь я понимаю, вы хотите выбрать селектор динамически, но вам нужно использовать определенный шаблон, чтобы перечислить все используемые selector. эта ссылка показывает, как перечислить все доступные selector из NSObject - person Ratul Sharker; 21.03.2016
comment
Это было довольно сложно понять :( Но я попробую :) - person Johnny Cheuk; 21.03.2016

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

person Sahil    schedule 21.03.2016

Вы можете получить объект кнопки, из которого вызывается функция, в следующем объявлении метода в объекте «отправитель».

-(IBAction)buttonClicked:(id)sender

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

person TechSeeker    schedule 21.03.2016
comment
так как я могу установить тег кнопки? - person Johnny Cheuk; 21.03.2016
comment
Да, ты можешь. И в раскадровке, и в коде. Например, если вы используете uibutton в uitableview, вы можете получить indexpath ячейки, в которой была нажата кнопка. - person TechSeeker; 21.03.2016
comment
Вы можете установить это в коде, выполнив: button.tag = 0; или через раскадровку - person Black Magic; 21.03.2016