2011-11-23 71 views
0

好的,我有一個問題,一直沒能找到我做錯了什麼。調用父UIViewControllers函數

我有一個UIVievController有一個視圖和一些功能和東西。一個是從另一個UIVeiwController打開(從一個動作表中的按鈕)。看起來像這樣:

PersonalSettings *personalSettings; 
-(IBAction) displaySettingsMenu:(id)sender 
{ 
    personalSettings = [[PersonalSettings alloc] 
         initWithNibName:@"PersonalSettings" 
         bundle:nil]; 
    [self.view addSubview:personalSettings.view]; 
    [SettingsSheet dismissWithClickedButtonIndex:0 animated:YES]; 
} 

這就像一個魅力,我可以在這個視圖使som更新。 當我關閉此視圖時,所有設置都會正確更新並且視圖消失,但是我想要重新加載父項ViewController(View?),以便我可以看到我所做的新設置。我在父項中有一個void函數,但是我怎樣才能調用它? 當保存按鈕在孩子ViewController被擊中我刪除這樣的觀點:

[self.view removeFromSuperview]; 

我從這裏做是調用從父視圖的子視圖更新功能。

我發現了一些代碼,但由於superview沒有出現在列表中,所以除了「superclass」而不是「superview」。看起來是這樣的:

[self.view removeFromSuperview]; 

MainViewController *Parent = (MainViewController *)self.superclass; 
[Parent updateView]; 

有什麼「魔力」我可以做這樣說:「重載父視圖」?

我希望我可以理解這個問題。 :)

編輯:

真的非常感謝你的gyus,我現在更接近。 我不是100%確定這個代表事物是如何工作的(但),但我接近解決方案。其實,我意識到甚至不需要運行一個方法,只需更新一個標籤。

從子,我寫了這個:

MainViewController* Parent = [[MainViewController alloc] init]; 
Parent.delegate = self; 
Parent.TheLabel.text = @"foo"; 

...但是這不工作 - 即使它真的發現標籤和每一件事情。如果我從孩子試圖這樣:

NSLog(@"Parent label: %@", Parent.TheLabel.text); 

它記錄「父標籤:(null)」。

但是,我現在可以從小孩到達更新功能並運行。問題是這個函數從其他標籤中獲取值(在父視圖中),這是它崩潰的地方 - 當我從子項運行函數時,它們全都是空的。即使他們不是。任何想法爲什麼?

+0

這與你的問題無關,但是當你想顯示一個新的視圖和相關的'UIViewController',你應該使用視圖控制器方法。 ' - (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated'例如。如果只是將控制器視圖添加爲子視圖,則會失去使用視圖控制器免費獲得的所有漂亮內存管理方法。 – kubi

+0

這是一個恥辱我不能標記你的評論作爲修復,這是它!現在父級更新正確,因爲它運行的視圖確實加載。 – gubbfett

回答

1

如果您熟悉委託模型,請讓您的父級查看委託,並從孩子那邊傳回信息。你會在Apple網站上找到一些關於它的好文檔。

基本上你添加一個「代理」字段,你的孩子的「構造」,即:

child = [[ViewController alloc] initWithDelegate:this withNibName:@"myNib"]; 

然後,在子類中,當您收到的信息,您可以訪問您的代理字段/方法。

- (void) volumeDidChange:(int)volume 
{ 
    delegate.volume = volume 
} 

或類似的東西。祝你好運!

+0

我希望我能理解你的問題:S – aeoliant

0

如果你正在尋找訪問給定控制器的父母一個通用的方法,看看這個方法:

+ (YOURTABBARCONTROLLER*)parentTabBarController:(UIResponder*)view { 
    id nextResponder = nil; 
    id v = view; 
    while (nextResponder = [v nextResponder]) { 
     if ([nextResponder isKindOfClass:[YOURTABBARCONTROLLER class]]) 
      return nextResponder; 
     v = nextResponder; 
    } 
    return nil; 
} 

它將導航響應鏈,以退給你一流的在那裏找到的給定類型。您可以將YOURTABBARCONTROLLER指定爲UIViewController,或者指定您的具體控制器類以獲得更多控制權。所以,你會說,例如:

YOURTABBARCONTROLLER* parent = [self parentTabController:self.view]; 

(如果self是你的孩子控制器,並且你在其中定義了上述方法)。

這是距離AFAIK最近的地方。該方法也可以作爲UIViewController的一個類別,所以你總是有它。

編輯:

如果使用+,然後調用這樣的方法:[CLASSNAME parentTabController:視圖],其中CLASSNAME是你定義它的類。無論如何,您可以在方法聲明中使用-,它將與self一起使用,如上所述。

如果它不適合你,請按照你的定義和完整的方式發佈完整的方法。你也可以加入這一行:

  NSLog(@"Found Responder: %@", nextResponder); //-- ADDED THIS 

while循環的第一線,因此該方法將記錄其發現在響應鏈。

+0

謝謝你,感覺就像我在這裏的正確軌道。我對此很陌生,「+」是做什麼的?當我做這個方法時,我無法在[self parentTabBarContoller ..]中找到「parentTabBarController」,但我可以用「 - 」找到它。它沒有給我任何錯誤或者其他的東西,但是它不會運行這個函數(我這樣稱呼它:[parent updateView];) – gubbfett

0

我同意aeoliant,使用委託模式可能更合適。一個簡單的externation Working with delegate in objective-c

+0

好吧,我已經準備好了 - 差不多。在更新的頂部,我有一個nslog並運行,但它不更新,並沒有提供任何錯誤。該更新從數據庫獲取帖子並將其顯示在父視圖中。所以它運行它,但不更新。當我在父視圖中做其他事情時,我只是調用這個更新函數(實際上它是一個IBAction而不是void),它工作得很好。但是當我通過委託方法從孩子調用它時,它看起來像是剛剛運行但不做任何事情。有什麼建議麼? – gubbfett

+0

在你的父類中,將父本身設置爲孩子的委託,就像child.delegate = self ;.在你的孩子中,用'updateParentLable:(nsstring *)text'等方法創建一個委託。更新父母,在你的子女調用[委託updateParentLabel:文字];在你的父類中,你必須有委託方法'updateParentLAbel:(nsstring *)text',所以在這個方法中你可以更新它自己的標籤,比如self.label = text。 – cayden

1

由於我只是一個新手,並添加子視圖爲「addSubview」我有這個問題。用 - (void)presentModalViewController改變視圖:(UIViewController *)modalViewController animated:(BOOL)animated做了詭計! 謝謝任何​​特別感謝庫比:)