3

nib ファイルをロードし、それをヘッダー UIView として設定するセクション ヘッダーを作成したいと考えています。このnibファイルには、アウトレットとアクションが接続されている関連クラスも含まれているため、通常のようにnibでそのクラスをロードしたいと考えています。

私はウェブを精査し、いくつかの同様の回答を見つけましたが、私のために働くことはできません. 数日間遊んだ後、ビューを正しく表示することができましたが、接続を追加してテキストを別の方法で表示するように指示しても何もしません。

たとえば、セクション タイトル テキストが nil で初期化されていて、それでも同じテキストが表示され、変更しようとしても反映されず、ボタンで行われた接続がトリガーされない場合は、セクション タイトル テキストをクリアする必要があります。

これがビュー用のビューコントローラーです

@interface ADUNewRowHeaderViewController : UIViewController

@property (strong, nonatomic) IBOutlet UILabel *sectionTitleField;
@property (strong, nonatomic) IBOutlet UIButton *addRowBtn;

@property(strong,nonatomic) NSString* sectionTitle;

- (id)initWithNibName:(NSString *)nibNameOrNil
               bundle:(NSBundle *)nibBundleOrNil
                title:(NSString*) titleOrNil;

@end

そして、ここに実装があります

@implementation ADUNewRowHeaderViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil title:(NSString *)titleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self)
    {
        if(titleOrNil != nil)
        {
            [self setSectionTitle:titleOrNil];
        }
        else
        {
            [self setSectionTitle:@""];
        }
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)setSectionTitle:(NSString *)sectionTitle
{
    _sectionTitle = sectionTitle;
    [[self sectionTitleField] setText:sectionTitle];
}
@end

実際のテーブルビューコントローラーでは、次のようにリストされています

@property(nonatomic, strong) ADUNewRowHeaderViewController* secHeader;

およびviewDidLoadの下の実装ファイルで

[self setSecHeader:[[ADUNewRowHeaderViewController alloc] initWithNibName:nil bundle:nil title:nil]];
[[[self secHeader] addRowBtn] addTarget:self action:@selector(addNewRow:) forControlEvents:UIControlEventTouchUpInside];

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    return [[self secHeader] view];
}

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return [[self secHeader] view].bounds.size.height;
}

これはアクションのメソッド宣言です

- (IBAction)addNewRow:(id)sender;
4

1 に答える 1

1

サブクラスUIViewではなく、を作成する必要があります。UIViewControllerには次の.mものが含まれます。

- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame])
    {
        [self setUp];
    }

    return self;
}

- (void)awakeFromNib
{
    [super awakeFromNib];
    [self setUp];
}

- (void)setUp
{    
    [[NSBundle mainBundle] loadNibNamed:@"YourNibName" owner:self options:nil];
    CGRect frame = self.frame;
    self.view.frame = CGRectMake(0, 0, frame.size.width, frame.size.height);
    [self addSubview:self.view];

    ... do other initialisations here ...
}

そして.h

@interface ADUNewRowHeaderView : UIView

@property (nonatomic, strong) IBOutlet UIView*   view;

次に、XIB で:ADUNewRowHeaderViewいつものように、class のファイルの所有者を作成します。そして、XIB の最上位ビューの参照アウトレットをview上記のプロパティ (つまり、ファイルの所有者) に接続します。

次に、UIView サブクラスを別の XIB に (クラスを ADUNewRowHeaderView に設定する UIView として) 配置するか、コードでインスタンス化してサブビューとして追加できます。

(代わりに、UIView とそのサブビュー (ボタン、ラベルなど) をコードで作成することもできます。その場合、XIB は必要ありません。ただし、これはもちろん、UIView が単純で独自のロジックがほとんどなく、UI がほとんどない場合にのみ機能します。コードでのレイアウトが容易な要素)。

于 2013-04-27T21:12:41.897 に答える