2011-02-17 76 views
5

我遇到了three20的問題,我希望有人能幫助我。添加一個TTTableViewController(從three20)到另一個UIViewController

我有一個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一個子類)的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中)時,它工作得很好,但是當我嘗試將它添加到UIViewController時,它沒有問題。除了試圖像上面那樣添加它之外,我還嘗試了子類化UIViewController並從內部添加它。沒有運氣。

謝謝!

編輯我應該更清楚我的意思是「它不工作」。我看到的只是一張空桌 - 只是空的行。在createModel上放置斷點確實表明該方法未被調用。謝謝!

UPDATE diwup完全指出我正確的解決方案。他是對的,因爲TTTableViewControllerviewWillAppear: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:不會被調用兩次),但我準備好在一天之內給它打電話。

+0

該解決方案的工作原理!如果有更好的解決方案,它會很棒。如果使用很多tt控制器,保持每個控制器和調用viewWillAppear太麻煩。 – samwize 2011-02-25 08:54:55

回答

3

我的答案可能不相關。但我懷疑這個問題可能與addSubview:方法有關。由於addSubview:不保證視圖位於視圖層次結構的頂層,因此該視圖的某些方法可能不會在addSubview:期間或之後被觸發。這些方法包括viewWillAppear中:viewDidAppear:等等等等

因此,如果Three20的代碼依賴於這些接口中的方法,事情可能出錯。我建議你嘗試以模態方式呈現該控制器,看看會發生什麼。

+0

感謝您的提示。這絕對是給了我一些探索。我相信我即將瞭解更多關於`UIViewController`的更多信息...... :) – donkim 2011-02-17 07:23:06

1

同樣的問題。

只需調用TTTableViewController的instace;

例如:

TTTableViewController tableViewController; 
    [tableViewController createModel] 

[tableViewController updateView] 
在viewDidLoad中

它的工作。

相關問題