如何在嵌入 UIViewController 的 UITableView 中直观地创建和使用静态单元格

Posted

技术标签:

【中文标题】如何在嵌入 UIViewController 的 UITableView 中直观地创建和使用静态单元格【英文标题】:How to visually create and use static cells in a UITableView embedded in a UIViewController 【发布时间】:2012-02-15 06:33:41 【问题描述】:

我正在使用 XCode 4.2,并使用 Storyboards 构建了我的 UI。我需要创建一个在 UITableView 上方和下方具有内容的视图,我可以通过使用 UIViewController 来实现这一点。 UITableViewController 不允许您在表格上方或下方添加内容。您可以使用表格页眉/页脚,但这不适用于我想要实现的目标。

我现在有一个嵌入了 UITableView 的 UIViewController。我可以相应地调整 UITableView 的高度和宽度,从而为我提供我正在寻找的 UI 布局。

我可以自定义 UITableView 中的静态单元格,但是当我尝试构建时出现以下错误:

非法配置:静态表视图仅在嵌入 UITableViewController 实例时有效

我的问题是其他人如何解决这个问题?创建一个带有静态单元格的表格视图并在视觉上布置它们非常好,但显然由于某种我无法理解的原因这是不允许的。由于我的视觉布局要求,我无法切换到 UITableViewController。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

假设您的应用面向 ios 6+,您可以在 Xcode 4.5 及更高版本中实现此目的。

在 Storyboard 中,只需在主视图中创建一个带有 View Container 的 UIViewController。然后将该 View Container 连接到包含静态单元格的 UITableViewController。

就像这样:

您不需要一行代码。只需控制单击、拖动并选择嵌入。视图控制器包含为您处理。

【讨论】:

如果您的视图控制器 从 UITableViewController 子类化并且您仍然收到此警告,并且您不需要/想要容器,请参阅这篇文章以了解如何解决方法:plus.google.com/105709083169353686738/posts/VidCrsYPhgv(需要手动编辑情节提要文件。) 为初学者添加一些额外的帮助: (1) 在 Interface Builder 的主视图控制器上放置一个容器视图。 (2) 添加一个 UITableViewController 到你的故事板。 (3) 从 Container View 按住 Control 单击并拖动到 UITableViewController。 (4) 选择嵌入。 这应该被标记为正确答案。快速、简单,甚至包括图片。 为所有有同样困难的人。如上所述,使用“视图容器”而不是“视图”(希望对您有所帮助);) 您使用的是容器视图吗?您应该能够按住 CTRL 键单击并将嵌入 segue 拖动到 Table View 控制器。我刚刚在 Xcode 5 上的一个项目中做到了。【参考方案2】:

你是对的。在情节提要中,您不能在 viewController 中嵌入带有静态单元格的 tableView。解决它的一种方法(不过,我自己没有尝试过,所以我不确定它是否有效)可以是您在带有静态单元格的情节提要中创建 UITableViewController 的实例。将 UIView 的实例添加到您的 viewController,然后以编程方式将 UITableViewController 的 tableView 加载到您的 viewController 的 UIView 中。

【讨论】:

使用 NIBS 是一种可能,因为我正在进一步阅读。也许这是可视化自定义单元格然后在视图控制器中调用它的正确方法? 我对静态单元格的理解是,它们只能在 UITableViewControllers 中创建。它们中的值(或标题)只有在视图中(当你看到它们时)才能修改,直接调用它们的索引路径。但是,如果您的桌子足够大,并且您滚动离开并返回,则 vales 会更改为之前的样子。我认为在你的情况下,笔尖是个好主意。 如果您支持 iOS 6,这不仅是可能的,而且也很容易。检查我的答案。【参考方案3】:

pmd 的答案有效,但如果还需要向后兼容 iOS 5,您可以使用 View Containment API 以编程方式进行嵌入。

在你的父 UIViewController 的 viewDidLoad 方法中:

- (void)viewDidLoad

    [super viewDidLoad];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
    MyTableViewController* vc =[storyboard instantiateViewControllerWithIdentifier:@"MyTableVC"];
    [self addChildViewController:vc];
    [self.view addSubview:vc.view];

    // ensure embedded view is aligned to top
    CGRect frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    vc.view.frame = frame;

    [vc didMoveToParentViewController:self]; 

不要忘记使用静态单元格为您的 UITableViewController 指定情节提要 ID。

【讨论】:

【参考方案4】:

我知道这是一个老问题,但我对此问题有一个草率的解决方案。

我需要 UIViewController 上的 3 个静态单元格,所以这就是我所做的:

    将一些表格视图单元格拖入您的界面(而不是 UITableView) - 添加文本和您需要的任何其他内容。 为您的单元创建 IBOutlet 属性并合成它们。 拖动一个按钮,使其覆盖整个单元格。将按钮设置为键入“自定义”,使其看起来不可见 - 对所有单元格重复此操作 为您的按钮添加数字标签

    实现以下功能。 buttonDown 连接到按钮的“Touch Down”事件。 buttonUp 连接到 'Touch Up Inside' AND 'Touch Up Outside'

    -(IBAction)buttonDown:(id)sender 
        if ([sender tag] ==  1) 
            myFirstCell.selected = YES;
        
        else if ([sender tag] ==  2) 
            mySecondCell.selected = YES;
        
        else if ([sender tag] ==  3) 
            myThirdCell.selected = YES;
        
    
    
    -(IBAction)buttonUp:(id)sender 
        myFirstCell.selected = NO;
        mySecondCell.selected = NO;
        myThirdCell.selected = NO;
    
    

你可以在 buttonDown 事件中做任何你喜欢的事情,并使用按钮直接进入一个新的视图。我觉得这很有用。

【讨论】:

我非常喜欢你的“草率”方法,我目前很难设置我的 UIViewController(我的需求与最重要的问题非常相似)。请问,您的方法是否允许 UITextViews、textFields 等对象。也就是说,拖放的 IB 对象在这些静态视图中是否具有完整的功能。因为我或多或少需要 UIViewController 中的静态 UITableCellView,但我需要 UIImageView、UITextView、UITextField 以及一些 UIbuttons 的完整功能。 @补丁【参考方案5】:

我不确定你所说的静态单元是什么意思,但如果你想在 IB 中构建单元,然后想在你的 tableView 中使用它,你可以在cellForRowAtIndex 中调用@ 987654322@ 将您为单元格创建的 .nib 文件的名称作为参数传递。确保您的 viewController 中有一个 outlet,它映射到单元格的 .nib。如果这是您想要实现的目标,请尝试朝这些方向探索

【讨论】:

表格视图→属性检查器→内容→[动态原型| 静态单元]。此外,在使用 Storyboard 时,不再有 .nib 文件。【参考方案6】:

你可以让它动态化,然后切换滚动:

[yourTableName setScrollEnabled:NO];

【讨论】:

他的意思不是滚动不移动意义上的静态,而是单元格是在故事板中预定义的,而不是由数据源和委托提供。

以上是关于如何在嵌入 UIViewController 的 UITableView 中直观地创建和使用静态单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何在嵌入 UIViewController 的 UITableView 中直观地创建和使用静态单元格

如何将数据传递到 UIView 侧的嵌入式 UIViewController - Swift 5

将 UITableView 作为容器视图嵌入到 UIViewController 中

从嵌入式子UIViewController中获取Parent ViewController

将信息从 UINavigationController 传递到嵌入式 UIViewController

以编程方式嵌入 UIViewController?