【问题标题】:Best approach to add Static-TableView-Cells to a UIViewcontroller?将 Static-TableView-Cells 添加到 UIViewcontroller 的最佳方法?
【发布时间】:2012-12-12 19:25:33
【问题描述】:

我想在我的应用程序中添加一个 tableview-look-a-like-login,但实现起来似乎并不容易。我尝试使用不止一种方法来实现我的目标,但我不确定哪种解决方案是最好的。

例如,Dropbox 和 Facebook 都有这样的登录页面。

这是我的 3 种方法:

  1. 我在视图中添加了 2 个 UITextfields(无边框)并放置了一个 . png 后面,看起来像一个 tableviewcell。 (不是最好的方法,因为我想使用真正的表格视图)

  2. 我在 ViewController 中添加了一个容器视图,在其中放置了一个带有静态表视图的表视图。这里的问题是,我不知道如何访问我的视图控制器中的信息?

  3. 我在 ViewController 中添加了一个 tableview 并使用了动态单元格。将委托和数据源的出口连接到我的视图控制器,并使用委托和数据源方法对其进行初始化。这里的问题是,我不能在 uiviewcontroller 中使用静态表视图。

有没有更好的方法来解决这个问题? 我真的很想知道如何以更优雅的方式做到这一点。

编辑

一个月前,ContainerViewController 基本上为我解决了这个问题。 将一个嵌入主控制器后,您可以通过prepareForSegue 函数对其进行访问,并为该特定控制器定义一个基于协议的接口,以便与嵌入式控制器进行交互。

【问题讨论】:

  • 终于有人不滥用可怜的xcode标签了! +1 提出一个好问题。

标签: iphone ios cocoa-touch uitableview


【解决方案1】:

如果您想在常规 UIViewController 中使用静态单元格,只需添加静态单元格并在界面构建器中按照您喜欢的方式设计它们,然后将表格单元格连接为 strong IB 插座( weak 不起作用,请确保它们被强烈引用)。如果您有几个表格单元格,这将完美无缺。然后将视图控制器设置为平板视图的数据源,实现-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section返回单元格数,实现-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath返回指定索引路径的强引用单元格实例。我已经在我的视图控制器中将这种方法用于一个简单的表格视图,它有四个单元格,并且运行良好。对于大型动态数据集,我绝对不推荐这种方法,但对于小型静态表,这种方法就可以了。

【讨论】:

  • 你是如何设计界面生成器中的静态单元格的?您是在单独的 XIB 中执行此操作吗?它在表格视图之外吗?
【解决方案2】:

我知道如何解决这个问题。我认为这是一种干净的方式。您确实不需要此控制器的情节提要。

让你的控制器子类 UITableViewController 像这样:

@interface YourViewController : UITableViewController

然后在您的 viewDidLoad 中创建单元格的实例:

- (void) viewDidLoad {
    usernameCell = [YourTextFieldCell new];
    passwordCell = [YourTextFieldCell new];
}

YourTextFieldCell 当然是你自己的 UITableViewCell 的子类,可能是这样的:

@implementation YourTextFieldCell {
    UITextField textField;
}
- (id) init {
    self = [super init];
    if (self) {
        // Adjust the text's frame field to your liking
        textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 200, 20)];
        [self addSubview:textField];
    }
}
// A getter method to access the textfield from the outside
- (UITextField *) textField {
    return textField;
}

@end

回到YourViewController:

- (NSInteger) tableView:(UITableView *) tv numberOfRowsInSection:(NSInteger) section {
    return 2;
}
- (UITableViewCell *) tableView:(UITableView *) tv cellForRowAtIndexPath:(NSIndexPath *) indexPath {
    if (indexPath.row == 0) {
        return usernameCell;
    } else if (indexPath.row == 1) {
        return passwordCell;
    }
    return nil;
}

你明白我的意思吗?这就是我认为你应该这样做的方式!祝你好运!

【讨论】:

  • 感谢您的回答,但如果我将视图控制器设为 UITableViewController 的子类,我仍然会收到错误消息“非法配置,静态单元格仅在嵌入 UITableViewController 实例时有效”...跨度>
  • 不要为此使用情节提要。只做我解释的,不用故事板。
  • 好的,但它似乎与我的 3. 方法几乎相同的解决方案。我真的很想在故事板中创建我的单元格静态。我知道我可以创建动态原型并通过委托和数据源方法添加它们,但这不是我想要的。因为在情节提要中我得到了一个愚蠢的“动态原型标题,然后我无法隐藏它。当以正确的方式放置 tableview 时会造成麻烦。
  • 这是迄今为止更简单的解决方案,但它只适用于适合屏幕的UITableView。我知道这是用于登录视图,但我想我回答了标题,而不是针对该用户的具体问题,因为标题将是未来搜索结果中出现的内容。
  • 如果您不希望 UITableView 跨越整个屏幕,这几乎是相同的解决方案。只需扩展 UIViewController,使其符合 UITableViewDataSource 和 UITableViewDelegate 协议。然后在 viewDidLoad 中自己实例化 UITableView 并将委托和数据源分配给该控制器。
【解决方案3】:

我认为您的方法 2 是最好的。如果您需要从您的 UIViewController(将是父视图控制器)访问表视图控制器中的信息,您可以使用 self.childViewControllers.lastObject 获取对该表视图控制器的引用。在 UIViewController 子类的 viewDidLoad 方法中,您可以根据需要将自己设置为 table view 的委托:

[[(UITableViewController *)self.childViewControllers.lastObject tableView] setDelegate:self];

这样,你可以在视图控制器中实现 tableView:didSelectRowAtIndexPath: 方法,它会得到我猜你需要的信息。

【讨论】:

    【解决方案4】:

    如果您选择 2) 使用情节提要并拥有一个包含您自己的 UITableViewController 子类和静态单元格的 ContainerView,那么您可以在父 ViewController 中实现 prepareForSegue: 方法以引用 UITableViewController (它'将成为 segue 的destinationController),并且在必要时将其自身传递给 UITableViewController 子类(它应该通过弱引用保持它)。

    【讨论】:

      【解决方案5】:

      免责声明 - 此答案适用于 UITableView 的任何大小,但如果您只是制作登录视图,Tom 的答案将非常有效。

      我不确定这是否会有所帮助,但我为此所做的是创建自己的 UITableView-esque 子类和 UITableViewCell-esque 子类。

      这可能不是您想听到的,但我发现我所做的确实很有帮助,因为我已经使用过很多次了。基本上,你有一个 UIView 具有不同类型的风格方法(10.0f - 20.0f cornerRadius 和 1px 边框(除以 UIScreen 视网膜的比例属性)。至于单元格,你会想要在其上拥有一个完整大小的UIButton,它可以通过委托或通过在表格视图的类中设置目标和标签来响应您的表格视图的触摸事件。

      最后,您将拥有一个类似于 UITableView 的委托系统,供您用于构建特定表的信息。

      简而言之,您需要:

      • 2 UIView 子类(TableView 和 TableViewCell)
      • 2 个委托/协议(TableViewDataSource 和 TableViewDelegate)

      可选

      • 1 个委托 (TableViewCellResponseDelegate)
      • 1 NSObject 子类(包含每个单元格所需的所有信息 - 易于使用)

      【讨论】:

        【解决方案6】:

        我发现 Can 的解决方案是最好/最简单的,但不幸的是它在 XCode 5.1 中中断了 --

        我找到了一个基于相同基本思想的解决方法,但不幸的是需要更多的参与:http://www.codebestowed.com/ios-static-tableview-in-uiviewcontroller/

        总而言之,您可以将 TableViewCells 直接添加到视图(并从中创建 IBOutlets 等),但为了使它们正确“移动”到 TableView,您需要在代码中将它们从视图中删除,并且您还需要在 IB 中设置 Auto-Layout 约束。

        【讨论】:

          猜你喜欢
          • 2017-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-09
          • 2018-08-10
          相关资源
          最近更新 更多