我遇到了一个关于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
上设置断点确实显示该方法没有被调用。谢谢!更新diwup完全指向了正确的解决方案。他说的对,因为
TTTableViewController
的viewWillAppear:
和viewDidAppear:
没有被调用。我通过创建UIViewController
的子类(我称之为FooViewController
)并在其中的view
中添加TTTableViewController
来验证了这一点(我将TTTableViewController
变量称为controller
)。我还重写了两个方法,如下所示:- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[controller viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[controller viewDidAppear:animated];
}
瞧,它奏效了!当然,这并不是长期解决方案,我仍然想弄清楚如何使viewWillAppear:
和viewDidAppear:
自动调用。
更新2 我决定像这样覆盖viewDidLoad:
:
- (void)viewDidLoad {
[super viewDidLoad];
[super viewWillAppear:NO];
[super viewDidAppear:NO];
}
我对此不太满意,它看起来有些粗糙(我应该确保
viewWillAppear:
和viewDidAppear:
不会被调用两次),但我已经准备好结束它了。