将 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 原型的主要内容,如果未能解决你的问题,请参考以下文章

@IBOutlet和@IBAction指的是错误的项目,如何摆脱那些引用?

控制器没有标识符的segue

在Xcode / Swift中使用预设置视图

UITableView不显示任何单元格

将布局更改为约束后继承的 IBOutlets 消失

使用 NSViewController 加载 nib 后...如何访问 nib 中的 NSButton?