Метод вызова из другого класса в UIButton

У меня есть пользовательский UITableViewCell со связанным с ним классом под названием customCell.m. (Хибом не пользовался.) В ячейке есть кнопка. Есть ли способ создать действие кнопок в файле mainVC.m, а не в файле customCell.m?

Обновить

Вот код, который я пытался реализовать. Что я сделал, так это вызвал метод из mainVC.m.

CustomCell.m

- (IBAction)myButton:(id)sender
{
    CategorieViewController *mainVC = [[CategorieViewController alloc] init];
    [mainVC myMethod];
}

MainVC.m

- (void)myMethod:(id)sender
{
    UITableViewCell *clickedCell = (UITableViewCell *)[[[sender superview] superview] superview];
    NSIndexPath *clickedButtonPath = [self.myTableView indexPathForCell:clickedCell];

    NSLog(@"%@", clickedButtonPath);
}

CategorieViewController myMethod]: нераспознанный селектор отправлен экземпляру 0x7fd2dbd52a00

Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «-[CategorieViewController myMethod]: нераспознанный селектор отправлен экземпляру 0x7fd2dbd52a00»


person Community    schedule 10.02.2015    source источник
comment
Можете ли вы показать код? вы можете создать протокол или добавить цель своей кнопки к себе, в которой вы используете свою пользовательскую ячейку   -  person ChintaN -Maddy- Ramani    schedule 10.02.2015
comment
Вам нужно позвонить [mainVC myMethod:nil];. Извините, я не увидел вашей ошибки.   -  person ChintaN -Maddy- Ramani    schedule 10.02.2015
comment
@ ChintaN-Maddy-Ramani На самом деле, как я уже писал в своем ответе, ОП должен изменить строку на [mainVC myMethod:sender];, поскольку параметр отправителя фактически используется в myMethod: и, следовательно, не может быть равен нулю.   -  person Lyndsey Scott    schedule 10.02.2015
comment
@LyndseyScott Questioner написал вопрос о том, как вызвать метод. так что я не видел ошибки. (: . и я и отправитель не могут быть нулевыми.   -  person ChintaN -Maddy- Ramani    schedule 10.02.2015


Ответы (1)


Вы вызываете myMethod, но на самом деле метод myMethod: и принимает отправителя в качестве параметра. Попробуйте изменить:

[mainVC myMethod];

to:

[mainVC myMethod:sender];

Кроме того, любой отправитель, который вы в настоящее время передаете myMethod: в качестве параметра, еще не будет принадлежать табличному представлению mainVC, потому что вы создаете новый экземпляр CategorieViewController для выполнения вызова метода, а его таблица никогда не загружалась.

Предполагая, что MainVC является видимым контроллером представления, вы можете изменить:

CategorieViewController *mainVC = [[CategorieViewController alloc] init];

to:

UINavigationController *nav = (UINavigationController*)self.window.rootViewController;
CategorieViewController *mainVC = (CategorieViewController*)nav.visibleViewController;

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

person Lyndsey Scott    schedule 10.02.2015
comment
Ты прав. Но теперь nslog дает мне ноль. Это не дает мне нажатые кнопки superView indexPath? - person ; 10.02.2015
comment
@MikeRally Кнопка находится в ячейке таблицы? Если это так, он все равно не будет содержаться в self.myTableView вашего MainVC, поэтому значение nil. - person Lyndsey Scott; 10.02.2015
comment
Да, кнопки есть в tableViewCell. Почему это не сработает? - person ; 10.02.2015
comment
@MikeRally Хм, понятно ... Значит, кнопка находится в пользовательской ячейке в MainVC? - person Lyndsey Scott; 10.02.2015
comment
Я. Я пытаюсь получить выбранные кнопки superview indexPath. - person ; 10.02.2015
comment
@MikeRally Хорошо, внутри пользовательского класса кнопка технически еще не принадлежит табличному представлению mainVC, потому что вы создаете совершенно новый CategorieViewController для выполнения вызова метода, а его таблица никогда не загружалась ... Мы можем попробовать получить ваш текущий экземпляр контроллера представления и посмотрите, имеет ли это значение... - person Lyndsey Scott; 10.02.2015
comment
О, я вижу. Итак, что я могу сделать, чтобы исправить это? - person ; 10.02.2015
comment
@MikeRally Вы используете UINavigationController? - person Lyndsey Scott; 10.02.2015
comment
@MikeRally Предполагая, что MainVC является видимым контроллером представления, вы можете попробовать изменить CategorieViewController *mainVC = [[CategorieViewController alloc] init]; на CategorieViewController *view = (CategorieViewController*)self.navigationController.visibleViewController;, чтобы получить текущий экземпляр. - person Lyndsey Scott; 10.02.2015
comment
Я не могу self.navigationController... потому что customCell.m не имеет навигационного контроллера. хотя на mainVC.m есть один - person ; 10.02.2015
comment
@MikeRally О да... Хм. Тогда попробуйте использовать две строки кода (первая — получить навигационный контроллер): UINavigationController *nav = (UINavigationController*)self.window.rootViewController; CategorieViewController *mainVC = ( CategoriViewController*)nav.visibleViewController; - person Lyndsey Scott; 10.02.2015
comment
@MikeRally Хорошо, отлично. Я обновлю свой ответ, чтобы включить этот последний бит. :) - person Lyndsey Scott; 10.02.2015