2013-03-18 117 views
1

我試圖從不同類別的呼叫performSegueWithIdentifier這是NSObject類表演賽格瑞,我收到此錯誤:從另一個類

終止應用程序由於未捕獲的異常「NSInvalidArgumentException」,原因是:

'Receiver (<DerinlikView: 0x95b1ac0>) has no segue with identifier 'DerinlikToPali'' 

我的代碼是:

的Class1(NSObject的):

DerinlikView *derinlik = [DerinlikView alloc]; 
    [derinlik performSegue]; 

的Class2(UIViewController中):

- (void) performSegue 
{ 
    [self performSegueWithIdentifier:@"DerinlikToPali" sender:self]; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"DerinlikToPali"] ) 
    { 
     Palinolojik *pali = segue.destinationViewController; 
    } 
} 
+0

只是一個想法你檢查在故事板的標識符,它是你的標識正確的拼寫?我不得不改變我的評論,因爲我在第一部分錯了。只需檢查故事板中的標識符,看看它是否是正確的。 – 2013-03-18 13:41:34

+0

是的我試圖從NSObject類去viewcontroller。我試圖把它放到NSObject類也沒有工作。我把segue代碼放在NSObject類中。 – birdcage 2013-03-18 13:45:11

+0

你是否檢查過將視圖控制器類連接到下一個視圖的標識符?該segue標識符可能是問題。並且在你的segue方法中,Palinolojik是segue的目的地,但是在你的ns對象類中,標識符與derinlikview相關。目標視圖應該是其中的一個,而不是兩個。 – 2013-03-18 13:46:54

回答

2

我認爲沒有錯,你的故事板或您的塞格斯,什麼不是。當你分配你的Class2它無法找到連接到您的視圖中的SEGUE一個新的視圖控制器指針

問題必須是此行=

DerinlikView *derinlik = [DerinlikView alloc]; 

一個解決辦法是通過您發起的Class2到NSObject類的指針。

在Class1的。H:

@interface Class1 : NSObject 
{ 
    Class2 *viewController; 
} 

@property (nonatomic,strong) Class2 *viewController; 

在class1.m

@synthesize viewController; 

[self.viewController performSegue]; 

在class2.m:

Class1 *callNsObject= [[Class1 alloc] init]; 
UIViewController *currentVC=self;//this is the part you need the pass current viewcontrollers pointer to your nsobject class depends on your project thee are multiple ways of doing it. 
callNsObject.viewController=currentVC; 

重要:我不知道你的Class2視圖 - 控制的層次結構,以便在該行UIViewController *currentVC=self;你必須將self更改爲您當前的視圖控制器指針。

例如,如果它是一個基於導航的應用程序,你可以得到當前視圖控制器, UIViewController *currentVC = self.navigationController.visibleViewController;

而且我假設你的Class2的觀點是壓入堆棧你打電話給你的Class1方法之前

+0

它沒有觸發Class2中的performSegue方法。我應該在哪裏放置這段代碼 - > Class1 * callNsObject = [[Class1 alloc] init]; UIViewController * currentVC = self; //這是你需要的部分傳遞當前viewcontrollers指向你的nsobject類的指針取決於你的項目你有多種方式做它。 callNsObject.viewController = currentVC; – birdcage 2013-03-18 15:04:30

+0

這是一個示例,當您調用您的Class1(NSObject)將Class2的當前viewcontroller指針傳遞給您的Class1時。你需要把它放在你打電話給你的Class1方法之前 – 2013-03-18 15:21:33

+0

最後它的工作完美..非常感謝你的幫助! – birdcage 2013-03-18 15:30:37

0

錯誤記說: 「DerinlikToPali」 在故事板沒有被發現。

轉到您的故事板,選擇SEGUE並檢查它的屬性檢查器(菜單視圖 - 工具 - 顯示屬性檢查器)。確保標識符與您在performSegueWithIdentifier中使用的字符串相同。

更新(看着SampleProject後):

  • SampleClass *樣品= [SampleClass頁頭]應該是「黃金初始化」,在一般情況下,讓你不僅分配內存,而且還完成了完整的對象初始化。
  • SampleClass methodToSegue()如你預期不創建視圖控制器對象。首先看到上面的「alloc init」,但在這種情況下,你需要更多(下面)。否則,你將沒有一個有效的UIViewController對象。請注意,你必須先在storyBoard上給它一個名字,以便你可以創建它(使用該名稱)。替代方案是使用XIB代替故事板,在這種情況下使用initWithNibName:束:

    的ViewController * VC = [[UIStoryboard storyboardWithName:@ 「MainStoryboard_iPad」 束:無] instantiateViewControllerWithIdentifier:@ 「的viewController」];

  • 最大的問題是邏輯的,我希望它只在這個SampleProject中:objectA被創建,創建objectB,它創建objectA並調用它的方法...除了objectA的創建再次創建objectB - >我們有一個永遠循環和東西會崩潰。

不管怎麼說,我更新的答案是,你對象創建未完成你試圖觸發SEGUE之前。特別是「ViewController」還不是在storyBoard中定義的實際UIViewController,因此沒有預期的繼續。

+0

我知道你的意思,但它在那裏。當我從Class2中調用它時,它就可以工作。但我試圖從不同的課程中調用同一個segue。這是我的問題.. – birdcage 2013-03-18 14:31:00

7

我有同樣的問題,我設法通過使用NSNotificationCenter解決它。

在NSObject類.m文件我添加:

[[NSNotificationCenter defaultCenter] postNotificationName:@"performsegue" 
                object:nil]; 

在的ViewController類.m文件 -

1.In的 - (無效)viewDidLoad中我加入:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(performsegueNotification:) 
              name:@"performsegue" 
              object:nil]; 

2.In的 - (無效)viewDidUnload我加入:

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

3.Created方法performsegueNotification:

-(void)performsegueNotification:(NSNotification *) notif 
{ 

    [self performSegueWithIdentifier: @"PresentView" sender:self]; 

}