【问题标题】:How do I create a UI TableView with multiple columns in Xcode?如何在 Xcode 中创建具有多列的 UI TableView?
【发布时间】:2015-03-19 19:15:14
【问题描述】:

我正在使用 Xcode 开发 iOS 8 应用程序。 我需要在一个视图中显示一个包含多列和多行数据的表格。

例子:

Name               Time In       Time Out      ETA
Johnnys Supplies    8:30AM        9:00AM      10:15AM
Franks Company      8:45AM        9:05AM      9:45AM
Another Inc.        10:12AM       11:00AM     12:04PM

所有数据都将使用 JSON/PHP 读取。

我需要它像表格视图一样工作,用户可以在其中垂直滚动并选择索引。选择该索引后,用户可以单击按钮以根据所选单元格(等)中的数据运行其他查询。

实现这一点的最简单方法是什么? xcode 必须有一种方法可以让您在本地执行此操作?我错过了什么吗?

欢迎所有编码示例!

我找到了两个选项,但都需要许可费:

http://www.ioscomponents.com/Home/IOSDataGrid

http://www.binpress.com/app/ios-data-grid-table-view/586

有人熟悉这些组件吗?

【问题讨论】:

  • 如果你继承UITableViewCell,你可以很容易地编写你自己的。
  • 问问自己需要多长时间才能自己实现它并乘以您的小时费率。如果超过 130 美元或 400 美元,请购买该组件。 ;-)
  • 使用 UICollectionView。参考示例:appcoda.com/ios-programming-uicollectionview-tutorial
  • 我认为你的问题有点模棱两可。从您的示例的外观来看,我会说您希望这些列全部滚动为一个,因为每一行看起来都是一个数据“单元”,所以我会遵循 DuncanC 的以下建议并将 UITableView 与自定义单元格一起使用它将数据排列在列中。然而,对于在行中需要较少耦合的其他用途,UIcollectionView 可能更合适,或者实际上是 UIPickerView,它实际上是由许多独立的 UITableView 构建的,因此有些人可能会将其视为您问题的答案。 :)

标签: ios objective-c uitableview


【解决方案1】:

两列和两个相邻的标签有什么区别?分隔线?

这是一个多列表格视图吗?

因为它是一个带有普通UITableViewCell 的tableview,它有3 个UILabels 和2 个UIViews。这些视图通过 1 px 宽来伪装成分隔线。

代码应该是不言自明的。

.h

@interface MultiColumnTableViewCell : UITableViewCell
@property (strong, nonatomic) UILabel *label1;
@property (strong, nonatomic) UILabel *label2;
@property (strong, nonatomic) UILabel *label3;
@end

.m

@interface MultiColumnTableViewCell ()
@property (strong, nonatomic) UIView *divider1;
@property (strong, nonatomic) UIView *divider2;
@end

@implementation MultiColumnTableViewCell

- (UILabel *)label {
    UILabel *label = [[UILabel alloc] init];
    label.translatesAutoresizingMaskIntoConstraints = NO;
    [self.contentView addSubview:label];
    return label;
}

- (UIView *)divider {
    UIView *view = [[UIView alloc] init];
    view.translatesAutoresizingMaskIntoConstraints = NO;
    [view addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:1.0/[[UIScreen mainScreen] scale]]];
    view.backgroundColor = [UIColor lightGrayColor];
    [self.contentView addSubview:view];
    return view;
}

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    self.separatorInset = UIEdgeInsetsZero;
    self.layoutMargins = UIEdgeInsetsZero;
    self.preservesSuperviewLayoutMargins = NO;

    self.divider1 = [self divider];
    self.divider2 = [self divider];

    self.label1 = [self label];
    self.label2 = [self label];
    self.label3 = [self label];

    NSDictionary *views = NSDictionaryOfVariableBindings(_label1, _label2, _label3, _divider1, _divider2);

    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[_label1]-2-[_divider1]-2-[_label2(==_label1)]-2-[_divider2]-2-[_label3(==_label1)]-5-|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:views];
    [self.contentView addConstraints:constraints];

    NSArray *horizontalConstraints1 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_divider1]|" options:0 metrics:nil views:views];
    [self.contentView addConstraints:horizontalConstraints1];
    NSArray *horizontalConstraints2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_divider2]|" options:0 metrics:nil views:views];
    [self.contentView addConstraints:horizontalConstraints2];

    return self;
}

@end

TableViewController:

@implementation MasterViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.tableView registerClass:[MultiColumnTableViewCell class] forCellReuseIdentifier:@"Cell"];
    self.tableView.separatorColor = [UIColor lightGrayColor];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 10;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MultiColumnTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.label1.text = [NSString stringWithFormat:@"Name %ld", (long)indexPath.row];
    cell.label2.text = [NSString stringWithFormat:@"Start %ld", (long)indexPath.row];
    cell.label3.text = [NSString stringWithFormat:@"End %ld", (long)indexPath.row];
    return cell;
}

@end

【讨论】:

    【解决方案2】:

    iOS 表格视图始终是单列。在 Mac OS 上,您可以直接创建您想要的。

    也就是说,您可以创建自定义表格视图单元格来显示您想要的内容。事实上,这很容易。您要做的就是继承 UITableViewCell 并为每个列定义视图(可能是 UILabels),然后将它们连接为单元格中的插座属性。然后装配您的表格视图,为您使用的单元格标识符注册该单元格类。

    然后您编写自己的 cellForRowAtIndexPath 方法来将您的数据安装到不同的插座属性中。

    您也可以使用 UICollectionView,但在我看来,带有自定义单元格的表格视图更适合此应用程序。

    【讨论】:

    • 您能提供一些编码示例吗?我从来没有在 stackoverflow 上看到过正确回答这个问题,如果能结束这个问题会很好。
    • @FilipKorngut 查看“适用于 iOS 的 Table View Programming Guide”并查看 UITableView 的文档中引用的示例应用程序。有大量示例展示了如何创建具有多个标签的自定义单元格。
    • @rmaddy 说了什么。 Apple 很好地涵盖了这一点,并且在几十个示例应用程序中。
    • 这非常有效。我在这里找到了这种方法的优秀示例编码视频...youtube.com/watch?v=FfZGKx4BYVU
    【解决方案3】:

    使用 UICollectionView,查看 Apple WWDC 2012 会议

    • 205 集合视图简介
    • 219 个高级集合视图和构建自定义布局

    来自https://developer.apple.com/videos/wwdc/2012/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      相关资源
      最近更新 更多