Как создать несколько окон с одним и тем же файлом пера в xcode - PullRequest
4 голосов
/ 25 июня 2010

У меня есть приложение для iphone, которое использует табличное представление в качестве интерфейса.Каждый раз, когда пользователь нажимает на одну из ячеек таблицы, я хочу показать пользователю другое окно.Однако пользовательский интерфейс окна, которое я вставляю в контроллер навигации, очень похож.Поэтому я решил создать «универсальный файл пера», который будет использоваться во всех подклассах владельца файла этого универсального файла пера.

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

В файле .h:

#import <UIKit/UIKit.h>
#import "primeViewController.h"

@interface subclass1 : primeViewController { //subclassing from a generic view controller that owns a generic nib file

}

В файле .m:

#import "subclass1.h"

@implementation subclass1

- (id) initWithLabelAndButton {
    if(self = [super initWithNibName:@"primeViewController" bundle:nil]) {
        self.label.text = @"Title of the first subclass";   

    }
    return self;
}

Но тогда, когдаЯ создаю экземпляр класса в табличном представлении:

//somewhere in rootviewcontroller.m:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    switch (indexPath.row) {
        case 0:
        {
            checkPrime* checkPrimeViewController = [[checkPrime alloc] initWithLabelAndButton];
            [self.navigationController pushViewController:checkPrimeViewController animated:YES];
            [checkPrimeViewController release];
            break;
        }
        default:
            break;
    }
}

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

Ответы [ 3 ]

4 голосов
/ 26 ноября 2010

Когда загружается nib-файл, он создает контроллер представления того же класса, который записан в .xib (UIViewController или PrimeViewController, что угодно еще).Что на самом деле сохраняется в вашем файле .nib?Вы добьетесь успеха, если будете хранить UIView и все соответствующие объекты в xib и загружать только их, используя [[NSBundle mainBundle] loadNibNamed: @ "YourNibFile" owner: class1ViewController options: nil], в то время как view в nib связан ссоответствующая розетка владельца файла.

2 голосов
/ 02 декабря 2010

Если вы поместите все ваши представления в один NIB, то, когда ваше приложение запускается, оно должно загрузить весь NIB в память и создать все объекты для всех элементов управления, а это занимает много времени. *

Если вы разделите ваши представления на отдельные NIB, то ваше приложение запустится намного быстрее, потому что будет загружен только тот NIB, который содержит начальное представление. Затем, когда вид меняется, вы можете загрузить NIB, содержащий новый вид. Это приведет к незначительной задержке при первом открытии вида.

Также, если вы пытаетесь оптимизировать использование памяти, вы можете выгрузить драгоценное представление при переключении на представление

0 голосов
/ 03 декабря 2010

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

Затем создайте подкласс для своего подкласса, чтобы получить настраиваемую функциональность, например

GenericSubclassVC* checkPrimeViewController = [[SpecificSubclassVC alloc] initWithNibName:@"GenericNib" and Bundle:nil];
[self.navigationController pushViewController:checkPrimeViewController animated:YES];

Вы должны придерживаться переопределения назначенного инициализатора. Поместите любой пользовательский код инициализации в методы awakeFromNib или viewDidLoad, в зависимости от того, нужно ли им изменять объекты UIView.

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

...