将 IBOutlets 连接到 UITableViewCell 原型
Posted
技术标签:
【中文标题】将 IBOutlets 连接到 UITableViewCell 原型【英文标题】:Connecting IBOutlets to UITableViewCell prototype 【发布时间】:2013-10-11 06:41:20 【问题描述】:我正在创建一个带有自定义 UITableViewCell 原型的 UITable。 我的单元格包含 UIImageViews、UILabels 和 UIButtons。
当我控制按钮并将其拖动到班级界面时,它工作得很好。但是,它不适用于插座。
当我在 .h 文件中创建 IBOutlet 时,如果我选择 UITable 而不是单元格,我只能连接,当然结果是应用程序损坏。
你们知道如何解决这个问题吗?我不想只为单元格使用自定义类。我真的很想坚持使用 Storyboard 和原型。
提前致谢
【问题讨论】:
请提供示例 使用自定义类有什么问题? 没有错。我想知道我是否可以像连接动作(拖放)时那样做同样的事情 【参考方案1】:使用带有标签的标签可以完成工作,但从来都不是一个好的做法……最好的方法是创建一个自定义的 UITableViewCell 类。
即选择
新建文件>Cocoa Touch >Objective C 类
和 将其创建为 UITableViewCell 的子类 现在您将获得 .h 和 .m 文件..
下一步是为此创建单元格的视图
选择
新建文件>用户界面>空
现在使用与您的 customcell 类相同的名称创建它(比如说“CustomCell”)
现在您将拥有三个文件 CustomCell.h,CustomCell.m,CustomCell.xib
现在选择 xib 文件并在 xib 上添加 UITableViewCell 对象并将其自定义类设置为“CustomCell”
看下图
在此之后,您可以将任何东西(UIImageView、UITextfield、UIButton)拖到下面的视图中,并在 CustomClass 上提供出口并使用委托方法管理操作..
如果您有 imageView 出口作为 titleImage ..那么您可以通过在 CellForRowAtIndex (TableView 德尔门方法)中创建单元格对象来设置图像。
cell.titleImage=[UIImage ImageNamed:@"goo.png"];
现在我要说的还有一件事是你必须在 CustomCell.m 中实现一个 init 方法来加载笔尖>>
它看起来像下面的代码。
-(id)initWithDelegate:(id)parent reuseIdentifier:(NSString *)reuseIdentifier
if (self = [self initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier])
self=(CustomCell*)[[[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:nil options:nil] lastObject];
self.backgroundColor = [UIColor clearColor];
self.backgroundView = NULL;
self.selectedBackgroundView =NULL;
//If you want any delegate methods and if cell have delegate protocol defined
self.delegate=parent;
//return cell
return self;
如果您在单元格上使用按钮,现在最好有代表
以便在按钮操作方法中调用委托方法(传递单元对象)并在 ViewController 中使用 TableView 实现委托
这里是例子
现在您可以使用您的单元格为 UITableView 填充...并且不要在 CustomCell.xib 中设置重用标识符值(与设置 CustomClass 相同)
让我们设置它,嗯还有什么“customCell”
所以在填充 tableView 时使用
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSString *cellIdentifier=@"customCell";
CustomCell *cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(cell==nil)
cell= [[CustomCell alloc] initWithDelegate:self reuseIdentifier:cellIdentifier];
//set cell properties
cell.titleImage=[UIImage ImageNamed:@"title.png"];
return cell;
别忘了添加委托方法
给
ViewController:UIViewController<CustomCellDelegate>
在 ViewController 的 ViewController.h 文件中
然后在你的 ViewController.m 中实现它的主体(实现文件)
作为
-(void)cellButtonPressed:(CustomCell*)cell
NSIndexPath *indexPathOfPressedCell = [self.tableView indexPathForCell:cell];
NSLog(@"Pressed");
这看起来像是一个很长的方法,但它非常有用且可读...
-------NB----------:
另外,返回 CustomCell 高度 通过实施
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
它可能会发生......
【讨论】:
感谢您的彻底回答。 cell.index = indexPath.row 你的意思是在 cellForRowAtIndex... 对吗?如果我使用故事板和原型单元,我可以跳过 init 方法还是需要覆盖它? @Camus no dude.. 如果您使用此方法,您不需要在 TableView 上使用原型单元(即拖放到 TableView)。只需将表格视图的单元格类型更改为动态原型即可。关于 cell.index .. 你是对的......如果你有任何对齐问题,只需通过实现 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 返回 CustomCell 高度它可能会发生。 ... 我明白了。我使用原型单元进行了测试,它工作得很好。我更喜欢这个,因为我不需要创建 XIB。谢谢 好的,在使用原型单元时,您的 nib 文件路径可能会改变!但是使用 xib 是一种很好的做法....你知道 ..coz 如果您想更改任何功能或添加任何功能...您可以在 xib 上轻松编辑而不是在情节提要上进行编辑..会使它更加拥挤...但是它是你的选择,是根据需要... 其实我只需要改变我写dequeueReusableCellWithIdentifier的那一行:@Raon【参考方案2】:您必须为单元格创建一个自定义 UITableViewCell 类,然后只有 cntrl + 拖动来创建插座才有意义,否则还有更简单的方法。将 99343 、 99345 之类的标签(以避免重叠)添加到您的 UIImageViews 、 UILabels 等,并像访问它们一样
UILabel *myLabelFromPrototypeCell = (UILabel*)[cell.contentView viewWithTag:99343];
【讨论】:
我就是这样做的。但是,我将它们存储在属性中,以便可以在其他方法中使用它们。我问了这个问题,因为我想在协议 tableView:cellForRowAtIndexPath 的单元格中设置我的所有视图会很混乱以上是关于将 IBOutlets 连接到 UITableViewCell 原型的主要内容,如果未能解决你的问题,请参考以下文章