2013-11-26 53 views
0

我有一個基於UINavigationController的故事板的應用程序。 我有三個視圖A,B,C。當用戶點擊相機按鈕時,我在視圖A中啓動相機,在成功點擊圖像並獲取該圖像後,我正在調用繼續前進到B,這是一個PUSH循環。在視圖B中,我顯示的圖像具有處理圖像的選項。當用戶選擇處理它時,會用PUSH segue查看C.現在我想要的是處理後的圖像應該發回到查看B,我將顯示處理後的圖像。如何在彈出視圖後將UIImage傳遞迴視圖

問題是當我使用指向B(delegate)應用程序崩潰的指針將圖像從C傳回B時。 代碼是如下

鑑於乙傳遞圖片查看C:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // Make sure your segue name in storyboard is the same as this line 
    if ([[segue identifier] isEqualToString:@"Segue1"]) 
    { 
     // Get reference to the destination view controller 
     CViewController *vc = [segue destinationViewController]; 

     // Pass any objects to the view controller here, like... 
     vc.imageChosen = imageChosen; 
     vc.delegate = self; 
    } 
} 

delegateCViewController聲明如下:

@property (nonatomic,retain) id delegate; 

鑑於控制器C返回圖像回來,我正在做以下

-(IBAction)actionBack 
{ 
    BViewController *vc = (BViewController *)delegate; 
    vc.imageChosen = imageCropped; 

    [self.navigationController popViewControllerAnimated:TRUE]; 

} 

actionBack是行上在BViewController.h附連到背上視圖C鈕選擇

應用與EXC_BAD_ACCESS崩潰這是如下

@property (nonatomic,retain) UIImage *imageChosen; 

我已經檢查imageCropped具有我試圖保存到庫以及有效數據imageCropped是與以下聲明

@property (nonatomic,retain) UIImage *imageCropped; 

我不明白這是爲什麼崩潰和援助將是CViewController屬性讚賞。

+1

1)你能提供應用程序崩潰日誌嗎? 2)@property(nonatomic,retain)id delegate; - 這是不好的做法,使用assaign或弱修飾符代替 – frankWhite

+0

沒有問題不是委託它給我訪問視圖控制器權利它是imagechosen屬性導致訪問不良 –

+0

@vishal實際上,您描述的錯誤_can_可能是'delegate'的問題(以及你在'actionBack'中對'delegate' ivar的使用有點可疑......通常你會參考getter方法,或者你會參考帶有下劃線的ivar) 。底線,你沒有向我們展示足夠的可能性,否認「代表」可能不成問題。 – Rob

回答

1

一對夫婦的想法:

  1. 你建議你在B中定義imageChosen線得到一個EXC_BAD_ACCESS

    @property (nonatomic,retain) UIImage *imageChosen; 
    

    這不太可能。您沒有在您定義財產的行上獲得EXC_BAD_ACCESS,而是您嘗試使用該財產或其相關ivar的行。你大概可以在多個地方參考這個,所以你應該確定有問題的代碼行。我們不是猜測EXC_BAD_ACCESS發生在哪條線上,而應該是turn on exception breakpoints,或仔細查看堆棧跟蹤以準確識別異常發生的位置。

  2. 既然你在手動亂搞保留和釋放的代碼,你真的應該:

    • 運行通過靜態分析代碼(Xcode的「產品」菜單上的「分析」),和確保你修復了你到達的所有警告。

    • 暫時turn on zombies,這樣你就可以正確識別任何超限的物品。

  3. 您沒有告訴我們您如何定義delegate屬性。我只提到因爲你設置了delegate屬性,但是C繼續使用delegate實例變量(並且現代約定是你的ivars應該具有前導下劃線,例如_delegate)。您可以按照您在代碼段中建議的方式來執行此操作,但如果操作不正確,則容易受到可能導致您描述的崩潰的特定系列條件的影響。我個人建議(a)你確定你沒有明確宣佈伊娃爲delegate(只需定義屬性並讓伊娃被合成); (b)排除任何明確的@synthesize聲明(但讓它自動合成);和(c)在可能的情況下使用訪問器方法。


完全無關的崩潰,但你有一個保留週期在這裏。 C中返回B的delegate應該是assign,而不是retain(或者如果您使用的是ARC,則爲weak而不是strong)。您將按照當前編寫的方式保留一個循環,因此會泄漏。

此外,作爲一個很好的風格問題,你也應該使用一個協議,但這並不重要。

+0

所有這些點都非常有意義,謝謝我將檢查所有這些。 –

0

我最好在委託中使用一些方法向它提供圖像。

事情是這樣的:

if (_delegate && [_delegate respondsToSelector:@selector(passImage:)]) 
{ 
    [_delegate passImage:imageCropped]; 
} 

,並委託自己:

- (void)passImage:(UIImage *)img 
{ 
    // do something 
} 

希望它會幫助你。

+0

代表是不是一個問題我已經明確提到 –

+0

我已經使用了一個使用委託從這裏的方法現在http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers我傳遞圖像從視圖C查看B成功地將它分配給一個變量,但每當我嘗試訪問該圖像時,它都會再次顯示。不良訪問線程1. –

相關問題