使用 nib 作为带有 nib 类的表节标题

Posted

技术标签:

【中文标题】使用 nib 作为带有 nib 类的表节标题【英文标题】:Use a nib as a table section header with nib class 【发布时间】:2013-04-27 20:07:53 【问题描述】:

我想创建一个加载 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;

【问题讨论】:

【参考方案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 类。并将 XIB 的*** View 的引用出口连接到上面的 view 属性(即在文件的所有者中)。

然后您有一个 UIView 子类,您可以将其放置在另一个 XIB 上(作为您将 Class 设置为 ADUNewRowHeaderView 的 UIView),或者在代码中实例化并添加为子视图。

(或者,您可以在代码中创建 UIView 及其子视图(按钮、标签等);那么您就不需要 XIB。但这当然只有在 UIView 简单且几乎没有自己的逻辑时才有效,以及一些易于在代码中布局的 UI 元素。)

【讨论】:

这很好用,只是我必须从 setUp 中删除 CGRect frame = self.frame; self.view.frame = CGRectMake(0, 0, frame.size.width, frame.size.height);,然后它才起作用 我在笔尖中的 UIButton 的响应速度明显比它原来所在的工具栏慢,就像我可以在一秒钟内按几次工具栏按钮,它会立即添加这些行,但如果我在一秒钟内多次按下新的笔尖按钮,它可能只会增加一两个。按钮响应正常,只是没有立即添加行(这不是我注意到的问题) 请选择这个作为答案。

以上是关于使用 nib 作为带有 nib 类的表节标题的主要内容,如果未能解决你的问题,请参考以下文章

iOS(重新)使用 NIB 作为模板

如何允许子类使用父类的 nib

如何创建一个具有多个 ViewController 可以使用的关联视图类的 Nib

将 UINavigationController 与同一类的 UIViewControllers 实例一起使用,并且没有 NIB

在 nib 文件中创建类的实例

使用泛型加载带有 nib 的视图控制器