Используйте IBAction из UIButton внутри пользовательской ячейки в контроллере основного вида

Я создал собственную ячейку с собственными файлами .m, .h и .xib. В ячейке у меня есть UIB-кнопка, которую я добавил в xib в IB.

Я могу получить IBAction от UIButton в этой пользовательской ячейке .m, но на самом деле я хотел бы переслать нажатие этой кнопки на основной вид .m, в котором размещена таблица (и, следовательно, настраиваемая ячейка), и использовать действие там.

Я провел последние 4 часа, пытаясь сделать это различными способами. Должен ли я использовать NSNotificationCenter? (I & APOS; ве пытавшихся Уведомления много, но может & APOS; т заставить его работать, и не уверен, что я должен быть настойчив)

 Phillip Mills11 мая 2012 г., 19:47
Я думаю, что NSNotificationCenter - разумная стратегия. Вы не получаете уведомления, которые отправляет метод действия кнопки, или какая-либо другая проблема?
 James Morris11 мая 2012 г., 21:06
я тоже так думал - я не думаю, что у меня еще есть навык их реализации ... больше практики. Теперь я могу заставить их работать в одном и том же виде, но все еще получаю исключения, когда пытаюсь использовать другое представление ... мы получим
 Phillip Mills12 мая 2012 г., 00:39
Делегат тоже может работать. Разница в основном тонкая в отношении сцепления. Делегат несколько ослаблен тем, что объекту, нуждающемуся в помощи при обработке, сказано, где его получить, но немного об объекте делегата. Уведомления еще более свободны, а уведомляющий объект просто утверждает, что что-то произошло, и оставляет на усмотрение неизвестных слушателей ответить. Это может быть философский выбор, если вам не нужно поддерживать несколько слушателей.
 MystikSpiral11 мая 2012 г., 23:07
Это довольно полное объяснение по созданию и использованию протокола делегата.dosomethinghere.com/2009/07/18/…

Ответы на вопрос(5)

ельской ячейки. Затем вы можете назначить основной вид делегатом каждой ячейки и соответствующим образом обработать действие.

 James Morris11 мая 2012 г., 19:59
Я думаю, что мне лучше исследовать делегатов ... я понятия не имею, что там делать !!
Решение Вопроса

Объявите делегата вот так

@class MyCustomCell;
@protocol MyCustomCellDelegate
- (void) customCell:(MyCustomCell *)cell button1Pressed:(UIButton *)btn;
@end

затем объявите поле и свойство

@interface MyCustomCell:UItableViewCell {
    id<MyCustomCellDelegate> delegate;
}

@property (nonatomic, assign) id<MyCustomCellDelegate> delegate;

@end

в .m файле

@synthesize delegate;

и в методе кнопки

- (void) buttonPressed {
    if (delegate && [delegate respondToSelector:@selector(customCell: button1Pressed:)]) {
        [delegate customCell:self button1Pressed:button];
    }
}

Ваш контроллер представления должен принять этот протокол следующим образом

.h файл

#import "MyCustomCell.h"

@interface MyViewController:UIViewController <MyCustomCellDelegate>
.....
.....
@end

в .m файле в cellForRow: метод, который вам нужно добавить делегат свойства в ячейку

cell.delegate = self;

и, наконец, вы реализуете метод из протокола

- (void) customCell:(MyCustomCell *)cell button1Pressed:(UIButton *)btn {

}

Извините за мой английский и код. Написал с моего ПК без XCODE

 12 сент. 2017 г., 04:15
@ Moonkid есть быстрый ответ на это?
 19 июн. 2015 г., 15:43
Чтобы представить другой контроллер представления, вы можете использовать [self presentViewController: animated: завершение:]; или [self.navigationController pushViewController: animated:]
 12 сент. 2017 г., 14:14
@AlekPiasecki Здравствуйте, в Swift проще использовать замыкания вместо делегатов, но, конечно, вы также можете использовать делегаты. В быстрой книге есть глава о протоколахdeveloper.apple.com/library/content/documentation/Swift/…
 17 июн. 2015 г., 15:08
- (void) buttonPressed {if (делегировать & amp; & [делегировать responseToSelector: @selector (customCell: button1Pressed :)]) {[делегировать customCell: self button1Pressed: button]; }} откуда вы получаете кнопку & quot; кнопку & quot; в [делегировать customCell: self button1Pressed: button]; и когда я добавляю метод в контроллер, какой будет пример кода для представления другого viewcontroller? Спасибо

и я решил ее, подклассифицировав ячейку в собственный класс и поместив туда кнопки как выходы, и заполнил ячейку данными из модели, используя метод, который возвращает ячейку, которую мы возвращаем. Вы просматриваете

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

_______________DATA SOURCE___________________________
#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *comment;
@property (nonatomic) NSInteger numberOfFriends;


+(instancetype)personWithName:(NSString *)aName Surname:(NSString *)aSurname;

@end

#import "Person.h"

@implementation Person

+(instancetype)personWithName:(NSString *)aName Surname:(NSString *)aSurname{

    Person *person = [[Person alloc] init];
    [person setName:aName];
    [person setSurname:aSurname];
    [person setNumberOfFriends:0];

    return person;
}

@end

_____________________PERSON CELL________________________

#import <UIKit/UIKit.h>

@interface PersonCell : UITableViewCell

@property (strong, nonatomic) IBOutlet UILabel *friendsNum;
@property (strong, nonatomic) IBOutlet UIButton *friendsBtn;
@property (strong, nonatomic) IBOutlet UILabel *nameLabel;
@property (strong, nonatomic) IBOutlet UILabel *surnameLabel;


@end

Лично я создал частный NSArray для хранения имен моих объектов Person и приватный NSMutableDictionary для хранения моих объектов Person, и я установил ключи в качестве имен людей.

_____________________PERSON TABLE VIEW________________________    
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    PersonCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    NSString *name = [peopleNames objectAtIndex:indexPath.row];
    Person *person = [people objectForKey:name];

    if(cell == nil)
    {
        cell = [[PersonCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    cell.nameLabel.text = person.name;
    cell.surname.Label.text = person.surname

    [cell.friendsButton addTarget:self action:@selector(moreFriends:) forControlEvents:UIControlEventTouchUpInside];

    cell.friendsNum.text = [NSString stringWithFormat:@"%i", person.numberOfFriends];

    return cell;
}

- (IBAction)moreFriends:(id)sender {
    UIButton *btn = (UIButton *)sender;
    PersonCell *cell = [self parentCellForView:btn];
    Person *person = [people objectForKey:cell.nameLabel.text];
    person.numberOfFriends++;
    [self.tableView reloadData];
}

-(PersonCell *)parentCellForView:(id)theView
{
    id viewSuperView = [theView superview];
    while (viewSuperView != nil) {
        if ([viewSuperView isKindOfClass:[PersonCell class]]) {
            return (PersonCell *)viewSuperView;
        }
        else {
            viewSuperView = [viewSuperView superview];
        }
    }
    return nil;
}

вы захотите просто добавить селектор для кнопки в вашем контроллере представления, который имеет ваш просмотр таблицы.

в вашей функции cellForIndexPath

[yourCell.button addTarget:self action:@selector(customActionPressed:) forControlEvents:UIControlEventTouchDown];

затем обработайте нажатие кнопки в вашем & quot; customActionPressed: (id) отправитель & quot; метод

    //Get the superview from this button which will be our cell
UITableViewCell *owningCell = (UITableViewCell*)[sender superview];

//From the cell get its index path.
NSIndexPath *pathToCell = [myTableVi,ew indexPathForCell:owningCell];

    //Do something with our path

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

У меня есть учебник, который может объяснить большеhttp://www.roostersoftstudios.com/2011/05/01/iphone-custom-button-within-a-uitableviewcell/

 James Morris11 мая 2012 г., 21:04
отличный учебник, спасибо
 11 мая 2012 г., 20:00
Звучит хорошо. Если вы знаете индекс и можете каким-то образом использовать его для получения необходимых данных, то у вас может быть все необходимое для выполнения действий в контроллере представления. Удачи
 James Morris11 мая 2012 г., 19:59
Спасибо, я на самом деле был в порядке, зная путь кнопки, из-за метода, который я использую для использования ячейки, выбранной для выбора plist (немного странно, но работает хорошо). Я попробую ваше руководство и посмотрим, смогу ли я подойти к моей проблеме по-другому.
 11 мая 2012 г., 20:02
Также полезно рассмотреть другие предложения по использованию делегата. Это еще один урок, который я сделал недавно, чтобы сделать это: [ссылка]roostersoftstudios.com/2011/04/12/…

Ваш ответ на вопрос