27

疫病のようにInterface Builderを何年も避けてきた後、私はそれにチャンスを与えることにしました。簡単ではない。

例を挙げてみましょうUITableViewHeaderFooterView。のようUITableViewCellに、contentViewプロパティがあります。とは異なりUITableViewCell、Interface Builder オブジェクト ライブラリにテンプレートがありません。

UITableViewHeaderFooterViewInterface Builder を使用して、内部のコンテンツを含むを作成するにはどうすればよいcontentViewでしょうか? 存在するという事実は、registerNib:forHeaderFooterViewReuseIdentifier:これが何らかの形で可能であるべきだと私に思わせます。

4

9 に答える 9

32

UITableViewHeaderFooterViewこれは、 IB でを定義するのに最も近いものです。

を。UITableViewHeaderFooterViewサブクラスを作成します( MYTableViewHeaderFooterView)。

b. のみの nib ファイルを作成しますcontentView( MYTableViewHeaderFooterContentView)。

c. inb ファイルで定義されたビューをロードするためにオーバーライドinitWithReuseIdentifier:します。MYTableViewHeaderFooterView

 - (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithReuseIdentifier:reuseIdentifier];
    if (self)
    {
        NSArray* objects = [[NSBundle mainBundle] loadNibNamed:@"MYTableViewHeaderFooterView"
                                                          owner:self
                                                        options:nil];
        UIView *nibView = [objects firstObject];
        UIView *contentView = self.contentView;
        CGSize contentViewSize = contentView.frame.size;
        nibView.frame = CGRectMake(0, 0, contentViewSize.width, contentViewSize.height);
        [contentView addSubview:nibView];
    }
    return self;
}

d. MYTableViewHeaderFooterViewnib ファイルの代わりにクラスを登録します。

[self.tableView registerClass:[MYTableViewHeaderFooterView class] forHeaderFooterViewReuseIdentifier:@"cell"];
于 2013-10-03T15:16:12.643 に答える
25

フッターとNIBファイルでこれを行いました:

  1. CustomFooterView.xibという名前の空の NIB ファイルを作成します。
  2. Interface Builder で NIB ファイルを編集し、最上位の UIView カスタム クラスを UITableViewHeaderFooterView に変更します。
  3. NIB で自動レイアウトを無効にします。
  4. UITableViewHeaderFooterViewビューの背景色をDefaultに設定します。
  5. ビューをフリーフォームにし、正しいサイズ (320 x 44 など) にします。
  6. UITableViewControllerviewDidLoadで、再利用識別子で使用する NIB ファイルを登録します。

    [self.tableView registerNib:[UINib nibWithNibName:@"CustomFooterView" bundle:nil] forHeaderFooterViewReuseIdentifier:@"Footer"];
    
  7. UITableViewController でtableView:viewForFooterInSection:、Footer 識別子を使用してビューをフェッチして返します。

    - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
    {
        if (section == 2)
            return [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"Footer"];
    
        return nil; 
    }
    
于 2013-10-28T12:27:19.470 に答える
14

IB でUITableViewCellテンプレートを使用するだけです。クラスをUITableViewHeaderFooterViewに変更します。ここにそれがあります... contentViewを使用します。

于 2014-08-31T18:37:35.127 に答える
7

もっと簡単な方法を見つけました。

1) UITableViewCell のサブクラスを作成し、xib ファイルを設定します

2)ヘッダーファイルで、スーパークラスを UITableViewCell から UITableViewHeaderFooterView に変更します

それでおしまい。

于 2014-08-27T11:00:25.760 に答える
6

このソリューションは、特に、Readable Content Guides (iOS 9 で導入された) に関して正しく機能させたい場合に、うまく機能します。UITableViewHeaderFooterView を作成する代わりに、必要なときに (XIB から) カスタム UIView を返すだけです。

  1. UIView ("AwesomeHeaderView") をサブクラス化する新しいクラスを作成し、アウトレットを作成します。

    class AwesomeHeaderView: UIView {
        @IBOutlet var myCustomLabel: UILabel!
    }
    
  2. UIViewを親ビューとしてXIB ファイル ("MyNewHeader.xib") を作成します。親 UIView のクラス タイプを、新しく作成したカスタム クラス (「AwesomeHeaderView」) に変更します。必要に応じて、追加のビューを子として追加し、アウトレットなどをリンクします。
  3. UIViewController (または UITableViewController) で、次のように呼び出します。

    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        guard let headerView = NSBundle.mainBundle().loadNibNamed("MyNewHeader", owner: nil, options: nil).first as? AwesomeHeaderView else {
            return nil
        }
    
        // configure header as normal
        headerView.backgroundColor = UIColor.redColor()
        headerView.myCustomLabel.textColor = UIColor.whiteColor()
        headerView.myCustomLabel.text = "Hello"
    
        return header
    }
    
于 2016-01-14T05:21:07.390 に答える
1

次の回避策により、IB 項目を変数としてコードにドラッグして割り当てることができます。UITableViewHeaderFooterView はそのままでは許可しません。

  1. (New File/CocoaTouchClass) UITableViewHeaderFooterView .hmxib を普通に作成

  2. スーパークラスの名前を一時的に UITableViewHeaderFooterView から UIView に変更します。必要に応じて UI アイテムをコードにドラッグして割り当てます。IB はキー値を正しく割り当て、完了したら UITableViewHeaderFooterView に戻します。

  3. テーブルビューで、 registerNib:を使用してregisterClass:の代わりに登録します。テーブルビューの残りを通常どおりに準備します(つまり、デキュー)。
于 2016-01-22T04:15:27.967 に答える
0

私が理解したひどいハックは、headerFooter クラスで IBOutlet contentView を作成し、それを xib の「コンテンツ ビュー」に接続することです (xib を tableViewCell、View->contentView->mystuff のように配置します)。

警告が表示されます。ハッキングの準備ができました...

IBOutlet を削除すると、すべて機能します。

于 2015-10-07T16:13:06.453 に答える