我有一个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。
我被困在这里。请帮忙。
答案 0 :(得分:0)
你没有在cellForRowAtIndexPath中返回cellreg(RegisterTableViewCell),这就是问题的原因。
答案 1 :(得分:0)
你走在正确的轨道上,但有一些我建议改变的事情,让你的工作方式如你所愿。
让我们从RegisterTableViewCell
开始吧。您可能会发现通过右键单击按钮并拖动到文件而不是PopoverAnchorButton
,可以更轻松地从笔尖创建awakeFromNib
操作连接。此外,您可能需要某种设置功能,它接受诸如委托和单元格索引之类的参数。这样,您可以通过在表格出列时更新值来重复使用单元格。
接下来,TableViewController
。要使表视图重新循环使用单元格,请创建重用标识符字符串(您将对同一类型的所有单元格使用相同的标识符)并使用由{{{{{{{{{{{{{ 1}},来自registerNib:forCellReuseIdentifier
之类的地方。然后,在RegisterTableViewCell
中,您将使用viewDidLoad
来获取可重复使用的单元格。将它转换为您的自定义类,调用我提到的设置函数,以便您的委托和索引属性正确,然后返回它(您不需要像目前那样制作两个单元格)。
这应该使您的表回收单元格并保持适合索引的值,并且委托完整。
答案 2 :(得分:0)
问题是:
您将UITableViewCell *cell
放入表中并将其返回。因此,tableview将显示此UITableViewCell
单元格。
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
return cell;
你分配init RegisterTableViewCell,分配Delegate ..但是不要使用它,(不要返回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;
答案 3 :(得分:0)
据我所知,您想在按下按钮时显示另一个视图。一个仅出现在某些单元格上的按钮?
NSNotificationCenter可能有助于解决您的问题。
您可以创建一个自定义单元格,右侧添加了一个按钮。根据您选择的任何条件,您可以隐藏按钮或将其显示在表格的特定行中。 您可以为单元格自定义类中的按钮创建IBAction,并触发通知,告诉您该按钮已被按下。
{{1}}
在主视图控制器中,只需向调用选择器的通知添加一个观察者,以显示所选的视图控制器。
{{1}}