【发布时间】:2011-02-17 06:46:01
【问题描述】:
我遇到了three20 的问题,希望有人能帮我解决。
我有一个TTTableViewController,我使用它的方式与three20 示例项目中的TTTwitter 应用程序的使用方式非常相似。我只实现了三种方法:(id)init、(void)createModel 和 (id<UITableViewDelegate>)createDelegate。我已经为我的数据分类了TTListDataSource 和TTURLRequestModel。总而言之,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 完全为我指明了正确的解决方案。他是对的,因为TTTableViewController 的viewWillAppear: 和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