Einfaches Delegieren Zwischen View-Controller und UIView nicht Funktioniert
So, ich bin mit einem einfachen Delegaten Zugriff auf eine Funktion aus einem Haupt-view-controller bei einem Tastendruck auf eine Untersicht, die generiert wird, als overlay auf der Oberseite des Hauptfenster. Aus irgendeinem Grund wird die Funktion definiert ist, in der source view-controller nicht ausgeführt wird. Ich habe dies getan, 100 mal und das Gefühl, ich bin nur etwas fehlt, doof. Hier ist der code, wie kommen Sie auf diese nicht funktioniert?
Source ViewController ist.h:
#import <UIKit/UIKit.h>
#import "ProfileSettingsViewController.h"
#import "ImageViewer.h"
@interface ProfileViewController : UIViewController <UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, subViewDelegate>
Source 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)
{
}
}
Ziel-Ansicht.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
Ziel-Ansicht.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];
}
Habe ich etwas geschraubt bis ich noch nicht?
- können Sie überprüfen Sie die Delegaten-Adresse in der - (void)captureImage:(id)sender und stellen Sie sicher, dass es den gleichen Wert wie das übergeordnete Ansicht ? Wie verhält sich dies zu der Eigenschaft @property (nonatomic, copy) UIViewController *parentView; definiert in der Untersicht ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der beste Weg, um zu Debuggen, ist die Nutzung von Haltepunkten und sehen, was aufgerufen wird und was nicht (und überprüfen Sie, ob Ihre Stellvertretung ist richtig eingestellt). Von der Spitze von meinem Kopf, ich würde sagen, dass Sie entweder vergaß, den Satz der Stellvertretung ein, oder möglicherweise eine Steckdose an, wenn Sie mit IB.
Edit: Ok, jetzt scheint Es mir, dass Ihre Delegaten-Eigenschaft ist in der falschen Klasse. Diese Eigenschaft sollte in Ihrem Untersicht, und beim erstellen der Untersicht von Ihrem superview, sollten Sie die Stellvertretung richtig, so etwas wie dieses:
Sieht es aus wie in Ihrem ProfileViewController.h Sie vermissen eine Erklärung von ImageViewer
Und in Ihrem ProfileViewController.m Sie müssen den Delegierten.
Müssen Sie das Ziel zu delegieren, um sich selbst.
Wenn Sie einen UIView, die Lasten seiner selbst, nachdem Sie hace initialisiert das Objekt und nannte die load-Methode legen Sie die Delegaten verwenden.
Wo Bildansicht ist die neu initialisierte Ansicht nicht zu verwechseln mit dem Objekt selbst (selbst.delegieren = superView ist nicht das gleiche) und wo superView ist die ist die übergeordnete Ansicht der Erstellung der UIView.
Nun meine Letzte Frage wäre, gibt es eine bessere Weise, das zu tun, was ich getan habe? Ich habe das Gefühl, komplizierte die situation.
Ich habe genau das gleiche problem in exakt demselben Szenario.
Nach einigen Brainstorming fand ich das Problem und erfolgreich gelöst.
Das problem ist der Umfang der UIView-Objekt. So beheben Sie dieses erstellen Sie eine Globale Objekt-Blick .h-Datei und verwenden Sie es als Ihr Zielobjekt.
Und es wird funktionieren, ganz sicher, Man kann auch versuchen, durch den Druck das Objekt und finden Sie zwei verschiedene Objekte.Eine zum Zeitpunkt der init und anderen Delegaten-Aufruf.