将Static-TableView-Cells添加到UIViewcontroller的最佳方法?

时间:2012-12-12 19:25:33

标签: iphone ios cocoa-touch uitableview

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

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

以下是我的3种方法:

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

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

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

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

    修改

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

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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;
}

你到达我的目的地吗?这就是我认为你应该这样做的方式!祝你好运!

答案 2 :(得分:1)

免责声明 - 此答案适用于任何规模的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子类(包含每个单元格中所需的所有信息 - 易于使用)

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

如果您选择使用故事板并使用包含静态单元格的UITableViewController子类的ContainerView,那么您可以在父ViewController中实现prepareForSegue:方法以获取对UITableViewController的引用(它是segue的destinationController),并且如果需要的话也可以将它自己传递给UITableViewController子类(它应该用弱引用保存它)。

答案 5 :(得分:0)

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

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

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