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

don*_*kim 5 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];
Run Code Online (Sandbox Code Playgroud)

就像这样:

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];
Run Code Online (Sandbox Code Playgroud)

当我尝试添加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];
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样吗?就像我说的那样,当我将它添加到一个UIView(也就是一个不在a中的那个UIViewController)时它可以正常工作,但是当我尝试将它添加到一个时它不会UIViewController.除了像我上面那样尝试添加它之外,我还尝试UIViewController了从内部添加子类并添加它.没运气.

谢谢!

编辑我应该更清楚我的意思是"它不起作用".我只看到一张空桌子 - 只是空行.确定断点createModel确实表明该方法没有被调用.谢谢!

更新 diwup完全指出我正确的解决方案.他是正确的,这是因为TTTableViewControllerviewWillAppear:viewDidAppear:没有得到调用.我通过子类化UIViewController(我称之为FooViewController)并在类中添加了TTTableViewControllerview(我称之为TTTableViewController变量controller)来验证这一点.我也覆盖了两个这样的方法:

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

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [controller viewDidAppear:animated];
}
Run Code Online (Sandbox Code Playgroud)

而且,瞧,它有效!当然,这不是一个长期的解决方案,我仍然想弄清楚如何自己获取viewWillAppear:viewDidAppear:调用.

UPDATE2我决定viewDidLoad:像这样覆盖:

- (void)viewDidLoad {
    [super viewDidLoad];

    [super viewWillAppear:NO];
    [super viewDidAppear:NO];
}
Run Code Online (Sandbox Code Playgroud)

我对它不太满意,看起来很hacky(我应该确定viewWillAppear:并且viewDidAppear:不要再被叫两次),但我已经准备好用它来称呼它了.

Di *_* Wu 3

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

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