2012-02-24 228 views
1

我的故事板中有三個viewController,每個視圖都有三個viewController類。從我的主視圖控制器,我打開一個'模態'型的segue導航視圖控制器,這是一個多步驟的形式,它有兩個視圖。當用戶在最後一個(這是第二個)視圖中點擊'完成'時,該模式被解散並且用戶返回到主屏幕。通過視圖控制器將代理傳遞給視圖控制器

我正在與代表這樣做。並且完成按鈕的代碼也位於委託中,並放置在主viewController的實現文件中。在實現這個時,我將主視圖中的委託傳遞給導航的第一個視圖,然後從第一個視圖點擊'next'後,我將委託傳遞給第二個(最後一個)視圖(它具有完成按鈕)。

從主委託的傳遞到導航的第一頁是這樣的:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"CreateCast"]) 
    { 
     UINavigationController *navigationController = segue.destinationViewController; 
     CreateCastStepOneVC *createCastStepOneVC = [[navigationController viewControllers] objectAtIndex:0]; 
     createCastStepOneVC.delegate = self; 
    } 
} 

代表從導航的第一視圖第二視圖傳球是這樣的:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"ToCastStepTwo"]) 
    { 
     CreateCastStepTwoVC *createCastStepTwoVC = 
     segue.destinationViewController; 
     createCastStepTwoVC.delegate = delegate; 
    } 
} 

事情完成好,代表正按要求開展工作。但警告彈出這是一個問題:

過客「_weak ID」到 不兼容的類型「ID」

財產申報在第一導航視圖的參數是這樣的:

@property (nonatomic, weak) id <CreateCastStepOneVCDelegate> delegate; 

屬性聲明第二導航視圖是這樣的:

@property (nonatomic, weak) id <CreateCastStepTwoVCDelegate> delegate; 

回答

1

你是如何在CreateCastStepTwoVC上聲明委託物業的?另外, 是符合您定義的協議的代表嗎?

針對受委託屬性的典型聲明會是這個樣子:

@property (nonatomic, __unsafe_unretained) id<MyProtocol> delegate; 

,或者如果你不使用的協議(不推薦):

@property (nonatomic, __unsafe_unretained) id delegate; 

編輯:

看到您的財產聲明,您需要根據此問題將weak更改爲__unsafe_unretainedRecommended way to declare delegate properties with ARC

+0

這種通過視圖控制器傳遞委託的方式甚至推薦?或者還有其他更好的方法嗎? – Firdous 2012-02-24 11:17:55

+0

我看不出沒有理由不使用代表來做到這一點。那個siad,我沒有在segues的storyboard上工作太多,所以我不完全熟悉那裏的最佳實踐。 – 2012-02-24 11:34:19

0

您可以子類UINavigationController並在您的子類中添加一個自定義協議。採用這種方法,您將能夠從您的導航控制器內的所有視圖控制器呼叫您的代表。例如,這是我以前做的方式:

@class CustomNavigationController; 

@protocol CustomNavControllerDelegate <NSObject> 

- (void)editImageController:(CustomNavControllerDelegate *)controller 
didFinishPickingMediaWithInfo:(NSDictionary *)info; 
- (void)editImageControllerDidCancel:(CustomNavControllerDelegate *)controller; 

@end 

@interface CustomNavigationController : UINavigationController 

@property (nonatomic, weak) id <UINavigationControllerDelegate, CustomNavControllerDelegate> delegate; 

@end 

在這個例子中,我實現了一個類似的功能到UIImagePickerController。事實上,如果您查看它的聲明文件,這就是選擇器的實現方式。

相關問題