2012-08-12 64 views
0

我有一個DetailViewController,當選擇Cell時,通過storyboard segues從RootViewController1或RootViewController2推送/輸入DetailViewController。告訴哪個ViewController推送DetailViewController

DetailViewController有一個按鈕IBAction。我可以編程這樣的動作:

如果父ViewController是RootViewController2,則返回。否則,執行操作。 事情是這樣的:

-(IBAction)actionButtonPressed:(id)sender 
{ 
    if (parentViewController == RootViewController2) { 
     return; 
    } 

    //Else this is done: 
    textLabel.text = @"Test"; 
} 

但我不知道如何使它發揮作用,這樣的例子將是巨大的。讓我知道你是否需要更多信息!

編輯:

代碼現在看起來是這樣的:

#import "RootViewController2.h" 

... 

-(IBAction)actionButtonPressed:(id)sender 
{ 
    if([self.parentViewController isKindOfClass:[RootViewController2 class]]) { 
     return; 
    } 

    //Else this is done: 
    textLabel.text = @"Test"; 
} 

但仍是從兩個觀點進行操作。更多建議?

回答

1

就像@Matt提到的,視圖控制器存儲在一個數組中。您可以訪問導航控制器陣列像這樣:

[self.navigationController.viewControllers lastobject ] 
[self.navigationController.viewControllers objectAtIndex:2]; 

You can also get a reference to the parent view controller like this: 
self.parentViewController 
self.presentingViewController 

不管你如何獲得對父級的引用,你還需要有一種方法來比較參考。如果([object isKindOfClass:MyClass class]),你可以像這樣使用自省。但以某種方式(使用視圖控制器數組),您需要一個對每個父對象的對象引用。它是一個棘手的方式去。

另一個可能更簡單的方法是在視圖控制器中設置屬性值,然後在 - (void)prepareForSegue ....塊中繼續執行該屬性值。事情是這樣的:

MyClass *myClass = segue.destinationViewController; 
myClass.myLogicProperty = @"mommy"; 

,並從其他視圖控制器

MyClass *myClass = segue.destinationViewController; 
myClass.myLogicProperty = @"daddy"; 

現在其他SEGUE,當你按下按鈕時,您可以只針對那些值,然後做了正確的事情。

if ([self.myLogicProperty isEqualTo:@"daddy"]) { 
    //take action 
} 
else if ([self.myLogicProperty isEqualTo:@"mommy"]) { 
    //take action 
} 
else { 
//do something if no match 
} 

不知道你的具體需求,我建議後者,並建議不要嘗試使用viewcontrollers數組。

希望有幫助。

1

推送到UINavigationController上的視圖控制器形成堆棧(線性序列)。您可以將該堆棧作爲UINavigationController'sviewControllers陣列獲取。 (您可以參考UINavigationController本身作爲推送視圖控制器的navigationController。)由於此詳細控制器位於堆棧的頂部(堆棧的結尾),因此您想知道的是前一個 - 數組的最後一項。

+0

我知道這是可以做到的,是的,但我需要一個代碼示例如何檢查以前的視圖控制器的名稱是「ViewController2」一樣,我想這一行做:如果(parentViewController == RootViewController2 ){ – ingenspor 2012-08-12 22:02:55

+0

'isKindOfClass:'應該是你正在尋找的方法。 – mAu 2012-08-12 22:10:31

+0

用新代碼更新了我的問題 – ingenspor 2012-08-12 22:23:34

0
#import "RootViewController2.h" 

... 

-(IBAction)actionButtonPressed:(id)sender 
{ 
#define CurrentParentViewController [[self.navigationController viewControllers] objectAtIndex:[[self.navigationController viewControllers] count] - 2] 
if([CurrentParentViewController isKindOfClass:[RootViewController2 class]]) { 
    return; 
} 

//Else this is done: 
textLabel.text = @"Test"; 
} 
相關問題