2013-05-08 25 views
5

So verwende ich einen einfachen Delegaten, um auf eine Funktion von einem Hauptansicht-Controller zuzugreifen, wenn eine Schaltfläche auf eine Unteransicht gedrückt wird, die als Overlay über der Hauptansicht generiert wird . Aus irgendeinem Grund wird die Funktion, die im Quellansicht-Controller definiert ist, nicht ausgeführt. Ich habe das 100 Mal gemacht und fühle mich, als würde ich etwas Dummes verpassen. Hier ist der Code, wie kommt das nicht funktioniert?Simple Delegate zwischen View Controller und UIView funktioniert nicht

Quelle ViewController's.h:

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

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

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

Ich habe etwas vermasselt, nicht wahr?

+0

können Sie die Delegate-Adresse überprüfen in - (void) captureImage: (ID) Absender und überprüfen, dass es den gleichen Wert wie die übergeordnete Ansicht ist? Wie vergleicht das mit der Eigenschaft @property (nichtatomare, kopieren) UIViewController * parentView; definiert in der Unteransicht? – Alex

Antwort

5

Der beste Weg, um dies zu debuggen, ist die Verwendung von Haltepunkten und sehen, was aufgerufen wird, und was nicht (und prüfen, ob Ihr Delegat richtig eingestellt ist). Von der Spitze meines Kopfes würde ich sagen, dass Sie entweder den Delegierten vergessen haben oder möglicherweise eine Steckdose, wenn Sie IB benutzen.

Edit: Ok, es scheint mir jetzt, dass Ihre Vertreter-Eigenschaft in der falschen Klasse ist. Diese Eigenschaft sollte in Ihrem subview sein, und wenn das subview von Ihrem Superview erstellen, sollten Sie die Delegaten richtig eingestellt ist, so etwas wie diese:

mySubview.delegate = self; 
+0

Was ist erforderlich, um den Delegaten festzulegen? – ScottOBot

+0

Ich habe den Kommentar bearbeitet, es scheint mir, dass Sie die Eigenschaft delegate in die falsche Klasse platziert haben. – Adis

+0

Die Delegate-Eigenschaft befindet sich bereits in der Unteransicht, die Unteransicht ist das Ziel des ImageViewer. Der ImageViewer fügt sein Selbst als Unteransicht hinzu, wenn eine Funktion – ScottOBot

0

Es sieht aus wie in Ihrem ProfileViewController.h Sie eine Erklärung von Imageviewer fehlen

@property (nonatomic, weak) ImageViewer *imageViewer; 

Und in Ihrem ProfileViewController.m müssen Sie den Delegaten festlegen.

self.imageViewer.delegate = self; 
+0

Gibt es eine Möglichkeit für mich, den Code zu posten, denke ich, weil ich die Subview auf eine wirklich seltsame Weise lade. Tipps, wie man es richtig macht, würden sehr geschätzt werden. – ScottOBot

+0

Ich habe es nur als eine lokale Variable verwendet, wenn ich es als eine Eigenschaft (nicht atomare, schwache) setzen ImageViewer * imageViewer lädt nicht Eigenschaft (nicht atomisch, stark) ImageViewer * ImageViewer funktioniert, aber ich der Delegat funktioniert immer noch nicht @ VGreuenhagen – ScottOBot

0

Sie müssen den Zieldelegaten auf self setzen.

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

Ich weiß, erhalten Sie die folgende Laufzeit Ausnahme - [ImageViewer PhotoFromSubview]: unerkannter Selektor an Instanz 0x1c585ff0 gesendet @MarkM – ScottOBot

0

Wenn Sie eine UIView, die seine Selbst lädt, nachdem Sie das Objekt initialisiert hace und so genannte Load-Methode Sie die Delegaten festgelegt durch die Verwendung.

imageViewer.delegate = superView; 

Wo Imageview die neu initialisiert Ansicht ist, nicht mit dem Objekt selbst verwechselt werden (self.delegate = superview ist nicht das gleiche), und wo die superview ist die Mutteransicht, die die UIView zu schaffen.

Jetzt meine letzte Frage wäre, gibt es einen besseren Weg, um zu tun, was ich getan habe? Ich habe das Gefühl, dass ich die Situation überkompliziert habe.

+0

Ich tatsächlich am Ende mit dem Init, eine Menge Sachen, die ich tat in der LoadImageIntoViewer-Funktion machte die Dinge viel einfacher gemacht ! – ScottOBot

0

Ich habe genau das gleiche Problem in genau demselben Szenario. Nach einigen Brainstorming fand ich das Problem und löste erfolgreich.

Das Problem ist der Umfang des UIView-Objekts. Um dies zu beheben, erstellen Sie ein globales Objekt in der .h-Datei und verwenden Sie es als Ihr Zielobjekt.

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

Und es wird sehr sicher arbeiten, können Sie auch versuchen, durch den Druck des Objekts und Sie werden zwei verschiedene objects.One zum Zeitpunkt der init und andere in Delegat Anruf finden.

Verwandte Themen