iOS (Re) использовать NIB в качестве шаблона - PullRequest
2 голосов
/ 18 сентября 2011

Я создал nib файл с разными видами.Я планировал использовать этот nib файл в качестве шаблона, так же, как в Интернете (например, HTML).Поэтому создайте новый экземпляр этого nib, заполните его фактическими данными, создайте еще один новый экземпляр nib и заполните фактическими данными и т. Д. *

Но когда я пытаюсь это сделать, nibЭкземпляр не ведет себя так же.Только один создается.Я что-то пропустил?Разве nib файлы не должны использоваться таким образом?

Вот как я пытался использовать мой файл пера -

    int yCoord = 0;

    for(int i=0; i<[resultSet count]; i++)
    {
        [[NSBundle mainBundle] loadNibNamed:@"msgView" owner:self options:nil];
        UIView *tmpMsgView = [[UIView alloc] initWithFrame:CGRectMake(0, yCoord, msgView.view.frame.size.width, msgView.view.frame.size.height)];
        tmpMsgView         = msgView.view;

        UILabel *senderLabel = (UILabel *)[tmpMsgView viewWithTag:1];
        [senderLabel setText:@"trial"];

        [self.view addSubview:tmpMsgView];
        [tmpMsgView release];
        yCoord += msg.view.frame.size.height;

    }

этот msgView подключен к nib file (через IB) и владелец этого nib файла тоже определяется как этот класс viewController.

Ответы [ 3 ]

3 голосов
/ 18 сентября 2011

Ваш код добавляет один и тот же экземпляр снова и снова, а не новый экземпляр каждый раз.

UIView *testView = [[UIView alloc] init];
testView.backgroundColor = [UIColor blueColor];
for (int i=0; i<5; i++) {
    testView.frame = CGRectMake(0.0, (i+1)*40.0, 200.0, 20.0);
    [self.window addSubview:testView];
}
[testView release];

и

for (int i=0; i<5; i++) {
    UIView *testView = [[UIView alloc] init];
    testView.backgroundColor = [UIColor blueColor];
    testView.frame = CGRectMake(0.0, (i+1)*40.0, 200.0, 20.0);
    [self.window addSubview:testView];
    [testView release];
}

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

посмотрите на следующее, это будетсоздайте 5 прямоугольников со всеми разными цветами - это показывает, что каждый прямоугольник является отдельным экземпляром, загруженным из пера:

for (int i=0; i<5; i++) {
    NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"aView" owner:self options:nil];        
    UIView *nibView = [nibObjects objectAtIndex:0];

    nibView.backgroundColor = [UIColor colorWithRed:(i+1)*0.14 green:(i+1)*0.11 blue:200.0 alpha:1.0];
    nibView.frame = CGRectMake(0.0, (i+1)*40.0, 200.0, 20.0);
    [self.window addSubview:nibView];
}

сейчас, если мы назначим наш массив nibObjects только один раз перед циклом, мыопять та же проблема в том, что мы добавляем один и тот же экземпляр снова и снова, что приведет только к одному прямоугольнику:

NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"aView" owner:self options:nil];        
for (int i=0; i<5; i++) {
    UIView *nibView = [nibObjects objectAtIndex:0];

    nibView.backgroundColor = [UIColor colorWithRed:(i+1)*0.14 green:(i+1)*0.11 blue:200.0 alpha:1.0];
    nibView.frame = CGRectMake(0.0, (i+1)*40.0, 200.0, 20.0);
    [self.window addSubview:nibView];
}

надеюсь, это поможет

0 голосов
/ 18 сентября 2011

То, что вы пытаетесь сделать, прекрасно - это то, что обычно делается для загрузки, например, ячеек табличного представления.

Если я сделаю это, у меня будет одна розетка от контроллера представления (которая устанавливается как владелец файлов, который вы сделали).Это будет самый верхний объект в кончике, например, UIView.Все остальные ваши компоненты Nib - это лишь подпредставления этого, вы можете идентифицировать их с помощью тегов или, если ваш самый верхний вид - это пользовательский вид, который может иметь розетки, которые подключены соответствующим образом.

Когда вы делаете loadNibNamed, это установит ваш выходной ивар на самый верхний объект.Затем вы назначаете это переменной уровня метода и возвращаете свой ivar к nil.Вы можете сделать то, что вам нравится с этим, прежде чем добавить его в качестве подпредставления к чему-то еще.В следующий раз, когда вы загрузите перо, вы получите еще одну свежую версию.

Надеюсь, что это имеет смысл, дайте мне знать, если я могу добавить что-нибудь еще.Проблема в вашем коде в том, что вы делаете что-то с msgView.view вместо объекта верхнего уровня.

0 голосов
/ 18 сентября 2011

У вас проблемы с управлением памятью в вашем коде.

UIView *tmpMsgView = [[UIView alloc] initWithFrame:CGRectMake(0, yCoord, msgView.view.frame.size.width, msgView.view.frame.size.height)]; Вы выделяете / инициализируете UIView, а на следующей строке сохраняете какое-то другое представление в переменной. Вы теряете указатель на UIView и, следовательно, теряете его память.

Будет ли работать код, использующий senderLabel, зависит от того, что вы определили в nib-файле.

В [tmpMsgView release]; вы, скорее всего, выпускаете то, чем не владеете (указатель больше не указывает на UIView, который вы выделяете / инициируете). Проблема здесь зависит от того, как вы объявляете msgView. Если вы освобождаете объект, которым вы не владеете, он может быть освобожден, и это может быть причиной того, что вы не видите его в своем приложении.

...