【问题标题】:adding a UITableView programmatically to a UIViewController以编程方式将 UITableView 添加到 UIViewController
【发布时间】:2011-08-22 20:06:33
【问题描述】:

我正在将 UIViewController 加载到我的导航控制器的一个层次结构中,其中将包含一些文本和一些图像。在底部,我将要创建一个可展开和可折叠的表格视图。

首先,这个想法可能吗?如果是,如何添加,数据源和委托方法放在哪里?

我可以单独创建一个 TableViewController 的子类,然后将它作为子视图添加到我的 ViewController 中吗?

【问题讨论】:

  • 不能将任何东西作为子视图添加到视图控制器中,因为视图控制器不是视图,只有视图才有子视图。

标签: iphone ios cocoa-touch uikit


【解决方案1】:

是的,您可以创建一个 UITableView,其代理、数据源和父视图不一定是 UITableViewController。由于 UITableView 是 UIView,因此您可以将其添加为任何其他 UIView 的子视图。只要你实现了所需的协议方法,任何 NSObject 都可以是委托或数据源。

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

事实上,以我的经验,甚至没有多少人使用 UITableViewControllers。您最后一次希望表格视图占据整个可用空间是什么时候?通常,我创建一个普通的旧 UIViewController 并添加一个 UITableView 作为其视图的子视图,以及其他子视图。

【讨论】:

  • 嘿@commanda,我是 ios 开发新手,正在研究如何正确实现在 uiviewcontroller 中插入 uitableview 和其他对象。无论如何,我偶然发现了这一点,想知道您是否知道我可以查看的一些教程/源代码,以便我了解它是如何工作的?谢谢!
【解决方案2】:
/************************************************/
/************* MyCustomController.m *************/
/************************************************/

@interface MyCustomController () <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) UITableView *tableView;
@end

@implementation MyCustomController

- (id)initWithNibName:(NSString*)nibName bundle:(NSString*)bundleName
{
   self = [super initWitNibName:nibName bundle:bundleName];
   if (self)
   {
       self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
       tableView.datasource = self; 
       tableView.delegate = self;
       [self.view addSubview:self.tableView];
   }

   return self;
}

#pragma mark - UITableViewDataSource Methods

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // return number of rows
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // return cell
}

#pragma mark - UITableViewDelegate Methods

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    // handle table view selection
}

@end

【讨论】:

    【解决方案3】:

    这很简单,就像你的 viewDidLoad 方法:

    UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:tableView];
    

    【讨论】:

      【解决方案4】:

      请记住,UITableViewController 是 UIViewController 的子类,只有 tableview 设置为控制器的视图。

      所以当你想要一个 tableview 以及其他阻止你使用 UITableViewController 的自定义 UI 元素时,肯定是可能的并且经常使用。

      我通常会选择在其初始化方法或 viewDidLoad 方法中将其添加到我的视图控制器的视图中。这将根据您是从 NIB 还是完全以编程方式创建视图而有所不同。

      如果是 NIB:

      - (id)initWithNibName:(NSString*)nibName bundle:(NSBundle*)bundleName
      {
         if ((self = [super initWitNibName:nibName bundle:bundleName]))
         {
             self.theTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewWhateverStyleYouWantHere];
             theTableView.dataSource = self, theTableView.delegate = self;
             [self.view addSubview:theTableView];
             [theTableView release];
         }
      }
      

      然后您可以在 viewDidLoad 方法中设置表格视图的框架。

      我个人更喜欢在界面构建器中完成所有工作,因为您可以通过更少的代码维护来获得相同的结果。

      【讨论】:

      • 我很好奇使用 IB 会如何产生“更少的代码”。完全在代码中执行此操作,initWithNibName:bundle: 将更改为简单的init - 但还有其他更改吗?
      • 我认为'datasource'应该是'dataSource'
      【解决方案5】:

      如果你像我一样已经创建了一个 UITableViewController,然后意识到你做了很多工作以至于重写它会很痛苦,你可以执行以下操作将 UITableViewController 添加到 UIViewController一个子视图。

      UITableViewController* tableViewController = [[UITableViewController alloc] init];
      [self.view addSubview:tableViewController.tableView];
      

      以上所有其他答案都很好。我想我会为那些投入大量资金实现 UITableViewController 并且觉得重构会很痛苦的人添加此内容。

      【讨论】:

      • 我什至更喜欢这种方式 - 表控制器与视图控制器很好地分开。
      猜你喜欢
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多