【问题标题】:Adding a TTTableViewController (from three20) to another UIViewController将一个 TTTableViewController(来自three20)添加到另一个 UIViewController
【发布时间】:2011-02-17 06:46:01
【问题描述】:

我遇到了three20 的问题,希望有人能帮我解决。

我有一个TTTableViewController,我使用它的方式与three20 示例项目中的TTTwitter 应用程序的使用方式非常相似。我只实现了三种方法:(id)init(void)createModel(id<UITableViewDelegate>)createDelegate。我已经为我的数据分类了TTListDataSourceTTURLRequestModel。总而言之,TTTableViewController 的使用相当简单,我没有做任何不寻常的事情。

当我将此 TTTableViewController 添加到 UIView 的后代时,它工作得很好。它完美地加载和显示数据。例如,以下两个工作正常:

FooTableViewController *controller = [[FooTableViewController alloc] init];
controller.view.frame = CGRectMake(288, 20, 480, 1004);
[self.window addSubview:controller.view];

这样:

FooTableViewController *controller = [[FooTableViewController alloc] init];
controller.view.frame = CGRectMake(288, 20, 480, 1004);

UIScrollView *scrollView = [[UIScrollView alloc] init];
scrollView.frame = CGRectMake(0, 0, 768, 1024);
// a bunch of scrollView variable initializations..
[scrollView addSubview:controller.view];
[self.window addSubview:scrollView];

当我尝试将FooTableViewController(又是TTTableViewController 的子类)添加到UIViewController 的后代的view 时,就会出现问题。例如,以下内容不起作用:

FooTableViewController *controller = [[FooTableViewController alloc] init];
controller.view.frame = CGRectMake(288, 20, 480, 1004);

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.frame = CGRectMake(0, 20, 768, 1004);
[viewController.view addSubview:controller.view];

[self.window addSubview:viewController.view];

知道为什么会这样吗?就像我说的,当我将它添加到UIView(即不在UIViewController 中的那个)时它工作得很好,但当我尝试将它添加到UIViewController 时却不行。除了尝试像上面那样添加它,我还尝试子类化UIViewController 并从内部添加它。没有运气。

谢谢!

编辑我应该更清楚我所说的“它不起作用”是什么意思。我所看到的只是一个空表——只是空行。在createModel 上设置断点确实表明该方法没有被调用。谢谢!

UPDATE diwup 完全为我指明了正确的解决方案。他是对的,因为TTTableViewControllerviewWillAppear:viewDidAppear: 没有被调用。我通过子类化UIViewController(我称之为FooViewController)并在类中将TTTableViewController 添加到它的view 来验证这一点(我称之为TTTableViewController 变量controller)。我还覆盖了两个这样的方法:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [controller viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [controller viewDidAppear:animated];
}

而且,你瞧,它奏效了!当然,这不是长久之计,我还是想弄清楚如何让viewWillAppear:viewDidAppear:自行调用。

UPDATE2 我决定像这样覆盖viewDidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];

    [super viewWillAppear:NO];
    [super viewDidAppear:NO];
}

我对它不太满意,它看起来很老套(我可能应该确保viewWillAppear:viewDidAppear: 不会被调用两次),但我已经准备好收工了。

【问题讨论】:

  • 解决方案有效!如果有更好的解决方案那就太好了。如果使用多个tt控制器,保留每个控制器并调用viewWillAppear太麻烦了。

标签: iphone uiviewcontroller three20


【解决方案1】:

我的回答可能不相关。但我怀疑问题可能与 addSubview: 方法有关。由于 addSubview: 不能保证视图位于视图层次结构的顶层,因此在 addSubview: 期间或之后可能不会触发该视图的某些方法。这些方法包括viewWillAppear:viewDidAppear:

因此,如果 Three20 的代码依赖于这些接口方法,事情可能会出错。我建议您尝试以模态方式呈现该控制器,看看会发生什么。

【讨论】:

  • 感谢您的提示。它肯定给了我一些探索的东西。我相信我很快就会了解更多关于UIViewControllers 的信息... :)
  • 实际上.. 刚刚意识到我让它工作的样本基本上做同样的事情......它将view 添加到另一个UIView 而不以模态方式加载TTTableViewController。嗯..但无论如何,感谢您让我朝这个方向思考。 :)
  • 我选择了一个对我来说似乎不太干净的解决方案,正如您在我的更新中看到的那样。再次感谢您为我指明这个方向。
【解决方案2】:

同样的问题。

只需调用 TTTableViewController 的实例即可;

例如:

  TTTableViewController tableViewController;
  [tableViewController createModel]

  [tableViewController updateView]

在 viewDidLoad 中。

它的作品。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多