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

5

我遇到了一个关于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上设置断点确实显示该方法没有被调用。谢谢!
更新diwup完全指向了正确的解决方案。他说的对,因为TTTableViewControllerviewWillAppear: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:不会被调用两次),但我已经准备好结束它了。

解决方案有效!如果有更好的解决方案那就太棒了。如果使用多个tt控制器,为了保持每个控制器和调用viewWillAppear太麻烦了。 - samwize
2个回答

3
我的回答可能不太相关。但是我怀疑问题可能与“addSubview:”方法有关。由于“addSubview:”不能保证视图位于视图层次结构的顶层,因此该视图的某些方法可能在“addSubview:”期间或之后不会被触发。这些方法包括“viewWillAppear:”,“viewDidAppear:”等等。
因此,如果Three20的代码依赖于这些界面方法,可能会出现问题。我建议您尝试以模态方式呈现该控制器,并查看会发生什么。

谢谢你的提示。这绝对让我有了探索的方向。我相信我很快就会更多地了解UIViewController... :) - donkim
其实我刚意识到,我的使它工作的示例基本上做了同样的事情... 它将“view”添加到另一个“UIView”中,而不是以模态方式加载“TTTableViewController”。嗯...但无论如何,感谢你让我思考这个方向。 :) - donkim
我采用了一个解决方案,但它并不是很干净,你可以在我的更新中看到。再次感谢您指引我朝着这个方向。 - donkim

1

同样的问题。

只需调用TTTableViewController的实例;

例如:

  TTTableViewController tableViewController;
  [tableViewController createModel]

  [tableViewController updateView]

在viewDidLoad方法中。

它可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接