代码之家  ›  专栏  ›  技术社区  ›  Camus

将IBOutlets连接到UITableViewCell原型

  •  4
  • Camus  · 技术社区  · 11 年前

    我正在创建一个具有自定义UITableViewCell原型的UITable。 我的单元格包含UIImageViews、UILabels和UIButtons。

    当我控制并从按钮拖动到类的界面时,它就可以正常工作了。然而,它不适用于网点。

    当我在.h文件中创建IBOutlet时,只有当我选择UITable而不是单元格时,我才能连接,当然结果是一个坏的应用程序。

    你们知道怎么解决这个问题吗?我不想只为单元格使用自定义类。我真的很想坚持故事板和原型。

    提前谢谢

    2 回复  |  直到 11 年前
        1
  •  10
  •   Raon    4 年前

    使用带标签的标签可以完成任务,但从来都不是一个好的练习。。。最好的方法是创建UITableViewCell的自定义类。

    即,选择

    新建文件>可可触摸>目标C类

    和 将其创建为UITableViewCell的子类 现在您将获得.h和.m文件。。

    下一步是创建此单元格的视图

    选择

    新建文件>用户界面>空的

    现在用与customcell类相同的名称创建它(比如“customcell”)

    现在你将有三个文件 CustomCell.h、CustomCell.m、CustomCell.xib

    现在选择xib文件,在xib上添加UITableViewCell对象,并将其自定义类设置为“CustomCell”

    看下面的图片 enter image description here

    现在,在这之后,您可以将任何东西(UIImageView、UITextfield、UIButton)拖到下面的视图中,并将outlet赋予CustomClass,并使用委托方法管理操作。。

    如果您有imageView outlet as title图像。。然后您可以通过在CellForRowAtIndex(TableView delgate方法)中创建单元格对象来设置图像,从而访问相同的对象。

    cell.titleImage=[UIImage ImageNamed:@"goo.png"]; 
    

    现在我还要说的一件事是,您必须在CustomCell.m中实现一个init方法来加载nib>>

    它看起来像下面的代码。

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

    现在,如果您正在使用单元格上的按钮,最好有代理

    以便在按钮操作方法中,您可以调用委托方法(传递单元格对象),并使用TableView在ViewController中实现委托

    这是一个例子

    enter image description here

    现在,您可以使用UITableView的单元格来填充。。。不要在CustomCell.xib中设置reuseIdentifier值(与您设置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");
        }
    

    这看起来是一个很长的方法,但它非常有用和可读。。。

    -------注----------------:

    此外,返回CustomCell高度 通过实施

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {}
    

    它可能会发生。。。。

        2
  •  4
  •   Satheesh    11 年前

    您必须为单元格创建一个自定义的UITableViewCell类,然后只有cntrl+拖动才能创建出口,否则还有一种更简单的方法。在您的UIImageViews、UILabels等中设置99343、99345等标签(以避免重叠),并像这样访问它们

      UILabel *myLabelFromPrototypeCell = (UILabel*)[cell.contentView viewWithTag:99343];