2016-06-07 2 views
0

У меня есть TableviewController: TableViewController.m, у него есть динамические ячейки.
Я подклассифицировал одну ячейку (только одну) в: RegisterTableViewCell.m/.h, имеет UIButton в этой ячейке в раскадровке и создал выход для этого же в TableViewcell.m.
Я декалировал специальный протокол в TableViewcell, чтобы получить кнопку click на кнопке в TableViewController.m. Я хочу сделать segue по щелчку этой кнопки.TableView не отвечает на пользовательский протокол TableViewcell

RegisterTableViewCell.h

@protocol CellDelegate <NSObject> 
-(void)didClickOnCellAtIndex:(NSInteger)cellIndex withData:(id)data; 
@end 
@property (weak,nonatomic) id<CellDelegate>delegate; 
@property (assign,nonatomic) NSInteger cellIndex; 
@property (weak, nonatomic) IBOutlet UIButton *PopoverAnchorButton; 

RegisterTableViewCell.m

@synthesize PopoverAnchorButton = _PopoverAnchorButton; 

- (void)awakeFromNib { 
    // Initialization code 
    [self.PopoverAnchorButton addTarget:self action:@selector(didTapButton:) forControlEvents:UIControlEventTouchUpInside]; 
    //[self.PopoverAnchorButton 
} 
- (void)didTapButton:(id)sender{ 
    NSLog(@"Anchor Button Pressed"); 
    NSLog(@"self.delegate %d ", [self.delegate isEqual:nil]); 
    NSLog(@"responds to selector %d ", [self.delegate respondsToSelector:@selector(didClickOnCellAtIndex:withData:)]); 
    if(self.delegate && [self.delegate respondsToSelector:@selector(didClickOnCellAtIndex:withData:)]){ 
     [self.delegate didClickOnCellAtIndex:_cellIndex withData:@"abc"]; 
    } 

} 

TableViewController.h

@interface SideBarTableViewController : UITableViewController <UIPopoverPresentationControllerDelegate ,CellDelegate> 

TableViewController.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *cellIdentifier = [menuItems objectAtIndex:indexPath.row]; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 
RegisterTableViewCell *cellreg = [[RegisterTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"register"]; 
cellreg.delegate = self; 
cellreg.cellIndex = indexPath.row; 
    return cell; 
} 

-(void)didClickOnCellAtIndex:(NSInteger)cellIndex withData:(id)data 
{ 
    NSLog(@"cell at index %ld clicked",(long)cellIndex); 
} 

Задача:

My didClickOnCellAtIndex func in not called in TableViewController.m. Даже didTapButton func в RegisterTableViewCell.m, условие «if» не выполняется, - «отвечает на селектор = 0».

Кроме того, я просто подклассифицировал одну из ячеек, экземпляр которых я получаю в cellForRowAtIndexPath, но cellForRowAtIndexPath вызывается только после отображения представления таблицы.

Не будет ref RegisterTableViewCell * cellreg и его свойство cellreg.delegate, очищенное кнопкой времени в этой ячейке, выбрано?

Вся моя цель - поместить uibutton в некоторые выделенные ячейки (пока скажем только 1) на правый конец, и когда пользователь нажимает на ячейку или эту кнопку (предпочтительно ячейку), я хочу сделать презентацию seop vc с стрелкой, указывающей на кнопку.
Для этого вопроса мой объект должен получить событие щелчка на кнопке в RegisterTableViewCell в TableViewController, чтобы я мог вызвать prepareforsegue с отправителем отсюда.

Я застрял в этом. Пожалуйста помоги.

ответ

0

Проблема заключается в том:

  1. Вы поместите UITableViewCell *cell в таблице и возвращает его. Таким образом, таблица будет показывать эту ячейку UITableViewCell.

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 
    return cell; 
    
  2. Вы Alloc INIT RegisterTableViewCell, назначить делегата .. но не использовать его, (do't возвращение cellreg), поэтому он никогда не отображаться в интерфейсе и вы можете не взаимодействие с этой ячейкой на кнопку запуска и делегировать.

    RegisterTableViewCell *cellreg = [[RegisterTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"register"]; 
    cellreg.delegate = self; 
    cellreg.cellIndex = indexPath.row; 
    

Fixed это путем инициализации и возврата RegisterTableViewCell

RegisterTableViewCell *cell = [tableView dequeueReuseWithIdentifier:@"regisID"]; 
if(cell == nill) { 
    [tableView registerNibForCellReuserWithIdentifier:@"regisID"];//with storyboard or nib 
    cell = [tableView dequeueReuseWithIdentifier:@"regisID"]; 
} 

cell.delegate = cell; 
//cell setData 
return cell; 
+0

Отлично :) Большое спасибо, я спас мой день. Мой ответ был в моем самом вопросе. утверждены и приняты в качестве ответа. – CodeTry

+0

Рад помочь вам. – Nick

+0

Ячейка никогда не может быть нулевой, если ее установить из раскадровки с идентификатором. Таким образом, вы можете удалить эти 3 строки. –

0

Вы не возвращаете cellreg (RegisterTableViewCell) в cellForRowAtIndexPath, поэтому проблема.

+0

Thanks. Я понял . :) – CodeTry

0

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

Начнем с RegisterTableViewCell. Возможно, вам будет легче создать соединение с действиями PopoverAnchorButton из ниба, щелкнув правой кнопкой мыши на вашей кнопке и перетащив его в файл, а не awakeFromNib. Кроме того, вам, вероятно, понадобится какая-то функция настройки, которая принимает такие параметры, как ваш делегат и индекс ячейки в качестве параметров. Это позволит вам повторно использовать ячейку, обновив значения, когда она будет удалена таблицей.

Дальше, TableViewController. Чтобы получить представление таблицы для повторного использования ячеек, создайте строку идентификатора повторного использования (вы будете использовать один и тот же идентификатор для всех ячеек одного типа) и вызовите registerNib:forCellReuseIdentifier на вашем представлении таблицы с объектом UINib, сделанным с вашим RegisterTableViewCell, откуда-то вроде viewDidLoad ,Затем в tableView:cellForRowAtIndexPath: вы будете использовать dequeueReusableCellWithIdentifier, чтобы получить ячейку многократного использования. Передайте его в свой собственный класс, вызовите функцию настройки, о которой я упомянул, чтобы ваши свойства делегата и индекса были правильными, а затем верните его (вам не нужно делать две ячейки, как вы сейчас).

Это должно привести к переработке ячеек таблицы, а также сохранению значений, соответствующих индексу, с неповрежденным делегатом.

+0

Точка отмечена, я бы постарался наверняка. Спасибо – CodeTry

0

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

Центр NSNotificationCenter может помочь решить вашу проблему.

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

- (IBAction)press:(UIButton *)sender { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"show" object:nil]; 
} 

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

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showSegue) name:@"show" object:nil]; 
} 
+0

Спасибо. Я попробую это. – CodeTry