TableView没有响应TableViewcell自定义协议

时间:2016-06-07 16:38:08

标签: ios objective-c uitableview uipopovercontroller

我有一个TableviewController:TableViewController.m,它有动态单元格 我将一个单元格(只有一个)子类化为:RegisterTableViewCell.m / .h,在故事板中的此单元格中有一个UIButton,并在TableViewcell.m中创建了相同的插座。
我在TableViewcell中使用了自定义协议来获取TableViewController.m中按钮的click事件。我想点击这个按钮做一个segue。

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);
}

问题:

我的didClickOnCellAtIndex函数未在TableViewController.m中调用。 甚至在RegisterTableViewCell.m中的didTapButton函数,&#39; if&#39;条件未执行, - &#34;响应选择器= 0&#34;。

此外,我刚刚将一个单元格子类化,其实例我将在cellForRowAtIndexPath中获取,但只有在显示表格视图后才会调用cellForRowAtIndexPath。

是否已选择ref RegisterTableViewCell * cellreg及其属性cellreg.delegate被此单元格上的时间按钮清除?

我的目标是在一些选定的单元格(现在只说1)中放置一个uibutton到右端,当用户单击单元格或此按钮(最好是单元格)时,我想做一个popover演示文稿segue to a vc,弹出箭头指向按钮 对于这个问题,我的obj是在TableViewController中的RegisterTableViewCell按钮上获取click事件,这样我就可以从这里调用prepareforsegue和sender。

我被困在这里。请帮忙。

4 个答案:

答案 0 :(得分:0)

你没有在cellForRowAtIndexPath中返回cellreg(RegisterTableViewCell),这就是问题的原因。

答案 1 :(得分:0)

你走在正确的轨道上,但有一些我建议改变的事情,让你的工作方式如你所愿。

让我们从RegisterTableViewCell开始吧。您可能会发现通过右键单击按钮并拖动到文件而不是PopoverAnchorButton,可以更轻松地从笔尖创建awakeFromNib操作连接。此外,您可能需要某种设置功能,它接受诸如委托和单元格索引之类的参数。这样,您可以通过在表格出列时更新值来重复使用单元格。

接下来,TableViewController。要使表视图重新循环使用单元格,请创建重用标识符字符串(您将对同一类型的所有单元格使用相同的标识符)并使用由{{{{{{{{{{{{{ 1}},来自registerNib:forCellReuseIdentifier之类的地方。然后,在RegisterTableViewCell中,您将使用viewDidLoad来获取可重复使用的单元格。将它转换为您的自定义类,调用我提到的设置函数,以便您的委托和索引属性正确,然后返回它(您不需要像目前那样制作两个单元格)。

这应该使您的表回收单元格并保持适合索引的值,并且委托完整。

答案 2 :(得分:0)

问题是:

  1. 您将UITableViewCell *cell放入表中并将其返回。因此,tableview将显示此UITableViewCell单元格。

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
    return cell;
    
  2. 你分配init RegisterTableViewCell,分配Delegate ..但是不要使用它,(不要返回cellreg)所以它永远不会出现在UI中,你不能与这个单元格交互来触发按钮和代表。

    RegisterTableViewCell *cellreg = [[RegisterTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"register"];
    cellreg.delegate = self;
    cellreg.cellIndex = indexPath.row;
    
  3. 通过init修复此问题并返回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;
    

答案 3 :(得分:0)

据我所知,您想在按下按钮时显示另一个视图。一个仅出现在某些单元格上的按钮?

NSNotificationCenter可能有助于解决您的问题。

您可以创建一个自定义单元格,右侧添加了一个按钮。根据您选择的任何条件,您可以隐藏按钮或将其显示在表格的特定行中。 您可以为单元格自定义类中的按钮创建IBAction,并触发通知,告诉您该按钮已被按下。

{{1}}

在主视图控制器中,只需向调用选择器的通知添加一个观察者,以显示所选的视图控制器。

{{1}}