1

私は UIViewController のサブクラスを持っています。これをMySuperClassと呼びます。このサブクラスには、プログラムで初期化されるUITableViewプロパティがあります。MySuperClassMySubclassにサブクラス化したいのですが、今回はプログラムではなく Interface Builder を使用してテーブルビューを設計したいと考えています。私が欲しいのは、 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の実装をエスケープし、 awakeFromNib` を使用できます。これにより、プログラムによるテーブル ビューの作成が回避されます。initUIViewController's implementation. You can take the same approach with

次に、GuillaumeA の回答を取得tableViewして IB から初期化できます。

于 2013-06-05T14:15:28.623 に答える