2013-04-27 3 views
3

Я хочу создать заголовок раздела, который загружает файл nib и устанавливает его как заголовок UIView. Этот файл nib также будет иметь связанный класс, к которому подключены выходы и действия, поэтому я хочу загрузить этот класс с помощью 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: Make-файла Владелец класса ADUNewRowHeaderView, как обычно. И подключите верхний уровень доступа ViewS XIB к свойству view выше (т. Е. В Владелец файла).

У вас есть подкласс UIView, который вы можете разместить на другом XIB (как UIView, для которого вы устанавливаете класс в ADUNewRowHeaderView), или создаете экземпляр кода и добавляете его в качестве подзадачи.

(В качестве альтернативы вы можете создать UIView и его подзоны (кнопки, метки, ...) в коде, тогда вам не понадобится XIB. Но это работает, конечно, только если UIView прост и имеет небольшую логику , и несколько элементов пользовательского интерфейса, которые легко компоновятся в коде.)

+0

Это сработало отлично, за исключением того, что мне пришлось удалить 'CGRect frame = self.frame; self.view.frame = CGRectMake (0, 0, frame.size.width, frame.size.height); 'from setUp и после этого он работал –

+0

Также UIButton, который у меня есть в nib, заметно медленнее, чем панель инструментов, которая был изначально, так как я мог нажимать кнопку панели инструментов несколько раз в секунду, и он бы быстро добавил эти строки, но если бы я несколько раз нажимал новую кнопку ниба за секунду, она могла добавлять только один или два.Кнопка реагирует нормально, это просто строки не получают сразу же добавил (Это проблема не только то, что я заметил) –

+0

Пожалуйста, выберите это как ответ. –

Смежные вопросы