【问题标题】:2 UITableViews in one UIView一个 UIView 中有 2 个 UITableViews
【发布时间】:2014-12-18 13:40:26
【问题描述】:

我有一个 UIView 需要显示两个 UITableView,但它们从不一起显示,通过使用 SegementedBar 您可以切换其中一个。

处理此问题的最佳方法是什么?只需创建一个Table View Controller 并更改数据源,或者创建2 个Table View Controllers 并在另一个可见时隐藏一个。

这两个表格将具有完全不同的布局和不同的自定义单元格。

【问题讨论】:

    标签: ios uitableview


    【解决方案1】:

    我会保留一个数据源和委托。

    这意味着所有委托/数据源方法都变得更加复杂,但这意味着您可以保留 viewController 和 view 之间的一对一关系。

    保留对每个表视图的引用

    //vc.h
    @property (nonatomic, weak) IBOutlet UITableView* firstTableView;
    @property (nonatomic, weak) IBOutlet UITableView* secondTableView;
    

    在 datasource/delegate 方法中,您需要考虑一个事实,即该方法需要根据所使用的 table view 表现出不同的行为。例如

    //vc.m
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        ...
    
        if (tableView == self.firstTableView) {
    
            ...
    
        } else { // tableView == self.secondTableView
    
            ...
        }
    }
    
    return cell;
    

    }

    【讨论】:

    • 谢谢,不过我和rishi的帖子有同样的顾虑,它可能会导致复杂的代码结构,但它也可以为我节省很多双重代码。
    • 奖励是你没有两个控制器,控制一个视图,当它出错时“可能”是一个真正的痛苦......
    • +1 - 这个实现更容易适应并遵循 Apple 的 UISearchDisplayController 设计模式。
    • 也是这样,我想我现在试试你的方法,每个表格单元格的代码实际上并没有那么复杂,所以应该没问题。
    • @woutr_be:请注意,虽然这种方法看起来不错,但如果您的控制器直接继承自 UITableViewController(提供 tableView 属性并具有 searchDisplayController.searchResultsTableView),它可能会变得相当复杂也是。如果您计划在未来增强功能(搜索,也许是排序?),代码可能会变得难以维护并且容易出现错误。
    【解决方案2】:
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        ...
    
        if (tableView.tag == 1) {
    
            ...
    
        } else { // tableView == self.secondTableView
    
            ...
        }
    }
    

    标签可以从 .xib 中分配。 所以不需要在 .h 文件中有 UITableVeiw 变量。 .xib 中需要两个表视图

    【讨论】:

      【解决方案3】:

      这两种方法都有一些优点和缺点,但我个人更喜欢具有两个独立控制器的方法。

      方法 1 - 创建一个 Table View Controller 并更改数据源

      • 这种方法有助于避免额外和重复的代码。
      • 使用这种内存管理就像只使用一个控制器一样好。(虽然这不是一个大问题,直到那时我们不会有很多数据。)
      • 这个问题很复杂。

      方法 2 - 2 表视图控制器

      • 用这种方法肯定会有多余和重复的代码。
      • 但这样的复杂性更低。

      【讨论】:

      • 我也有同样的顾虑,虽然第一种方法可以节省大量代码,但我担心它可能会导致代码结构复杂。
      • @woutr_be - 这就是为什么我说我更喜欢第二个,因为我想避免增加复杂性。
      • 谢谢,现在我会选择第一种方法,如果它变得太复杂我仍然可以切换。
      【解决方案4】:

      在我当前的应用程序中,我需要在一个 UIViewController 中有 4 个 UITableView,我必须根据用户选择的选项卡一次显示单个表,我添加了四个表,因为,所有这些都有不同的自定义单元格和功能,为了降低复杂性,我花了四个。

      这样做的主要好处是,每次您不需要调用reloadData 来更新单个表。我只需要正确处理表格的显示和隐藏流程。相信我,这看起来很酷。一点都不闪。

      就我而言,我仅通过代码创建四个表。我创建了一个方法,它会根据我通过的标签返回一个表格。

      我通过将代码划分为不同的函数来使cellForRowAtIndexPath 尽可能小。

      【讨论】:

      • 这看起来很有趣..您使用/修改了哪些方法来实现此效果?代码示例会很棒。
      • @DavidDelMonte,我无法与您分享任何示例。但是您可以创建一种方法来隐藏所有表格并仅显示您正在寻找的特定表格。在cellForRowAtIndexPath 中,您可以通过标签区分每个表。
      • @DavidDelMonte,很高兴。我可以帮你! :)
      【解决方案5】:

      使用单独的UITableViewControllers 并交换视图。它的代码更少,复杂性更低,这就是 Apple 使用 TabBar 的方式。

      至于代码复杂度,真的没有。当UISegmentedControl 的值发生变化时,您只需执行以下操作即可切换视图:

      UIView *previousSuperview = myViewController1.view.superview;
      myViewController2.view.frame = myViewController1.view.frame;
      [myViewController1.view removeFromSuperview];
      [previousSuperview addSubview:myViewController2.view];
      

      或者,您可以设置相应视图的hidden 属性。

      【讨论】:

      • 我知道这有点延迟,但我喜欢你对这个答案的解决方案 - 我唯一的问题是单独的 UITableViewControllers 是否仍然充当他们自己的表视图的数据源
      • @MikeSimz 是的,默认情况下他们就是这样做的。但是,如果您愿意,可以通过在两个 UITableViews 上设置它来使用公共数据源。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      相关资源
      最近更新 更多