使用故事板在UIViewController中初始化自定义的UIView
我有一个自定义的UIViewcontroller,并想初始化和分配一个自定义的UIView,我分配给一个IBOutlet。 我正在使用故事板。 任何人都可以给我提示在哪里调用自定义UIView的指定初始值设定项?
**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
这是使用的github源的抽象版本: https : //github.com/mutualmobile/MMSpreadsheetView/blob/master/MMSpreadsheetView/MMSpreadsheetView.m
您可以在控制器的viewDidLoad中调用自定义视图的构造函数(初始值设定项)。 然后,将其添加为控制器视图的子视图。
像这样的东西:
- (void)viewDidLoad { ... MyCustomUIView *customView = [MyCustomUIView alloc] initWithNumberOfHeaderRows:0 numberOfHeaderColumns:0 frame:CGRectZero]; [self.view addSubview:customView]; ... }
更新
我认为你应该创build你的自定义视图类如下所示:
//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
然后在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; ... }
更新2
您可以简单地添加一个公共方法来设置自定义视图中标题行和列的数量。
//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
然后在viewDidLoad中
- (void)viewDidLoad { ... [self.customView setNumberOfHeaderRows:10 numberOfHeaderColumns:4]; ... }
更新3
根据您提供的参考文件,您可以在DataSource中添加方法:
//MMSpreadsheetView.h @optional ... - (NSUInteger)spreadsheetViewNumberOfHeaderRows:(MMSpreadsheetView *)spreadsheetView; - (NSUInteger)spreadsheetViewNumberOfHeaderColumns:(MMSpreadsheetView *)spreadsheetView; ...
然后,在执行文件中:
//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; } ...
另一种select是为您的视图采用数据源模式。 例如,在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
在MyCustomUIView.m中添加:
- (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 }
然后在你的UIViewController中:
- (void)viewDidLoad { [super viewDidLoad]; self.myCustomUIView.dataSource = self; } - (NSInteger)numberOfHeadersInMyCustomUIView:(MyCustomUIView *)view { return 5; } - (NSInteger)numberOfHeaderColumnsInMyCustomUIView:(MyCustomUIView *)view { return 2; }
你甚至可以在自定义视图中添加重载方法。