2013-05-08 69 views
5

所以我使用一個簡單的委託從一個主視圖控制器訪問一個函數,當在主視圖之上生成一個疊加層的子視圖上按下一個按鈕時。由於某些原因,在源視圖控制器中定義的函數未被執行。我做了這100次,感覺我只是想念一些愚蠢的東西。這裏是代碼如何不起作用?視圖控制器和UIView之間的簡單委託不工作

源ViewController's.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) 
    { 

    } 
} 

目的地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 

目的地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]; 
} 

我搞砸了不是嗎?

+0

你可以在 - (void)captureImage:(id)發件人中檢查委託地址,並確認它與父視圖的值相同嗎?如何比較屬性@property(非原子,複製)UIViewController * parentView;在子視圖中定義? – Alex 2013-05-08 22:21:08

回答

5

調試這個最好的方法是使用斷點,看看被調用什麼,什麼不是(並檢查你的委託是否正確設置)。在我頭頂,我會說你或者忘記了那個代表團,或者如果你在使用IB,可能是一個出口。

編輯:好吧,現在看來,你的委託屬性是在錯誤的類。該屬性應該在你的子視圖,並創建從上海華盈是子視圖的時候,你應該正確設置委託,這樣的事情:

mySubview.delegate = self; 
+0

設置委託需要什麼? – ScottOBot 2013-05-08 22:09:13

+0

我編輯了評論,在我看來,你把委託屬性放在錯誤的類中。 – Adis 2013-05-08 22:12:15

+0

委託屬性已經在子視圖中,子視圖是ImageViewer的目標。 ImageViewer在調用函數時將自己添加爲子視圖 – ScottOBot 2013-05-08 22:25:33

0

它看起來就像在你ProfileViewController.h你缺少圖像瀏覽器的聲明

@property (nonatomic, weak) ImageViewer *imageViewer; 

而在你的ProfileViewController.m中,你需要設置委託。

self.imageViewer.delegate = self; 
+0

有沒有辦法讓我發佈代碼我認爲這是因爲我加載子視圖是一種非常奇怪的方式。如何正確地做到這一點將不勝感激。 – ScottOBot 2013-05-08 22:41:35

+0

當我把它作爲一個屬性(非原子,弱)ImageViewer * imageViewer它不加載屬性(非原子,強大)ImageViewer * imageViewer工作,但我委託仍然無法工作@ VGruenhagen – ScottOBot 2013-05-08 23:04:08

0

您需要將目標代理設置爲self。

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

我知道得到下面的運行時異常 - [ImageViewer photoFromSubview]:無法識別的選擇器發送到實例0x1c585ff0 @MarkM – ScottOBot 2013-05-08 23:30:05

0

當你有一個UIView在你初始化對象並調用load方法後加載它自己,你可以使用設置委託。

imageViewer.delegate = superView; 

凡ImageView的是新初始化的視圖不與對象自混淆(self.delegate =上海華是不一樣),並且其中的SuperView是是創建了UIView的父視圖。

現在我的最後一個問題是有沒有更好的方法來做我所做的事情?我覺得我已經過了複雜的情況。

+0

我實際上結束了使用Init做了很多東西,我在LoadImageIntoViewer函數中做的事情使事情變得更容易! – ScottOBot 2013-05-11 20:32:12

0

我在完全相同的情況下有完全相同的問題。 做了一些腦力激盪後,我發現問題併成功解決。

問題是UIView對象的範圍。因此,要解決此問題,請在.h文件中創建全局對象並將其用作目標對象。

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

,它會工作非常肯定,你也可以嘗試通過打印對象,你會發現在委託調用init和其他兩個不同的時間objects.One。