2017-10-05 792 views
1

我想在我的viewcontroller上多次使用一個xib文件(這只是一個簡單的視圖)。我可以將它添加到我的viewcontroller不止一次,並與它們進行交互。問題是,我如何區分這些視圖來知道我點擊哪一個?如何在多個視圖中調用相同的xib,但區分哪些是我正在進行交互?

例如,當我在我的firstView挖掘,我想打印「蘋果」當我在第二視圖點擊i灣打印「橘子」

下面你可以看到我的代碼,這裏是GitHub庫https://github.com/TimurAykutYildirim/demoView/tree/multiple-instance

ViewController.h

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

@interface ViewController : UIViewController <SelectionProtocol> 
@property (weak, nonatomic) IBOutlet Mini *miniView; 
@property (weak, nonatomic) IBOutlet Mini *miniView2; 

@end 

ViewController.m

0:爲你我的代碼玩
#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    self.miniView.delegate = self; 
    self.miniView2.delegate = self; 
} 


-(void) isClicked { 
    NSLog(@"apples"); 
    NSString * storyboardName = @"Main"; 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil]; 
    UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 
    [self presentViewController:vc animated:YES completion:nil]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end

Mini.h

#import <UIKit/UIKit.h> 

@protocol SelectionProtocol; 

@interface Mini : UIView 

@property (nonatomic, weak) id<SelectionProtocol> delegate; 

- (IBAction)btnClick:(id)sender; 

@end 


@protocol SelectionProtocol <NSObject> 

@required 
-(void) isClicked; 

@end 

Mini.m

#import "Mini.h" 

@implementation Mini 

- (instancetype)initWithCoder:(NSCoder *)aDecoder { 
    if (self = [super initWithCoder:aDecoder]) { 
     [self load]; 
    } 

    return self; 
} 


- (instancetype)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     [self load]; 
    } 
    return self; 
} 

- (void)load { 
    UIView *view = [[[NSBundle bundleForClass:[self class]] loadNibNamed:@"Mini" owner:self options:nil] firstObject]; 
    [self addSubview:view]; 
    view.frame = self.bounds; 


} 
- (IBAction)btnClick:(id)sender { 

    if ([self.delegate conformsToProtocol:@protocol(SelectionProtocol)]) { 
     [self.delegate isClicked]; 
    } 
} 

@end 
+1

您可以爲每個視圖使用不同的標記。用協議方法發送標籤。我認爲它會爲你工作。 –

回答

0

我使用ENUM用於視圖類型之間進行區分。

typedef NS_ENUM(NSUInteger, <#MyViewType#>) { 
    <#MyViewTypeDefault#>, 
    <#MyViewTypeA#>, 
    <#MyViewTypeB#>, 
}; 

@property (nonatomic, assign) MyEnum viewType; 

協議:

-(void) isClickedForViewType:(MyEnum)viewType; 
0

調用委託方法常用的方法是包括呼叫者作爲PARAM。你的情況應該是這樣的:

- (IBAction)btnClick:(id)sender { 
    if ([self.delegate conformsToProtocol:@protocol(SelectionProtocol)]) { 
    [self.delegate isClickedOnMiniView:self]; 
    } 
} 

基本上,這個公約是爲了掩蓋這樣的情況 - 一個對象是很多類似的人的代表。

檢查蘋果的文檔在本公約的例子: https://developer.apple.com/documentation/uikit/uitableviewdelegate

2

有很多方法,你可以做到這一點。這裏有兩個:

  1. 添加sender參數,以此來-[ViewController isClicked]方法,並改變Mini因此調用-isClicked傳遞一個指針self。然後,-isClicked中的代碼可以將它與它所知道的Mini的每個實例(即self.miniViewself.miniView2)進行比較,以查看它們中的任何一個是否是發送該消息的實例。

  2. 將屬性添加到Mini可讓您區分兩者,例如name。您可以在-viewDidLoad中配置該屬性,如self.miniView.name = @"apples",或者甚至可以使用「用戶定義的運行時屬性」在.xib文件中執行該屬性。「然後你就可以有Mini通是name財產作爲參數傳遞給那些需要知道的Mini實例調用者的方法。(您也可以結合1 & 2,並傳遞給self的引用,以便ViewController可以檢查name參數或任何別的就是了。)

2

我從你的問題是某處Mini廈門國際銀行有文本「蘋果」(或特定的廈門國際銀行取水果)出口假設。

在在這種情況下,您可以將協議更改爲:

- (void)isClickedFromView:(Mini *)mini 

在委託(ViewController.m)改變btnClick行動:

- (IBAction)btnClick:(id)sender { 
    if ([self.delegate conformsToProtocol:@protocol(SelectionProtocol)]) { 
    [self.delegate isClickedFromView:self]; 
    } 
} 

fruitLabel出口添加到您的Mini類。

@property (weak, nonatomic) IBOutlet UILabel *fruitLabel 

現在,當代表得到呼叫時,可以撥打:對於如果數據(在這種情況下fruits)在代碼中

NSLog(@"Fruit: %@", mini.fruitLabel.text); 

=====附加應答=== ==

如果您已經以編程方式獲得了數據(如水果數組),那麼將Mini類以相同方式排列在數組中可能更容易。

所以,如果miniViewArray包含您Mini類,數組 和fruitArray含有水果的NSString的數組,你可以這樣做:

在您設定的MiniView中的委託時,你可以將它們添加到陣列..是這樣的:

NSArray *fruitArray = @[ @"apples", @"oranges" ]; 
NSArray *miniViewArray = @[ miniView, miniView2 ]; 

然後在委託調用你可以做(​​使用相同的協議更改如上):

- (void)isClickedFromView:(Mini *)mini { 
    NSInteger fruitIndex = [miniViewArray indexOfObject:mini]; 
    NSString fruitName = fruitArray[fruitIndex]; 
    NSLog(@"Fruit: %@", fruitName); 
} 
+0

而不是添加另一個屬性,我從屬性檢查器爲每個視圖設置標籤。謝謝雖然.. –

+0

我只更新了答案,因爲我認爲在xib中標記每個視圖並不是真正可擴展的。如果您在xib中標記視圖,那意味着您在每個標記的代碼中都有一個參考。請參閱我的附加答案。 – Amos

相關問題