Initialisation d'un UIView personnalisé dans un UIViewController à l'aide d'un storyboard
-
21-12-2019 - |
Question
J'ai une personnalité UIViewController et souhaitant initialiser et attribuer un UIView personnalisé que je suis affecté à un iboutlet avant.J'utilise un storyboard.Quelqu'un peut-il me donner des astuces où appeler l'initialisateur désigné de l'UIView personnalisé?
**MyCustomUIView.h**
@interface MyCustomUIView : UIView
@end
**MyCustomUIView.m**
@implementation MyCustomUIView
- (id)initWithNumberOfHeaderRows:(NSUInteger)headerRowCount numberOfHeaderColumns:(NSUInteger)headerColumnCount frame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
}
return self;
}
@end
**MyUIViewController.h**
@interface MyUIViewController : UIViewController
@property (weak, nonatomic) IBOutlet MyCustomUIView *myCustomUIView; // I wanna use this Outlet
@end
**MyUIViewController.m**
@implementation MyUIViewController
@end
C'était une version abstraite de la source GitHub utilisée: https://Github.com/mutualmobile/mmspreadsheetview/blob/master/mmsPreadsheetview/mmspreadsheetview.m
La solution
Vous pouvez appeler le constructeur (initialiszer) de la vue personnalisée dans la vue ViewDidLoad du contrôleur.Ensuite, ajoutez-le sous la forme d'une sous-vision de la vue du contrôleur.
quelque chose comme ceci:
- (void)viewDidLoad {
...
MyCustomUIView *customView = [MyCustomUIView alloc] initWithNumberOfHeaderRows:0 numberOfHeaderColumns:0 frame:CGRectZero];
[self.view addSubview:customView];
...
}
mis à jour
Je pense que vous devriez créer votre classe de vue personnalisée quelque chose comme ceci:
//MyCustomView.h
@interface MyCustomView : UIView
- (id)initWithNumberOfHeaderRows:(NSUInteger)numberOfHeaderRows numberOfHeaderColumns:(NSUInteger)numberOfHeaderColumns;
@property (readwrite, nonatomic) NSUInteger numberOfHeaderRows;
@property (readwrite, nonatomic) NSUInteger numberOfHeaderColumns;
@end
//MyCustomView.m
@implementation
- (void)setup {
// Do custom stuffs here...
}
- (id)initWithNumberOfHeaderRows:(NSUInteger)numberOfHeaderRows numberOfHeaderColumns:(NSUInteger)numberOfHeaderColumns {
self = [self initWithFrame:CGRectZero];
if (self) {
self.numberOfHeaderRows = numberOfHeaderRows;
self.numberOfHeaderColumns = numberOfHeaderColumns;
}
return self;
}
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setup];
}
return self;
}
- (id)init {
self = [super init];
if (self) {
[self setup];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
[self setup];
}
return self;
}
@end
Puis dans la vue ViewDidLoad:
- (void)viewDidLoad {
...
// Assuming you have an IBOutlet property of MyCustomView class with a name 'customView'
// That property must be hooked up from the xib/storyboard
self.customView.numberOfHeaderRows = 1;
self.customView.numberOfHeaderColumns = 1;
self.customView.frame = self.view.bounds;
...
}
mis à jour 2
Vous pouvez simplement ajouter une méthode publique pour définir le nombre de lignes d'en-tête et de colonnes dans la vue personnalisée.
//MyCustomView.h
@interface MyCustomView : UIView
...
- (void)setNumberOfHeaderRows:(NSUInteger)rows numberOfHeaderColumns:(NSUInteger)columns;
...
@end
//MyCustomView.m
@implementation MyCustomView
...
- (void)setNumberOfHeaderRows:(NSUInteger)rows numberOfHeaderColumns:(NSUInteger)columns {
//Do the custom stuffs that you want...
}
...
@end
Puis dans la vue ViewDidLoad
- (void)viewDidLoad {
...
[self.customView setNumberOfHeaderRows:10 numberOfHeaderColumns:4];
...
}
mis à jour 3
basé sur les fichiers de référence que vous avez donnés, vous pouvez ajouter des méthodes dans la source de données:
//MMSpreadsheetView.h
@optional
...
- (NSUInteger)spreadsheetViewNumberOfHeaderRows:(MMSpreadsheetView *)spreadsheetView;
- (NSUInteger)spreadsheetViewNumberOfHeaderColumns:(MMSpreadsheetView *)spreadsheetView;
...
Ensuite, dans le fichier de mise en œuvre:
//MMSpreadsheetView.m
...
- (void)setupWithNumberOfHeaderRows:(NSUInteger)rows numberOfHeaderColumns:(NSUInteger)columns {
_scrollIndicatorInsets = UIEdgeInsetsZero;
_showsVerticalScrollIndicator = YES;
_showsHorizontalScrollIndicator = YES;
_headerRowCount = headerRowCount;
_headerColumnCount = headerColumnCount;
if (headerColumnCount == 0 && headerRowCount == 0) {
_spreadsheetHeaderConfiguration = MMSpreadsheetHeaderConfigurationNone;
}
else if (headerColumnCount > 0 && headerRowCount == 0) {
_spreadsheetHeaderConfiguration = MMSpreadsheetHeaderConfigurationColumnOnly;
}
else if (headerColumnCount == 0 && headerRowCount > 0) {
_spreadsheetHeaderConfiguration = MMSpreadsheetHeaderConfigurationRowOnly;
}
else if (headerColumnCount > 0 && headerRowCount > 0) {
_spreadsheetHeaderConfiguration = MMSpreadsheetHeaderConfigurationBoth;
}
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.backgroundColor = [UIColor grayColor];
[self setupSubviews];
}
- (id)initWithNumberOfHeaderRows:(NSUInteger)headerRowCount numberOfHeaderColumns:(NSUInteger)headerColumnCount frame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setupWithNumberOfHeaderRows:rows numberOfHeaderColumns:columns];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
NSUInteger rows = 0;
NSUInteger columns = 0;
if (self.dataSource && [self.dataSource respondsToSelector:@selector(spreadsheetViewNumberOfHeaderRows:)]) {
rows = [self.dataSource spreadsheetViewNumberOfHeaderRows:self];
}
if (self.dataSource && [self.dataSource respondsToSelector:@selector(spreadsheetViewNumberOfHeaderColumns:)]) {
columns = [self.dataSource spreadsheetViewNumberOfHeaderColumns:self];
}
[self setupWithNumberOfHeaderRows:rows numberOfHeaderColumns:columns];
}
return self;
}
...
Autres conseils
Une autre option consiste à adopter le modèle de source de données à votre vue.Par exemple, à myCustomuiview.h:
@class MyCustomUIView;
@protocol MyCustomUIViewDataSource
- (NSInteger)numberOfHeadersInMyCustomUIView:(MyCustomUIView *)view;
- (NSInteger)numberOfHeaderColumnsInMyCustomUIView:(MyCustomUIView *)view;
@end
@interface MyCustomUIView : UIView
@property (nonatomic, strong) id<MyCustomUIViewDataSource> dataSource;
@end
in myCustomuiview.m Ajouter:
- (void)setDataSource:(id<MyCustomUIViewDataSource>)dataSource {
self.dataSource = dataSource;
self.headerRowCount = [self.dataSource numberOfHeadersInMyCustomUIView:self];
self.headerColumnsCount = [self.dataSource numberOfHeaderColumnsInMyCustomUIView:self];
// Rearrange view with the new values
}
Puis dans votre UIViewController:
- (void)viewDidLoad {
[super viewDidLoad];
self.myCustomUIView.dataSource = self;
}
- (NSInteger)numberOfHeadersInMyCustomUIView:(MyCustomUIView *)view {
return 5;
}
- (NSInteger)numberOfHeaderColumnsInMyCustomUIView:(MyCustomUIView *)view {
return 2;
}
Vous pouvez même ajouter une méthode de rechargement dans votre vue personnalisée.