iOS создает пользовательский вид из файла Nib через несколько UIViewController

Мне нужен пример того, как создать пользовательский вид из файла пера. я обдумал несколько постов stackoverflow, но так и не понял. Может быть, мне нужна только подсказка, как это сделать.

что я хочу сделать, так это создать собственное представление с помощью построителя интерфейса. это должен быть шаблон, чтобы я мог создавать его несколько раз, чтобы добавить его к нескольким контроллерам представления.

До сих пор я создал свой xib-файл пользовательского представления с именем MyIssueView.xib. Который состоит на самом деле только из основного вида и некоторых меток.

И я создал подкласс UIView, который называется IssueView с выходами для моих меток в MyIssueView.xib.

Как мне теперь подключить розетки к ИБ? И как я могу создать экземпляр IssueView из любого ViewController?

Был бы рад примеру! Ваше здоровье.

ОБНОВЛЕНИЕ:

теперь у меня есть

IssueView.xib IssueView.h (подкласс UIView) IssueView.m

Мой IssueView.h:

#import <UIKit/UIKit.h>

@interface IssueView : UIView

@property (weak, nonatomic) IBOutlet UILabel *label1;
@property (weak, nonatomic) IBOutlet UILabel *label2;
@property (weak, nonatomic) IBOutlet UILabel *label3;
@property (weak, nonatomic) IBOutlet UILabel *label4;

@end

Мой IssueView.m:

#import "IssueView.h"

@implementation IssueView
@end

Мой ViewController.m:

#import "AllIssuesViewController1.h"
#import "IssueView.h"
#import "UIView+NibLoading.h"

@interface AllIssuesViewController1 ()

@end

@implementation AllIssuesViewController1


- (void) loadView
{

}

- (void)viewDidLoad
{
    [super viewDidLoad];

    _issueView = [IssueView loadInstanceFromNib];
}

Это дает мне ошибку:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x8292580> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key label1.'

person Bins Ich    schedule 26.11.2012    source источник


Ответы (1)


У меня есть категория, которая расширяет UIView и называется UIView+NibLoading.

В нем этот код...

#import "UIView+NibLoading.h"

@implementation UIView (NibLoading)

+ (id)loadInstanceFromNib
{
    UIView *result;

    NSArray* elements = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil];

    for (id anObject in elements) {
        if ([anObject isKindOfClass:[self class]]) {
            result = anObject;
            break;
        }
    }

    return result;
}

@end

Затем, когда я хочу создать экземпляр подкласса UIView из пера, я просто импортирую категорию и могу запустить...

self.issueView = [IssueView loadInstanceFromNib];\

Вам нужно соединить метки вот так...

введите здесь описание изображения

Если вы подключаете метки к «Владелец файла», вам необходимо удалить эти подключения.

person Fogmeister    schedule 26.11.2012
comment
Спасибо вам большое за ваш ответ. Я предполагаю, что мне нужно установить свой IssueView как класс MainView в инспекторе файлов в построителе интерфейса? и подключить розетки? - person Bins Ich; 26.11.2012
comment
Да, установите для основного представления файла IB значение IssueView. (обратите внимание, оставьте владельцем файла просто NSObject. И вы должны называть файлы одинаково. blah.h и blah.m и blah.xib - person Fogmeister; 26.11.2012
comment
я получаю сообщение об ошибке, посмотрите на мое обновление. это происходит в категории - в строке, где написано NSArray *elements = ... - person Bins Ich; 26.11.2012
comment
Похоже, проблема со свойством label1, которое у вас есть. Кроме того, я не знаю почему, но всякий раз, когда я использую его в viewDidLoad, я всегда привожу его к типу. issueView = (IssueView*)[IssueView loadInstanceFromNib]; - person Fogmeister; 26.11.2012
comment
О, вы соединяете ярлыки не в том месте. Похоже, вы подключаете выходы ярлыков к владельцу файла. Вам нужно подключить их к представлению. Оставьте владельца файла в покое, ничего с ним делать нельзя. - person Fogmeister; 26.11.2012
comment
Да, подключите их к IssueView. Но IssueView НЕ является владельцем файла. IssueView — это первый UIView, который вы устанавливаете в InterfaceBuilder. Я посмотрю, смогу ли я прикрепить изображение, чтобы помочь. - person Fogmeister; 26.11.2012
comment
Хорошо понял. Но есть еще одна странная ошибка. Когда я хочу добавить IssueView в качестве подпредставления в свой ViewController, я получаю EXC_BAD_ACCESS. - person Bins Ich; 26.11.2012
comment
Убедитесь, что ваше свойство issueView сильное. Затем вы можете просто добавить его, сказав [self.view addSubView:self.issueView]; - person Fogmeister; 26.11.2012
comment
ах ладно моя вина ;). Я добавил метод loadView без вызова super! Спасибо за вашу поддержку, туманный мастер!!!! теперь работает как шарм! - person Bins Ich; 26.11.2012
comment
Эта часть категории выглядит потрясающе! Это надежно? через ios'ы и т.д? - person EralpB; 06.12.2015