7

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

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

这是我的 3 种方法:

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

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

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

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

编辑

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

4

6 回答 6

3

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

于 2013-09-25T11:43:11.677 回答
2

我有一个想法如何解决这个问题。我认为这是一种干净的方式。您不需要控制器的情节提要。

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

@interface YourViewController : UITableViewController

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

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

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

@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;
}

你明白我要去哪里了吗?这就是我认为你应该这样做的方式!祝你好运!

于 2012-12-12T19:46:40.247 回答
1

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

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

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

于 2012-12-12T21:28:57.443 回答
1

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

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

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

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

简而言之,您需要:

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

可选

  • 1 个委托(TableViewCellResponseDelegate)
  • 1NSObject个子类(包含每个单元格所需的所有信息 - 易于使用)
于 2012-12-12T19:43:19.373 回答
1

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

于 2012-12-12T22:13:10.370 回答
0

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

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

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

于 2014-03-15T10:26:02.047 回答