1

好的,情况就是这样。我目前有一个名为的视图控制器MainViewController,它有一个带有许多不同单元格的 UITableView。当我单击一个单元格时,我希望该单元格展开(增加高度)并显示一些“附加信息”。问题是,这个附加信息非常复杂,可以包含 UILabels、其他 UITableViews、UIWebViews 和 UIImageViews。此外,这个“附加数据”需要相当多的计算才能确定要显示的确切内容(即 UILabel 所说的内容,UIImageView 的大小)。因此,由于这种“附加信息”的复杂性,我不知道如何设计我的程序。

“附加信息”需要大量代码,因此我不想只是将该代码MainViewController.扔进以编程方式。

Currently I have each set of additional information as its own separate UIViewController (thus allowing me to have separate classes for the data and allowing me to use interface builder) and I just segue to a new screen when a cell is selected. 但是,我不想切换到新屏幕;我希望这个 UIView 控制器显示的所有数据都显示在MainViewController. 最好的方法是什么?

总之,我目前有一个 UIViewController 连接到另一个 UIViewController;但是,我希望第二个 UIViewController 的内容显示在第一个中。如果可能的话,我想使用某种 Interface Builder 并将第二个 UIViewController 的逻辑分离到另一个类中。

详细信息:~ 我只为 iOS 5 开发,我正在使用 ARC。~ 我以前从未为 iOS 4 或更低版本开发过,也从未使用过 nib 文件,但如果需要,我愿意学习。简单的示例代码会很有帮助。~ 谢谢!

4

4 回答 4

2

这里有一些很好的建议,但请注意,这loadNibNamed:owner:是一个相当昂贵的重复调用 API,因为它每次都从文件系统读取 nib。相反,考虑做这样的事情。

将您的 nib 文件注册到viewDidLoad. 在 Interface Builder 中,确保为您的自定义单元格提供重用标识符。

- (void)viewDidLoad
{
    [super viewDidLoad];

    UINib *myNib = [UINib nibWithNibName:@"MyNib" bundle:nil];
    [self.tableView registerNib:myNib forCellReuseIdentifier:@"MyCell"];

    // Do any other stuff you need to do...
}

然后,只要您需要,只需将您的自定义单元格出列即可。UINib会将 nib 文件缓存在内存中,以避免每次从文件系统重新加载它。

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];

    // Configure cell as needed...

    return cell;
}
于 2012-06-28T00:48:18.510 回答
2

与 SmartWork 相同的观点。

您应该使用其 xib 文件创建自定义 UITableViewCell 类,并将 UITableViewCell 作为主 xib 视图

在您的 tableView 数据源中,您可以将其导入如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"MyViewCell";
    MyViewCell *cell = (MyViewCell *)[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MyViewCell" owner:nil options:nil];
        for (id currentObject in topLevelObjects) {
            if ([currentObject isKindOfClass:[UITableViewCell class]]) {
                cell = (MyViewCell *)currentObject;
                break;
            }
        }
    }
    [self configureCell:cell atIndexPath:indexPath]; // your own function to customize your cell.
    return cell;
}

然后,在单元格xib中,您可以设置单元格的最大高度,并在 UITableViewDelegate 类中决定有效高度。

于 2012-06-27T13:23:59.787 回答
1

只是为了补充 SmartWork 所说的,当您点击特定单元格时,您可以使用以下代码行更新该行的高度:

- (CGFloat)tableView:(UITableView *)aTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
     // set a dynamic value for the cell height depending on the state of the data in the cell 
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    // update the state of the data in the cells here..  
    // calling these below lines will change the height of the cells smoothly 


    [tableView beginUpdates]; 
    [tableView endUpdates]; 

}

您还需要自定义 UITableViewCells。将它们视为简单视图,并添加和删除您需要的任意数量的子视图

如果您热衷于将 Nibs 用于单元格内的子视图,您可以创建它们的 nib 并将它们连接到您的自定义 TableView 单元格,如下所示:(子视图可以是您的 tableViewCell 的属性)

NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"MyTableViewCellNib" owner:self options:nil];

mySubview = [(SubView *)[nib objectAtIndex:0]retain];
于 2012-06-27T13:37:50.527 回答
1

在我看来,没有必要在另一个内部使用一个 UiviewController。

您可以将 Uiview 与 nib 文件一起使用,因此您可以以图形方式设计这些“附加信息”视图。它很容易实现和维护。

于 2012-06-27T13:04:21.353 回答