2013-05-08 8 views
5

Używam prostego delegata, aby uzyskać dostęp do funkcji z głównego kontrolera widoku po naciśnięciu przycisku na wyskakującym widoku, który jest generowany jako nakładka na górze głównego widoku . Z jakiegoś powodu funkcja zdefiniowana w kontrolerze źródłowym nie jest wykonywana. Zrobiłem to 100 razy i czuję, że po prostu brakuje mi czegoś głupiego. Oto kod, dlaczego to nie działa?Prosty delegat między kontrolerem widoku a UIView nie działa

Źródło ViewController's.h:

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

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

Źródło viewController.m:

#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) 
    { 

    } 
} 

Destination 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 

Destination 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]; 
} 

Coś spieprzyłem, prawda?

+0

Czy możesz sprawdzić adres delegata w - (void) captureImage: (id) nadawcy i sprawdzić, czy ma tę samą wartość, co widok nadrzędny? Jak to porównać do właściwości @property (nonatomic, copy) UIViewController * parentView; zdefiniowane w wywiadzie? – Alex

Odpowiedz

5

Najlepszym sposobem debugowania tego jest użycie punktów przerwania i zobaczenie, co zostanie wywołane, a co nie (i sprawdzenie, czy delegat jest odpowiednio ustawiony). Z góry mojej głowy, powiedziałbym, że albo zapomniałeś setu delegata, albo ewentualnie outlet, jeśli używasz IB.

Edycja: OK, Wydaje mi się, że twoja własność delegata jest w niewłaściwej klasie. Że nieruchomość powinna mieć w swojej podrzędny, a podczas tworzenia tej podrzędny z Twojego SuperView, należy ustawić delegata prawidłowo, coś takiego:

mySubview.delegate = self; 
+0

Co jest wymagane do ustawienia delegata? – ScottOBot

+0

Edytowałem komentarz, wydaje mi się, że umieściłeś właściwość delegata w niewłaściwej klasie. – Adis

+0

właściwość delegata jest już w widoku podrzędnym, a widok podrzędny jest miejscem docelowym programu ImageViewer. ImageViewer dodaje siebie jako widok podrzędny, gdy funkcja nazywa się – ScottOBot

0

to wygląda w ProfileViewController.h brakuje deklarację ImageViewer

@property (nonatomic, weak) ImageViewer *imageViewer; 

I na swoim profilu ProfileViewController.m musisz ustawić delegata.

self.imageViewer.delegate = self; 
+0

Czy istnieje sposób dla mnie, aby opublikować kod Myślę, że to dlatego, że ładuję subview naprawdę dziwny sposób. Wskazówki, jak to zrobić poprawnie, byłyby bardzo mile widziane. – ScottOBot

+0

Używałem go tylko jako zmiennej lokalnej, gdy umieściłem go jako właściwość (nieatomowe, słabe) ImageViewer * imageViewer nie ładuje właściwości (nieatomowe, silne) ImageViewer * imageViewer działa, ale ja delegat nadal nie działa @ VGruenhagen – ScottOBot

0

Musisz ustawić delegata docelowego na siebie.

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

Wiem, uzyskać następujący wyjątek w czasie wykonywania - [ImageViewer photoFromSubview]: nierozpoznany selektor wysłany do instancji 0x1c585ff0 @MarkM – ScottOBot

0

Gdy masz UIView, który ładuje się po tym, jak hace zainicjował obiekt i wywołał metodę ładowania, ustawiasz delegata za pomocą.

imageViewer.delegate = superView; 

przypadku ImageView jest nowo zainicjowany widok nie należy mylić z siebie przedmiot (self.delegate = Superview nie jest to to samo) i gdzie Superview jest to widok dominująca tworzenia UIView.

Moje ostatnie pytanie brzmi: czy istnieje lepszy sposób na zrobienie tego, co zrobiłem? Czuję, że zbytnio skomplikowałem sytuację.

+0

Faktycznie skończyłem używać Init, aby zrobić wiele rzeczy, które robiłem w funkcji LoadImageIntoViewer, co znacznie ułatwiło sprawę ! – ScottOBot

0

Mam dokładnie ten sam problem w dokładnie tym samym scenariuszu. Po wykonaniu burzy mózgów znalazłem problem i udało się go rozwiązać.

Problem stanowi zasięg obiektu UIView. Aby rozwiązać ten problem, utwórz globalny obiekt widoku w pliku .h i użyj go jako obiektu docelowego.

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

i będzie działać bardzo pewny, można także spróbować drukując obiektu do i znajdziesz dwa różne objects.One w momencie startowych i innych w wywołaniu delegata.

Powiązane problemy