2012-11-19 41 views
0

我想知道是否有可能找到其觀點叫下面的函數辨別早期的UIView的名字

- (void)viewWillAppear:(BOOL)animated { 
    //find here the name of the calling view 
} 

有沒有辦法找到該視圖稱爲新的看法?

+0

[self className]? –

+0

給出活動視圖的名稱。我正在尋找「先前」的觀點。 – cateof

+0

保存在viewWillDisappear中,所以你可以在viewWillAppear中使用它 –

回答

0

不用說,「views」不稱這個,而是當你的視圖出現時,iOS會調用它。不幸的是,這很複雜,因爲你可能會得到viewWillAppear,因爲其他視圖控制器提供了這個視圖控制器的視圖,或者當這個視圖呈現的視圖控制器被取消或彈出(取決於模式與推送)時你可能會得到這個。

我們大概可以概括解決這個問題的各種複雜和複雜的方法,但我們應該先退後一步,並問爲什麼你需要這樣做。你真的想達到什麼目的?如果您只是試圖協調視圖控制器之間的交互,則有更好的方法來做到這一點(例如代理,設置視圖控制器屬性等)。


更新:

如果你想弄清楚的數據是否已經改變,而不是依賴於一些自己:「我是從哪裏來的」的邏輯,我個人的偏向一些這些數據修改控制器或進程負責通知視圖控制器這一事實。

最簡單的方法是使用delegate design pattern,其中您的子視圖控制器將具有delegate屬性,該屬性是指向需要了解數據更改的控制器的指針,並且子控制器將會簡單地數據發生變化時調用該方法。在稍微複雜的場景中,您可以將此委託模式與正式委託協議結合使用(以便子視圖控制器不需要知道任何有關父控制器的內容,除非它符合特定協議),但有些情況下可能會說,在兩個特定的着名視圖控制器之間進行通信時,這不是必需的。請參閱「視圖控制器編程指南」中的Using Delegation to Communicate with Other Controllers

在複雜的情況下(例如,數據可以通過Web服務更新過程中改變不同的地方甚至是異步的,例如),我將使用notifications design pattern,在視圖控制器將自身添加爲通過NSNotificationCenter發送的特定通知的觀察者,並且每當數據更新時,通知中心將被告知發佈該特定通知,而該通知又將由觀察者,視圖控制器接收。

+0

我試圖避免刷新我的數據 – cateof

+0

@cateof我明白。視圖控制器之間通信的標準解決方案(例如,是否需要重新加載數據的事實)是代表設計模式。看到我更新的答案。 – Rob

2

鑑於威爾直接不會。如果它被推入UINavigationController,你可以得到viewControllers並獲得前一個。

if (self.navigationController){ 
NSArray* viewControllers = self.navigationControllers.viewControllers; 
UIViewController* lastViewController = [viewControllers objectAtIndex:([viewControllers count] - 1)]; 
NSLog(@"%@ is my last ViewController before navigationg to this ViewController", lastViewController); 
} 
+0

怎麼樣?有沒有例子? – cateof

+0

答覆已更新。我不確定我完全理解你的問題。 – Dave

1

那麼如果使用的是導航控制器,你可以得到viewControllers的陣列被推着走:

NSArray *array = self.navigationController.viewControllers; 

,但是這會給你已被推如果是會失敗的視圖控制器從視圖回來即從導航堆棧彈出,因爲在這兩種情況下您的

- (void)viewWillAppear:(BOOL)animated { 
    //find here the name of the calling view 
    } 

將被調用。

1

您可以使用presentingViewController這個,但問題是這將返回視圖控制器的內存地址而不是指針的名稱。

一種解決方案將是一個變量分配給呈現視圖控制器的視圖屬性,然後要求該標籤在你的第二個控制器:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    NSLog(@"%i",[[[self presentingViewController] view] tag]); 
} 

在你的第一個視圖控制器:

[[self view] setTag:(someNSInteger)];