1

我有一个 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;


}
4

2 回答 2

4

只需@property在您的子类中“重新声明”。

#import <UIKit/UIKit.h>
#import "MySuperClass.h"

@interface MySubClass : MySuperClass

@property (nonatomic, strong) IBOutlet UITableView *tableView;

@end

编译器将足够聪明,可以理解您正在引用超类属性,并且 IB 链接到子类的属性没有问题。

于 2013-06-05T13:54:24.610 回答
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 withawakeFromNib`。这将避免以编程方式创建表视图。

然后您可以tableView从 IB 中获取 GuillaumeA 的答案来初始化。

于 2013-06-05T14:15:28.623 回答