2009-09-10 42 views

回答

4

您能增加一個功能 - (空)initWithView:(EchiquierDisplayView *)aSuperview或類似的東西,在你的

@interface pieceDraggableImageView : UIImageView { 
CGPoint startLocation; 
CGPoint startLocationInView; 
EchiquierDisplayView *theSuperview; 
} 

@property (nonatomic, retain) EchiquierDisplayView *theSuperview; 

-(void)correctDestinationPosition; 
-(void)initWithView:(EchiquierDisplayView *)aSuperview; 
... 
-(void)askSuperview; 
@end 

@implementation pieceDraggableImageView 

... 
-(void)initWithView:(EchiquierDisplayView *)aSuperview 
{ 
    theSuperview = aSuperview; 
} 
... 
-(void) correctDestinationPosition 
{ 
    [theSuperview correctIt]; 
} 

現在一定要落實在上海華功能correctIt定義的參考。 希望我理解你的問題吧...

+0

你好, 我已經試過你的收視率 - 邀請我現在可以訪問[theSuperview correctIt]; 它編譯正確。但我可以看到沒有更正。甚至不是NSlogs。你覺得我應該檢查什麼?再次感謝你 – kossibox

+0

我認爲你應該通過在更正後調用correctDestinationPosition刷新你的視圖 [self setNeedsDisplay:YES]; –

4

UIViews沒有他們的視圖控制器的知識。您需要創建一個自定義的UIView子類,該子類維護對一個(或可能多於一個)視圖控制器的引用,儘管這樣做會引入UIView和UIViewController之間的進一步耦合。

您應該考慮在superview或view的類中實現該方法,而不是在視圖控制器中實現它。

7

通常這是通過代表完成的。

讓您的視圖界面定義一個協議和對某個委託的引用。然後讓你的父視圖控制器實現這個協議。

然後上級這樣做:

someView.fooDelegate = self; 

,那麼該視圖會做這樣的事情:

if(self.fooDelegate != nil) { 
    if([fooDelegate respondsToSelector:...]) { 
     [fooDelegate performSelector:...]; 
    } 
} 

這不是編的,但我覺得你得到的要點。

1

這裏是另一種方式:

SuperviewsViewController *controller = self.superview.nextResponder; 

if (controller && [controller isKindOfClass:[SuperviewsViewController class]]) 
{ 
    [controller method]; 
} 

應該在大多數情況下工作。

Apple's UIResponder Reference

相關問題