2013-05-08 15 views
5

Quindi sto utilizzando un delegato semplice per accedere a una funzione da un controller di visualizzazione principale quando un pulsante viene premuto su una sottoview che viene generata come sovrapposizione nella parte superiore della vista principale . Per qualche motivo, la funzione definita nel controller della vista sorgente non viene eseguita. L'ho fatto 100 volte e mi sento come se mi mancasse qualcosa di stupido. Ecco il codice come mai non funziona?Il delegato semplice tra controller di visualizzazione e UIView non funziona

Fonte ViewController's.h: viewController.m

#import <UIKit/UIKit.h> 
#import "ProfileSettingsViewController.h" 
#import "ImageViewer.h" 

@interface ProfileViewController : UIViewController <UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, subViewDelegate> 

Fonte:

#import <Parse/Parse.h> 
#import <QuartzCore/QuartzCore.h> 
#import "ImageViewer.h" 
#import "ProfileViewController.h" 

@interface ProfileViewController() <UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, subViewDelegate> 

@end 

//where the ImageViewer object is defined  
@implementation ProfileViewController 
{ 
    NSMutableArray *dataArray; 
    ImageViewer *loadImageViewer; 
} 

//where the UIView is initialized 
- (void) handleImageTap:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if ([gestureRecognizer view] == _profilePic) 
    { 
     loadImageViewer = [ImageViewer alloc]; 
     [loadImageViewer loadImageIntoViewer:self imageToLoad:_profilePic.image]; 
    } 
    else if ([gestureRecognizer view] == _coverPhoto) 
    { 

    } 
} 

Destinazione View's.h

#import <UIKit/UIKit.h> 
#import <QuartzCore/QuartzCore.h> 

@protocol subViewDelegate 
-(void)photoFromSubview:(id)sender; 
@end 

@interface ImageViewer : UIView 

@property (nonatomic, assign) id <subViewDelegate> delegate; 
@property (nonatomic, copy) UIImage *mainImage; 
@property (nonatomic, copy) UIViewController *parentView; 

- (void)fromCameraRoll; 
- (void)takePhoto; 
- (void)removeImageViewer; 
- (void)captureImage:(id)sender; 
- (void)uploadPhoto:(id)sender; 
- (UIImage *)addBackground; 
- (ImageViewer *)loadImageIntoViewer:(UIViewController *)superView imageToLoad:(UIImage *)imageToLoad; 

@end 

Destinazione View's.m

#import "ImageViewer.h" 

@implementation ImageViewer : UIView 

//synthesize properties 
@synthesize mainImage = _mainImage; 
@synthesize parentView = _parentView; 

//initialize the image viewer 
- (ImageViewer *)loadImageIntoViewer:(UIViewController *)superView imageToLoad:(UIImage *)imageToLoad 
{ 
    //create a new view with the same frame size as the superView 
    ImageViewer *imageViewer = [[ImageViewer alloc] initWithFrame:superView.view.bounds]; 
    _mainImage = imageToLoad; 
    _parentView = superView; 

    //if something's gone wrong, abort! 
    if(!imageViewer) 
    { 
     return nil; 
    } 

    //add all components and functionalities to the program 
    UIImageView *background = [[UIImageView alloc] initWithImage:[imageViewer addBackground]]; 
    background.alpha = 0.85; 
    [imageViewer addSubview:background]; 
    [imageViewer addSubview:[imageViewer addImageToView:_mainImage superView:superView.view]]; 
    [imageViewer addSubview:[imageViewer addButtonToView:(superView.view.bounds.origin.x + 10.0) yPos:(superView.view.bounds.origin.x + 10.0) buttonAction:@selector(back:) buttonTitle:@"Back"]]; 
    [imageViewer addSubview:[imageViewer addButtonToView:(superView.view.bounds.origin.x + 10.0) yPos:((superView.view.center.y/2) + 270.0) buttonAction:@selector(captureImage:) buttonTitle:@"Camera"]]; 
    [imageViewer addSubview:[imageViewer addButtonToView:(superView.view.bounds.origin.x + 105.0) yPos:((superView.view.center.y/2) + 270.0) buttonAction:@selector(uploadPhoto:) buttonTitle:@"Upload"]]; 
    [imageViewer addSubview:[imageViewer addButtonToView:(superView.view.bounds.origin.x + 200.0) yPos:((superView.view.center.y/2) + 270.0) buttonAction:@selector(rotatePhoto:) buttonTitle:@"Rotate"]]; 
    [superView.view addSubview:imageViewer]; 

    return imageViewer; 
} 

//call delegate method 
- (void)captureImage:(id)sender 
{ 
    [self.delegate photoFromSubview:self]; 
} 

Ho incasinato qualcosa, vero?

+0

è possibile controllare l'indirizzo delegato in - (void) captureImage: (id) mittente e verificare che sia lo stesso valore della vista padre? Come si confronta con la proprietà @property (nonatomic, copy) UIViewController * parentView; definito nella sottoview? – Alex

risposta

5

Il modo migliore per eseguire il debug è utilizzare i punti di interruzione e vedere cosa viene richiamato e cosa no (e controllare se il proprio delegato è impostato correttamente). In cima alla mia testa, direi che hai dimenticato il set del delegato o forse uno sbocco se stai usando IB.

Modifica: Ok, ora mi sembra che la proprietà del delegato sia nella classe sbagliata. Che la proprietà dovrebbe essere nella vostra visualizzazione secondaria, e durante la creazione di che visualizzazione secondaria dal superview, si dovrebbe impostare il delegato correttamente, qualcosa di simile:

mySubview.delegate = self; 
+0

Cosa è necessario per impostare il delegato? – ScottOBot

+0

Ho modificato il commento, mi sembra che hai inserito la proprietà delegate nella classe sbagliata. – Adis

+0

la proprietà delegato è già nella sottoview la sottoview è la destinazione ImageViewer. ImageViewer aggiunge il proprio sé come vista secondaria quando una funzione è chiamata – ScottOBot

0

Sembra che nella tua ProfileViewController.h vi manca una dichiarazione di ImageViewer

@property (nonatomic, weak) ImageViewer *imageViewer; 

E nel tuo ProfileViewController.m è necessario impostare il delegato.

self.imageViewer.delegate = self; 
+0

C'è un modo per pubblicare il codice penso che sia perché sto caricando la sottoview in un modo davvero strano. Suggerimenti su come farlo correttamente sarebbe molto apprezzato. – ScottOBot

+0

L'ho usato solo come variabile locale quando l'ho inserito come proprietà (non anatomica, debole) ImageViewer * imageViewer non carica la proprietà (non anatomica, forte) ImageViewer * imageViewer funziona ma io il delegato ancora non funziona @ VGruenhagen – ScottOBot

0

È necessario impostare il delegato di destinazione su sé.

ImageViewer *imageViewer = [[ImageViewer alloc] initWithFrame:superView.view.bounds]; 
imageViewer.delegate = self; 
+0

So ottenere la seguente eccezione di run time - [ImageViewer photoFromSubview]: selettore non riconosciuto inviato all'istanza 0x1c585ff0 @MarkM – ScottOBot

0

Quando si ha un UIView che carica la sua auto dopo le lepri inizializzato l'oggetto e ha chiamato il metodo di carico si imposta il delegato utilizzando.

imageViewer.delegate = superView; 

Dove IMAGEVIEW è la vista appena inizializzato da non confondere con sé oggetto (self.delegate = Superview non è lo stesso) e dove Superview è la è la vista padre creando UIView.

Ora la mia ultima domanda sarebbe: c'è un modo migliore per fare ciò che ho fatto? Mi sento come se avessi complicato la situazione.

+0

In realtà ho finito con l'utilizzo di Init per fare un sacco di cose che stavo facendo nella funzione LoadImageIntoViewer ha reso le cose molto più facili ! – ScottOBot

0

Ho lo stesso identico problema nello stesso identico scenario. Dopo aver fatto un brain storming ho trovato il problema e risolto con successo.

Il problema è l'ambito dell'oggetto UIView. Pertanto, per risolvere questo problema, creare un oggetto di visualizzazione globale nel file .h e utilizzarlo come oggetto di destinazione.

@interface profilePageViewController : parentViewController<PhotoUploadViewDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate,ConnectionsDelegate> 
{ 
    PhotoUploadView *photoUploadView; 

E funzionerà molto sicuro, si può anche provare a stampando l'oggetto e troverete due objects.One diversi al momento della init e altri in call delegato.