在表格视图中结合静态和原型内容

有没有办法使用故事板结合静态tableview单元格(静态内容)与dynamictableview单元格(原型内容)?

我build议你把你的桌子当作dynamic的,但是包括你总是想要在上面的单元格。 在故事板中,放置一个UITableViewController并使用dynamic表。 根据需要添加尽可能多的UITableViewCell原型到表格中。 比方说,你们的静态细胞各一个,一个代表可变细胞。

在你的UITableViewDataSource类中:

 #define NUMBER_OF_STATIC_CELLS 3 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [self.dynamicModel count] + NUMBER_OF_STATIC_CELLS; } 

接着

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row < NUMBER_OF_STATIC_CELLS) { // dequeue and configure my static cell for indexPath.row NSString *cellIdentifier = ... // id for one of my static cells } else { // normal dynamic logic here NSString *cellIdentifier = @"DynamicCellID" // dequeue and configure for [self.myDynamicModel objectAtIndex:indexPath.row] } } 

我有一个问题,虽然这是一个轻微的变化。 我其实想要混合dynamic和静态的细胞,但在不同的组。 含义组1将只有静态单元,而组2将具有dynamic单元。

我通过实际硬编码静态单元值(基于它们的原型单元标识符)来实现这一点。 dynamic部分将具有正常的dynamic填充内容。 下面是一些示例代码,以防其他人有相同的问题:

 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { if (section == 1){ return @"Dynamic Cells"; } if (section == 0){ return @"Static Cells"; } } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (section == 0) { return 1; //However many static cells you want } else { return [_yourArray count]; } } -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { if (indexPath.section == 0) { NSString *cellIdentifier = @"staticCellType"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } cell.textLabel.text = @"some static content"; return cell; } else if (indexPath.section == 1){ NSString *cellIdentifier = @"dynamicCellType"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } cell.textLabel.text = [_yourArray objectAtIndex:indexPath.row]; return cell; } return nil; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 2; } 

你总是可以让你的桌面看起来类似于静态表,但在代码中定义它。 通过委托方法设置每节的部分,数量或行数,标题等。

不幸的是,这是不可能的,因为静态表视图必须在UITableViewController中,并且只允许一个tableview。

你需要做的是制作三个更dynamic的UITableviewCell,并在你想要静态内容的前三行分别加载它们。

如果你不知道如何做到这一点,让我知道,我可以find一些代码。

由于没有人真正为这个问题提供了一个真正的答案(在同一个表格视图中同时使用静态的和原型的单元格),所以我觉得我可以做到。

根据您的需要创build静态单元格。 对于需要dynamic单元格的部分,如果不使用标准的UITableViewCelltypes,则需要在单独的Nib中创build自定义的单元格,否则可以使用标准的单元格。 然后执行以下代表。 基本上对于这些代表中的每一个,对于我们想要称为超级的静态内容,对于dynamic的内容,我们返回我们的值。

首先,如果您需要select性地显示dynamic部分,则需要实现numberOfSectionsInTableView(否则,您可以将此委托放出):

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { int staticSections = 1; int dynamicSections = 1; if(SOME_BOOLEAN) { return staticSections + dynamicSections; }else { return staticSections; } } 

那么,你需要实现numberOfRowsInSection:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if(section == 2) { return A_COUNT; }else { return [super tableView:tableView numberOfRowsInSection:section]; } } 

然后,你需要实现heightForRowAtIndexPath:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if(indexPath.section == 2) { return 44.0f; }else { return [super tableView:tableView heightForRowAtIndexPath:indexPath]; } } 

然后indentationLevelForRowAtIndexPath:

 - (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath { if(indexPath.section == 2) { return 1; }else { return [super tableView:tableView indentationLevelForRowAtIndexPath:indexPath]; } } 

最后,cellForRowAtIndexPath:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if(indexPath.section == 2) { SomeObject *obj = self.someArray[indexPath.row]; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DynamicCell" forIndexPath:indexPath]; cell.textLabel.text = obj.textValue; return cell; }else { return [super tableView:tableView cellForRowAtIndexPath:indexPath]; } } 

你不能有一个tableview是静态的,而另一个dynamic的在同一个视图控制器中,所以你将需要使它们都是dynamic的。 在第一个tableview中,您将在初始化视图控制器时将代码中的单元格configuration为不更新它们。

  1. 添加一个UIViewController到你的故事板。
  2. 将两个表视图(不是TableViewControllers)添加到UIView控制器。
  3. select每个tableView并configurationdynamic单元格。
  4. 构build并附加您的视图控制器。 在单个视图上的2个tableview解释了这一步。

作为另一种select,您可以通过在类似于步骤4中的链接的视图的一部分中embeddeddynamictableview来实现类似的外观,然后在视图的其余部分执行任何您想要的操作,以设置您计划对静态单元执行的操作通过使用滚动视图,标签和button。

你也可以为你的单元格创buildbutton(每个静态单元格一个),并将它们放在UITableView的tableHeaderView或tableFooterView中; 这些button毕竟只是观点。

你需要添加一些逻辑来在button和单元格上进行select,以保持通常的外观和感觉。

当然,这里假设你想要在表格顶部或底部的表格视图中插入静态单元格。

在静态表视图中使用dynamic内容的一种方法是克隆需要附加行的单元。

对于我的表视图的dynamic部分,我在Interface Builder中放置了一个或多个单元格。 在运行时,我可以使用NSCoder进行归档,然后取消归档。

它可以工作,但不一定比从dynamic原型表视图开始并从那里创build静态行更漂亮。

它与标准的表格视图单元格失败。 懒洋洋地创build的文本标签没有正确布局。 因此,我使用UITableViewCell子类来处理存档和取消存档子视图。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == kContactsSection) { NSArray *contacts = self.contacts; Contact *contact = [contacts objectAtIndex:indexPath.row]; NSString *name = contact.name; NSString *role = contact.role; if ([role length] == 0) { NNContactDefaultTableViewCell *cell = (id)[tableView dequeueReusableCellWithIdentifier : @"contactDefault"]; if (cell == nil) { NNContactDefaultTableViewCell *template = (id)[super tableView : tableView cellForRowAtIndexPath :[NSIndexPath indexPathForRow:0 inSection:kContactsSection]]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:template]; cell = [NSKeyedUnarchiver unarchiveObjectWithData:data]; } cell.contactTextLabel.text = name; return cell; } else { NNContactDetailTableViewCell *cell = (id)[tableView dequeueReusableCellWithIdentifier : @"contactDetail"]; if (cell == nil) { NNContactDetailTableViewCell *template = (id)[super tableView : tableView cellForRowAtIndexPath :[NSIndexPath indexPathForRow:1 inSection:kContactsSection]]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:template]; cell = [NSKeyedUnarchiver unarchiveObjectWithData:data]; } cell.contactTextLabel.text = name; cell.contactDetailTextLabel.text = role; return cell; } } return [super tableView:tableView cellForRowAtIndexPath:indexPath]; } 

在上面的例子中,我有两种单元格types。 两者都是在Interface Builder中作为静态表视图的一部分。

要在一个部分获得dynamic内容,我还需要重写以下方法:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (section == kContactsSection) { NSArray *contacts = self.contacts; NSUInteger contactCount = [contacts count]; return contactCount; } return [super tableView:tableView numberOfRowsInSection:section]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger section = indexPath.section; NSInteger row = indexPath.row; if (section == kContactsSection) { return [super tableView:tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:kContactsSection]]; } return [super tableView:tableView heightForRowAtIndexPath:indexPath]; } - (CGFloat)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger section = indexPath.section; if (section == kContactsSection) { CGFloat indentation = [super tableView:tableView indentationLevelForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:kContactsSection]]; return indentation; } CGFloat indentation = [super tableView:tableView indentationLevelForRowAtIndexPath:indexPath]; return indentation; }