xcode - 自定义视图的多个实例
xcode - multiple instances of custom view
我创建了一个带有故事板的自定义 UIViewController,这是 class:
.h 文件:
#import <UIKit/UIKit.h>
@interface PlayerViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *PlayerNumber;
@property (weak, nonatomic) IBOutlet UIImageView *PlayerImage;
@property (weak, nonatomic) IBOutlet UILabel *PlayerNameLabel;
-(void)setPlayerName:(NSString*)PlayerNameString;
@end
.m 文件:
#import "PlayerViewController.h"
@interface PlayerViewController ()
@end
@implementation PlayerViewController
@synthesize PlayerImage,PlayerNameLabel,PlayerNumber;
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
-(void)setPlayerName:(NSString *)PlayerNameString{
self.PlayerNameLabel.text=PlayerNameString;
}
@end
我从主视图创建了 2 个 PlayerViewController 实例以显示 2 个自定义视图:
- (void)viewDidLoad {
[super viewDidLoad];
[self DrawPlayerWithTag:1];
[self DrawPlayerWithTag:2];
}
- (void)DrawPlayerWithTag:(int)PlayerTag{
PlayerViewController *myPlayerViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PlayerViewController"];
UIView *myPlayerView=myPlayerViewController.view;
myPlayerView.tag=PlayerTag;
myPlayerView.frame=CGRectMake(0, 0, 100, 100);
myPlayerView.center = CGPointMake(self.view.frame.size.width / 2,
self.view.frame.size.height / 2);
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doDoubleTap)];
doubleTap.numberOfTapsRequired = 2;
[myPlayerView addGestureRecognizer:doubleTap];
[self.view addSubview:myPlayerView];
[myPlayerViewController setPlayerName:@"NameA"];
}
似乎有效。
但是,如果我想更改 PlayerName,如何在双击事件后引用 view1 而不是 view2,并使用方法 setPlayerName?
非常感谢您的回答!
更改回调方式
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doDoubleTap:)];
你可以这样获取视图的标签:
-(void)doDoubleTap:(UITapGestureRecognizer *)gesture{
NSLog(@"%ld", gesture.view.tag);
}
您可以保留您的代码并使用此 post Get to UIViewController from UIView?
调用 setPlayerName
但是,我建议这样:
为 gesture
设置的目标是 myPlayerViewController
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:myPlayerViewController action:@selector(doDoubleTap:)];
通过数组将 myPlayerViewController 的引用保存在 "main view" 中,例如:
[arrPlayerView addObject:myPlayerViewController]; /// keep pointing to myPlayerViewController, so it isn't released.
将(void)doDoubleTap:(UITapGestureRecognizer *)gesture
放在PlayerViewController
中
我创建了一个带有故事板的自定义 UIViewController,这是 class: .h 文件:
#import <UIKit/UIKit.h>
@interface PlayerViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *PlayerNumber;
@property (weak, nonatomic) IBOutlet UIImageView *PlayerImage;
@property (weak, nonatomic) IBOutlet UILabel *PlayerNameLabel;
-(void)setPlayerName:(NSString*)PlayerNameString;
@end
.m 文件:
#import "PlayerViewController.h"
@interface PlayerViewController ()
@end
@implementation PlayerViewController
@synthesize PlayerImage,PlayerNameLabel,PlayerNumber;
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
-(void)setPlayerName:(NSString *)PlayerNameString{
self.PlayerNameLabel.text=PlayerNameString;
}
@end
我从主视图创建了 2 个 PlayerViewController 实例以显示 2 个自定义视图:
- (void)viewDidLoad {
[super viewDidLoad];
[self DrawPlayerWithTag:1];
[self DrawPlayerWithTag:2];
}
- (void)DrawPlayerWithTag:(int)PlayerTag{
PlayerViewController *myPlayerViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PlayerViewController"];
UIView *myPlayerView=myPlayerViewController.view;
myPlayerView.tag=PlayerTag;
myPlayerView.frame=CGRectMake(0, 0, 100, 100);
myPlayerView.center = CGPointMake(self.view.frame.size.width / 2,
self.view.frame.size.height / 2);
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doDoubleTap)];
doubleTap.numberOfTapsRequired = 2;
[myPlayerView addGestureRecognizer:doubleTap];
[self.view addSubview:myPlayerView];
[myPlayerViewController setPlayerName:@"NameA"];
}
似乎有效。 但是,如果我想更改 PlayerName,如何在双击事件后引用 view1 而不是 view2,并使用方法 setPlayerName?
非常感谢您的回答!
更改回调方式
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doDoubleTap:)];
你可以这样获取视图的标签:
-(void)doDoubleTap:(UITapGestureRecognizer *)gesture{
NSLog(@"%ld", gesture.view.tag);
}
您可以保留您的代码并使用此 post Get to UIViewController from UIView?
调用setPlayerName
但是,我建议这样:
为
gesture
设置的目标是myPlayerViewController
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:myPlayerViewController action:@selector(doDoubleTap:)];
通过数组将 myPlayerViewController 的引用保存在 "main view" 中,例如:
[arrPlayerView addObject:myPlayerViewController]; /// keep pointing to myPlayerViewController, so it isn't released.
将
(void)doDoubleTap:(UITapGestureRecognizer *)gesture
放在PlayerViewController
中