ios - 使用 Storyboard在 UIViewController 中初始化自定义 UIView

标签 ios objective-c uistoryboard designated-initializer

我有一个自定义 UIViewcontroller,我想初始化并分配一个自定义 UIView,我之前已将其分配给 IBOutlet。我正在使用 Storyboard。谁能给我提示在哪里调用自定义 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

最佳答案

您可以在 Controller 的viewDidLoad中调用自定义 View 的构造函数(初始化器)。然后,将其添加为 Controller View 的 subview 。

像这样:

- (void)viewDidLoad {
    ...
    MyCustomUIView *customView = [MyCustomUIView alloc] initWithNumberOfHeaderRows:0 numberOfHeaderColumns:0 frame:CGRectZero];
    [self.view addSubview:customView];
    ...    
}

已更新

我认为您应该像这样创建您的自定义 View 类:

//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

您可以简单地添加一个公共(public)方法来设置自定义 View 中的标题行数和列数。

//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

根据您提供的引用文件,您可以在数据源中添加方法:

    //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;
}
...

关于ios - 使用 Storyboard在 UIViewController 中初始化自定义 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23030891/

相关文章:

objective-c - Segue 使我的程序崩溃。与我的 NavigationController 和 TabBarViewController 有关

ios - 何时为新屏幕创建新的 Storyboard与 View Controller ?

iOS 在 webview 中没有互联网连接时显示警报

ios - HockeyApp 和 iOS : unable to add a script in build phase

javascript - 防止触摸设备出现 300 毫秒延迟

objective-c - 在 Swift 中获取 Objective-C 接口(interface)?

ios - UILabel 的字体颜色没有改变

iphone - 在 iPhone 和 iPad 上使用动态创建的缩略图 ScrollView

objective-c - 删除我的 mac 应用程序栏中的代理图标

ios - NSXMLParser 输出 "XMLElement: 0x8d61200"但想要 "XMLElement: Richard"