Делегат от нажатия кнопки внутри пользовательского uitableviewcell - PullRequest
8 голосов
/ 06 февраля 2011

Я прочитал документы Apple, и я прокрутил эти форумы, и я (успешно) провел некоторые уроки и создал своих собственных делегатов, а я все еще не понимаю чего-то. Я уверен, что это то, от чего я делаю интервалы, но, поскольку я проявил должную осмотрительность и до сих пор не знаю, что я делаю неправильно, я надеялся, что один из вас сможет сказать мне.

Ситуация:

У меня есть пользовательский UITableViewCell, в котором есть кнопка. Когда кнопка нажата, я пытаюсь вызвать UIImagePickerController из делегата этой пользовательской ячейки. Я могу перехватить и ответить на нажатие кнопки без проблем, но поток никогда не идет к методу делегата. Другими словами, когда я перебираю код, все в порядке, пока я не попытаюсь перейти от метода назначения кнопки к методу делегата во втором классе. Просто его никогда не вызывают.

Вот код.

В файле интерфейса для пользовательской ячейки я установил идентификатор делегата, настроил IBOutlet для UIButton и установил метод протокола:

#import <UIKit/UIKit.h>

@protocol CustomPicCellDelegate;

@interface CustomPicCell : UITableViewCell <UITextInputTraits> {

    UIButton *picButton;
    ...
    id<CustomPicCellDelegate> cellDelegate;
}

@property (nonatomic, retain) IBOutlet UIButton *picButton;
...
@property (nonatomic, assign) id<CustomPicCellDelegate> cellDelegate;
...
- (IBAction)getAPic;

@end

@protocol CustomPicCellDelegate <NSObject> 
- (void)getPhoto;
@end

UIButton подключается к методу getAPic в IB.

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

#import "CustomPicCell.h"

@implementation CustomPicCell
@synthesize cellDelegate;

...

- (IBAction)getAPic {
    NSLog(@"You are here ...");

    if (cellDelegate && [cellDelegate respondsToSelector:@selector(getPhoto)]) {
        [cellDelegate getPhoto];
    }
}

В интерфейсе класса делегата я установил его в качестве делегата для пользовательской ячейки:

@interface DelegateClass : UIViewController < ... CustomPicCellDelegate> {
...

В реализации класса делегата я пытаюсь получить UIImagePickerController:

- (void)getPhoto {
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;

    picker.sourceType = UIImagePickerControllerSourceTypeCamera;

    [self presentModalViewController:picker animated:YES];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo (NSDictionary *)info {
    [picker dismissModalViewControllerAnimated:YES];
}

Я не могу понять, почему делегата никогда не вызывают! Пожалуйста, поймите, я уверен, что что-то пропустил, но я много раз просматривал документы и эти форумы, и я не могу найти, что я делаю неправильно. Я использую делегатов в других частях кода просто отлично. Это одно место не работает. Может кто-нибудь показать мне, что я толстяк? Спасибо

1 Ответ

18 голосов
/ 12 октября 2012

Почему ты так делаешь? Непосредственно в классе UIViewController вы можете назначить действие для кнопки следующим образом.

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     [cell. picButton addTarget:self 
                         action:@selector(getPhoto)
               forControlEvents:UIControlEventTouchUpInside];
    // ... 
}
...