2014-04-29 13 views
0

我有一個(NSObject) Block *my_block作爲屬性UIView *main_view。在ViewController上,我將UIPanGestureRecognizer添加到main_view,因此手勢方法必須位於ViewController上。有沒有辦法通過手勢方法瞭解具體main_viewmy_block擁有者?從UIView屬性獲取對NSObject父項的引用

這是因爲我有一個NSMutableArrayBlock。在運行時將Blocks添加到NSMutableArray

我的第一個想法是通過NSMutableArray循環比較每個main_view到識別器的UIView。另一個想法是對UIView進行分類並創建對其各自的Block的參考。但也許有一個更乾淨的方式來做到這一點。

下面是我的類和方法的一個簡單示例。

Block.h

#import <Foundation/Foundation.h> 

@interface Block : NSObject 

@property (nonatomic, strong) UIView *main_view; 

@end 

ViewController.m

#import "ViewController.h" 
#import "Block.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // the Blocks are actually added on runtime to a NSMutableArray, but this is a simpler example 

    Block *my_block = [[Block alloc] init]; 
    [[my_block main_view] addGestureRecognizer:[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]]; 
    [self.view addSubview:[my_block main_view]]; 
} 

- (void)handlePan:(UIPanGestureRecognizer *)recognizer 
{ 
    Block *block_temp = [recognizer.view ....]; 
    //recognizer.view = main_view, how to get the Block owner of this view? 
} 
+0

爲什麼塊不能認爲自己?我的意思是,Block:UIView?然後,您將手勢添加到塊而不是main_view。 –

+1

從您的問題「手勢方法必須在ViewController上」 - 爲什麼會出現這種情況? – Rich

+0

@RaphaelOliveira因爲在代碼的另一部分我需要它是這樣的。 –

回答

1

你有Block類是target你的手勢識別器:

Block.h

@interface Block : NSObject 

@property (nonatomic, strong) UIView *main_view; 

@end 

Block.m

@implementation Block 

-(void)handleMainViewPan:(UIPanGestureRecognizer *)recognizer 
{ 
    // Now recognizer.view is the same view as self.main_view 
    // Use self as this is now your block 
} 

@end 

ViewController.m

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // the Blocks are actually added on runtime to a NSMutableArray, but this is a simpler example 

    Block *my_block = [[Block alloc] init]; 
    UIPanGestureRecognizer *gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:my_block action:@selector(handleMainViewPan:)]; 
    [my_block.main_view addGestureRecognizer:gestureRecognizer]; 
    [self.view addSubview:my_block.main_view]; 
} 

@end 
+0

謝謝!!這工作完美。我如何說,我從來不知道GestureRecognizerMethods可能在UIViewControllers之外。我喜歡這個答案的另一點是使用封裝。 –

+0

是的,我要提到的是,但是我不知道你的代碼,因爲你提到了你保存的數組:D很高興它幫助! – Rich

0

相反子類的UIView你也可以使用功能:

void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) 
id objc_getAssociatedObject(id object, const void *key) 

docs

使用給定密鑰和關聯策略設置給定對象的關聯值。

好文章http://nshipster.com/associated-objects/

0

如果你已經有在陣列(我相信陣列處於ViewController屬性),你可以找到一個loop塊。

例子:

// self.blocks is NSMutableArray where blocks are stored 

- (void)handlePan:(UIPanGestureRecognizer *)recognizer 
{ 
    Block *owner = nil; 
    for (block in self.blocks) { 
     if (block.main_view == recognizer.view) { 
      owner = block; 
      break; 
     } 
    } 
}