2016-06-07 75 views
0

我有一个TableviewController:TableViewController.m,这有动态单元格。
我已经将一个单元格(只有一个)子类化为:RegisterTableViewCell.m/.h,在故事板中的此单元格中有一个UIButton,并在TableViewcell.m中为此创建了一个出口。
我已经在TableViewcell中定制了一个自定义协议来获取TableViewController.m中按钮上的点击事件。我想点击这个按钮做一个继续。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); 
} 

问题:

我的didClickOnCellAtIndex func未在TableViewController.m中调用。 即使在RegisterTableViewCell.m中的didTapButton函数,'if'条件未被执行, - “响应selector = 0”。

此外,我刚刚subclassed其中一个单元格,其实例我在cellForRowAtIndexPath,但cellForRowAtIndexPath只在显示表视图时调用。

将不会引用RegisterTableViewCell * cellreg及其属性cellreg.delegate被该单元格上的时间按钮清除吗?

我的整个目标是在一些选定的单元格(现在说只是1)到右端,当用户单击单元格或此按钮(最好是单元格)时,我想做一个popover演示文稿继续带弹出箭头指向按钮的vc。
对于这个问题,我的obj是在TableViewController的RegisterTableViewCell中的按钮上获得点击事件,以便我可以从这里调用prepareforsegue与发件人。

我被困在这。请帮忙。

回答

0

的问题是:

  1. 你把UITableViewCell *cell在表格并返回。所以tableview会显示这个UITableViewCell单元格。

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 
    return cell; 
    
  2. 你的alloc初始化RegisterTableViewCell,分配代表..但是不使用它,(do't回报cellreg),所以它从来没有在UI中显示,你不能用这个细胞间的相互作用,触发按钮,代表。

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

由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; 
+0

完美:)非常感谢,你救了我的一天。我的回答本身就是我的问题。已经投票并接受为答案。 – CodeTry

+0

很高兴为您效劳。 – Nick

+0

使用标识符从故事板设置时,单元格永远不会为零。所以你实际上可以删除这3条线。 –

0

你没有在cellForRowAtIndexPath中返回cellreg(RegisterTableViewCell),这就是为什么它是这个问题。

+0

谢谢。我知道了 。 :) – CodeTry

0

你在正确的轨道上,但有几件事我建议改变,让你的工作方式如何。

让我们从RegisterTableViewCell开始。您可能会发现,通过右键单击按钮并拖动到文件中而非awakeFromNib,可以更容易地从笔尖创建PopoverAnchorButton操作连接。此外,你可能会需要某种设置功能,它接受像委托和单元格索引这样的参数。这将允许您通过更新表格出列值时重用单元格。

接下来,TableViewController。要使表视图回收单元格,请创建一个重用标识符字符串(对相同类型的所有单元使用相同的标识符),并在您的表视图上调用registerNib:forCellReuseIdentifier,使用您的RegisterTableViewCell制作的UINib对象,从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