2013-07-12 36 views
9

我需要混合静态和动态部分的一个分组UITableView一个类似于Twitter的账户设置应用程序:在分组表视图

Twitter accounts

也就是说,一种形式或菜单,其中一些的这些部分有一组事先已知的静态单元格,其他部分必须是动态的,并允许以“添加帐户”的方式插入其他行。我在.xib文件中管理UITableView。对于静态的细胞,我已分离.xib文件,我可以在视图控制器的cellForRowAtIndexPath:方法内加载。

我应该如何处理这种类型的表?我没有找到任何示例代码。

如何cellForRowAtIndexPath:方法应该是什么样子?我需要为静态单元格保留strong属性吗?在表格视图所在的同一个.xib文件中直接设计每个静态单元并为它们设置出口是否更好? (虽然这不允许重复使用我的自定义设计的细胞......)

我需要为实现这一目标,正确地管理细胞和记忆的一些准则。在此先感谢

+0

我不认为你可以混合静态单元格和动态单元格 - 它是表格视图本身的属性,所以我认为它需要是一个或另一个。动态单元无法做到,您可以使用静态单元完成动态单元,因此请将其全部变为动态。 – rdelmar

+0

@rdelmar好吧,也许我用错误的方式命名事情......我想用“静态”和“动态”来表示的意思就是我有一组部分,其细胞我已经知道并且不会改变(作为Twitter徽标单元格和屏幕截图中的“更新联系人”单元格)以及另一组将在用户提供新信息(如“添加帐户”)时具有可变单元集的部分集合 – AppsDev

+0

@rdelmar由于存在我需要的例子(例如,我提供的屏幕截图以及电话应用程序中的“新联系人”功能),可以做...问题是,怎么做?我不使用故事板... – AppsDev

回答

27

如果您只是在cellForRowAtIndexPath中未添加任何内容而返回单元格,则动态原型单元格可以像静态单元格那样工作,因此您可以同时拥有“静态”单元格和动态单元格(其中行数和内容可变)通过使用动态原型。

在下面的例子中,我从IB(具有分组表格视图)开始,并将动态原型单元格的数量更改为3.我将第一个单元格的大小调整为80,然后添加一个UIImageView和两个标签。中间单元格是基本样式单元格,最后一个是具有单个居中标签的另一个自定义单元格。我给他们每个人自己的标识符。这就是它看起来像在IB:

enter image description here

然后在代码中,我这样做:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.theData = @[@"One",@"Two",@"Three",@"Four",@"Five"]; 
    [self.tableView reloadData]; 
} 

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 3; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    if (section == 1) 
     return self.theData.count; 
    return 1; 
} 

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.section == 0) 
     return 80; 
    return 44; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell; 

    if (indexPath.section == 0) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"TitleCell" forIndexPath:indexPath]; 

    }else if (indexPath.section == 1) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"DataCell" forIndexPath:indexPath]; 
     cell.textLabel.text = self.theData[indexPath.row]; 

    }else if (indexPath.section == 2) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"ButtonCell" forIndexPath:indexPath]; 
    } 

    return cell; 
} 

正如你可以看到,对于“静态像”细胞,我只返回具有正确标识符的单元格,并且我得到了我在IB中设置的内容。运行时的结果将看起来像您的发布图像与三个部分。

+0

感谢您的解释和代码片段。如果不是将单元格作为IB中的出口,而是从他们自己的'xib'文件中加载它们(为了能够在其他表格中重用单元格自定义样式),cellForRowAtIndexPath:方法应该如何?我需要将单元格链接到强属性? – AppsDev

+1

@AppsDev,它看起来没什么不同。你只需要在viewDidLoad中注册nib。因此,对于每种类型的单元格,您需要编写如下内容:[self.tableView registerNib:[UINib nibWithNibName:@“YourNibNameHere”bundle:nil] forCellReuseIdentifier:@“TitleCell”];你不需要任何属性。 – rdelmar

+0

谢谢!然后,如果我想访问我的自定义单元格(我有文本字段和开关)内的控件,根据需要查找表格中的单元格,而不是保留每个单元格的引用会更好吗? – AppsDev

2

静态只是对动态布局的顶部的规定。基本上静态是一个所见即所得的。

如果你是不防水与值进行试验,我建议去动态。有数百个示例可用,例如thisthis

当你走的更远,你会看到自己发散走向两个选项自定义动态表视图时:

  • 子类UITableViewCell(更多的努力,但是从长远来看好)。再次按照this
  • 播放与UITableViewCell属性内cellForRowAtIndexPath:(较少的努力和速效性,但可以是或者可以不是性能友好由于可能的再拉深)

可能性是无穷的,如here其中细胞背景视图被定制。