![](/img/trans.png)
[英]Simple iOS Delegate Protocol Not Working With Passing Strings Between View Controllers
[英]Simple Delegate Between View Controller and UIView Isn't Working
因此,当在子视图上按下按钮时,我使用一个简单的委托从主视图控制器访问功能,该子视图作为主视图顶部的覆盖层生成。 由于某种原因,未执行源视图控制器中定义的功能。 我已经做了100次,觉得自己只是在想些愚蠢的事情。 这是代码,这怎么不起作用?
源ViewController.h:
#import <UIKit/UIKit.h>
#import "ProfileSettingsViewController.h"
#import "ImageViewer.h"
@interface ProfileViewController : UIViewController <UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, subViewDelegate>
源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)
{
}
}
目标视图的.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
目标视图的
#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];
}
我搞砸了不是吗?
调试此错误的最佳方法是使用断点,查看调用了什么,未调用什么(并检查您的委托是否设置正确)。 我想说的是,如果您使用的是IB,则您要么忘记了设置代表,要么就忘记了出口。
编辑:好的,在我看来,您的委托属性在错误的类中。 该属性应位于子视图中,并且从超级视图创建该子视图时,应正确设置委托,如下所示:
mySubview.delegate = self;
看起来在您的ProfileViewController.h中,您缺少ImageViewer的声明
@property (nonatomic, weak) ImageViewer *imageViewer;
在您的ProfileViewController.m中,您需要设置委托。
self.imageViewer.delegate = self;
您需要将目标委托设置为self。
ImageViewer *imageViewer = [[ImageViewer alloc] initWithFrame:superView.view.bounds];
imageViewer.delegate = self;
在初始化对象并调用load方法后,如果有一个UIView加载其自身,则可以使用设置委托。
imageViewer.delegate = superView;
其中imageView是新初始化的视图,不要与对象self混淆(self.delegate = superView不相同),其中superView是创建UIView的父视图。
现在我的最后一个问题是,有没有更好的方法来做我所做的事情? 我觉得我已经把情况弄复杂了。
我在完全相同的情况下遇到完全相同的问题。 经过一些头脑风暴后,我发现了问题并成功解决。
问题是UIView对象的范围。 因此,要解决此问题,请在.h文件中创建一个全局视图对象,并将其用作目标对象。
@interface profilePageViewController : parentViewController<PhotoUploadViewDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate,ConnectionsDelegate>
{
PhotoUploadView *photoUploadView;
这将非常肯定,您也可以尝试通过将对象打印到而找到两个不同的对象。一个在初始化时,另一个在委托调用中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.