繁体   English   中英

View Controller和UIView之间的简单委托无法正常工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM