我有一个UIViewController的子类,我们称之为 MySuperClass ,这个子类有一个 UITableView 属性,而不是以编程方式初始化。 现在我想将 MySuperClass 子类化为 MySubclass ,但这次我想通过Interface Builder而不是以编程方式设计tableview。 我想要的是类似于 UIViewController 的工作原理,如果你将UIViewController子类化,它的视图属性已经初始化,但当你将它带入IB时你可以将它链接到Interface Builder的UIView项目,怎么做我这样做了?
我的超类的源代码与此类似:
//interface
#import <UIKit/UIKit.h>
@interface MySuperClass : UIViewController <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, strong) UITableView *tableView;
//implementation
#import "MySuperClass.h"
@implementation MySuperClass
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
[self initializeProperties];
}
return self;
}
- (void) awakeFromNib{
[super awakeFromNib];
[self initializeProperties];
}
- (void) initializeProperties{
self.tableView = [[UITableView alloc] initWithFrame: self.view.frame style: UITableViewStylePlain];
self.tableView.separatorColor = [UIColor clearColor];
self.tableView.backgroundColor = [UIColor clearColor];
self.tableView.delegate = self;
self.tableView.dataSource = self;
UIView *tableHeaderView = [[UIView alloc] initWithFrame: CGRectMake(0, 0, self.view.frame.size.width, self.bannerView.frame.size.height+kBannerDistance)];
tableHeaderView.backgroundColor = [UIColor clearColor];
self.tableView.tableHeaderView = tableHeaderView;
}
答案 0 :(得分:4)
只需“重新声明”子类中的@property
。
#import <UIKit/UIKit.h>
#import "MySuperClass.h"
@interface MySubClass : MySuperClass
@property (nonatomic, strong) IBOutlet UITableView *tableView;
@end
编译器将足够聪明,以了解您正在引用超类属性,并且IB将没有问题链接到子类的属性。
答案 1 :(得分:0)
这可能不是最好的解决方案,但应该完成它。
在- initFromSubClassWithNibName: bundle:;
中定义MySuperClass.h
并按照以下方式实施:
- (id) initFromSubClassWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}
并在MySubClass
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}
这样您就可以转义MySuperView
方法的init
实现并使用UIViewController's implementation. You can take the same approach with
awakeFromNib`。这将避免以编程方式创建表视图。
然后你可以采用GuillaumeA的答案从IB中初始化tableView
。