2010-11-21 85 views
3

我創建了這個測試案例作爲我的問題的一個簡單例子。正確實施代表和協議

  • 的AppDelegate中初始化TestViewController並將其添加到
  • 的TestViewController初始化TestView的窗口,並使其
  • 的TestView初始化TestSubView,並增加了它作爲一個子視圖

視圖我的目標是讓TestSubView通過一個委託,訪問TestViewController的方法&變量。在這個例子中,TestSubView通過touchesBegan或touchesMoved訪問方法。

請幫忙。謝謝。

編輯:仍然無法正常工作,雖然沒有更多的錯誤。我做了什麼:將協議定義移動到單獨的文件並導入它,保留以進行分配,並在頭部的開頭刪除了@protocol TestDelegate聲明。

我認爲我的問題是我不分配TestViewController.m中的委託,如果這是問題,我該怎麼做?

TestViewController.h

#import <UIKit/UIKit.h> 

@interface TestViewController : UIViewController <TestDelegate> { 

    int number; 
} 

-(void)assignNumber:(int)value; 
-(void)displayNumber; 

@property int number; 

@end 

移到protocol.h和進口在需要的地方

@protocol TestDelegate 

-(void)assignNumber:(int)value; 
-(void)displayNumber; 

@end 

TestViewController.m

#import "TestViewController.h" 
#import "TestView.h" 

@implementation TestViewController 

@synthesize number; 

- (void)loadView { 
    TestView *myView = [[TestView alloc] initWithFrame:CGRectMake(0,0,320,480)]; 
    self.view = myView; 
    [myView release]; 
} 

-(void)assignNumber:(int)value { 
    NSLog(@"Number Assigned"); 
    number = value; 
} 

-(void)displayNumber { 
    NSLog(@"%i",number); 
} 

TestSubView.h

#import <UIKit/UIKit.h> 
#import "TestViewController.h" 


@interface TestSubView : UIView { 

    id<TestDelegate> delegate; 
} 

@property (nonatomic, retain) id<TestDelegate> delegate; 

@end 

TestSubView.m

#import "TestSubView.h" 
#import "TestViewController.h" 

@implementation TestSubView 

@synthesize delegate; 

- (id)initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 
     // Initialization code 
     [self setBackgroundColor:[UIColor redColor]]; 
     [self setUserInteractionEnabled:YES]; 
    } 
    return self; 
} 


- (void)dealloc { 
    [super dealloc]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    [self.delegate assignNumber:5]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

    [self.delegate displayNumber]; 
} 
+0

當你聲明在協議的方法,你並不需要再次聲明的方法在符合協議的類中。 (的確,你不應該這樣做,因爲如果你改變一個而不改變另一個,那麼這會導致錯配錯誤。)另外,爲什麼'assignNumber:'?我建議在協議中聲明屬性。 – 2010-11-21 23:35:05

+0

你可以添加你的TestView類嗎?這就是缺少的膠水,可能是你的問題所在。 – Rudiger 2010-11-22 00:13:21

+0

是TestSubView意味着TestView? – Ben 2012-02-12 14:04:38

回答

0

首先,你宣佈的協議,然後分配相同的對象執行該協議。你可能要找的是在TestSubView上聲明TestDelegate協議。另外,當爲代理人設置屬性時,請務必使用「分配」關鍵字而不是「保留」。

最後,使用UIGestureRecognizer可以大大簡化所有這些操作。你可以在你的控制器中設置它並將其添加到你的testSubView。通過這種方式,當視圖識別出相應的手勢出現在其範圍內時,將會向您的控制器發送一條消息,讓您可以像分配或顯示數字那樣執行您需要執行的操作。

+0

感謝您的建議,我仍然沒有得到它的工作,但擺脫了所有的錯誤。上面更新。我會看看GestureRecognizer。 – 2010-11-21 22:12:25

0

當您的課程名爲TestSubView時,您指的是TestView,除非您定義了2個課程。

TestView *myView = [[TestView alloc] initWithFrame:CGRectMake(0,0,320,480)];

你是正確的,你並沒有使用代理呢。
你會做下一行:

myView.delegate = self;

要這樣結束了:

- (void)loadView { 
    TestSubView *myView = [[TestSubView alloc] initWithFrame:CGRectMake(0,0,320,480)]; 
    myView.delegate = self; // Set Delegate Here 
    self.view = myView; 
    [myView release]; 
}