将TTTableViewController(从three20)添加到另一个UIViewController

时间:2011-02-17 06:46:01

标签: iphone uiviewcontroller three20

我遇到three20的问题,我希望有人可以帮助我。

我有一个TTTableViewController,与TTTwitter示例项目中的three20应用使用它的方式非常相似。我只实现了三种方法:(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的子类)添加到view的后代的UIViewController时,会出现问题。例如,以下内容不起作用:

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中的那个)时,它可以正常工作,但当我尝试将其添加到{{1 }}。除了像我上面那样尝试添加它之外,我还尝试了对UIViewController进行子类化并从内部添加它。没有运气。

谢谢!

编辑我应该更明确一点,“它不起作用”。我只看到一张空桌子 - 只是空行。在UIViewController上设置断点确实表明该方法未被调用。谢谢!

更新 diwup完全指出了我正确的解决方案。他是对的,因为createModel的{​​{1}}和TTTableViewController没有被调用。我通过继承viewWillAppear:(我称之为viewDidAppear:)并将UIViewController从类中添加到FooViewController来验证了这一点(我称之为TTTableViewController变量{ {1}})。我也覆盖了这样的两种方法:

view

而且,看哪,它有效!当然,这不是一个长期的解决方案,我仍然想弄清楚如何让自己调用TTTableViewControllercontroller

UPDATE2 我决定像这样覆盖- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [controller viewWillAppear:animated]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [controller viewDidAppear:animated]; }

viewWillAppear:

我对它不太满意,看起来很hacky(我应该确保viewDidAppear:viewDidLoad:不会被调用两次),但我已经准备好称之为与它的一天。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

同样的问题。

只需调用TableViewController的实例;

例如:

  TTTableViewController tableViewController;
  [tableViewController createModel]

  [tableViewController updateView]
在viewDidLoad中

它有效。