UIViewController подкласс для поддержки загрузки NIB и не - PullRequest
3 голосов
/ 09 февраля 2011

Я нахожусь в процессе создания инфраструктуры для внутреннего использования и сталкиваюсь с проблемами создания гибкого контроллера представления с настраиваемым представлением.

Цель состоит в том, чтобы иметь реализацию, аналогичную UITableViewController:

  • Если контроллер представления инициализируется с помощью пера (или, если обнаружен перо с тем же именем), он использует определенные в нем выходы для определения своего вида. Разработчик должен убедиться, что используется правильный подкласс UIView.
  • Если контроллер представления инициализируется без кончика (или если кончик не может быть найден), он создает свое собственное представление, используя правильный подкласс UIView.

В качестве первого удара я переопределил -loadView, чтобы создать собственное представление. Это то, что вы бы сделали, если бы вас не интересовали перья, и это прекрасно работает. Однако, если я пытаюсь загрузить перо (например, -initWithNibNamed:bundle:), выполняется метод -loadView, и перо игнорируется.

Я также пытался использовать -nibName, чтобы определить, было ли передано имя пера, и это ЧАСТИЧНО работает, но не работает, если передано nil (что все еще допустимо, и должно абсолютно работать, если есть перо с тем же именем, что и контроллер вида).

Имейте в виду, что я создаю фреймворк, который будет использоваться другими разработчиками. Ключевые слова: «гибкий» и «надежный».

Любая помощь была бы больше, чем сейчас. Большое спасибо.

Редактировать: Решено

Как указывалось в предложении @ bunnyhero, приведенном ниже, проверка доступности пера во время -loadView и попытка воссоздать его реализацию по умолчанию оказались полезными. Я остановился на чем-то вроде этого:

- (void)loadView {
    NSString *nib = self.nibName;
    NSBundle *bundle = self.nibBundle;
    if(!nib) nib = NSStringFromClass([self class]);
    if(!bundle) bundle = [NSBundle mainBundle];

    NSString *path = [bundle pathForResource:nib ofType:@"nib"];

    if(path) {
            [bundle loadNibNamed:nib owner:self options:nil];
            return;
    }

    // Create custom view programmatically here.
}

Спасибо @ bunnyhero

1 Ответ

3 голосов
/ 09 февраля 2011

Что если вы объедините свою проверку nibName nil с ручной проверкой для nib с тем же именем, что и у контроллера вида?

Может быть, что-то вроде этого (непроверенный код на моей голове):

if ([self nibName] != nil || [[self nibBundle] pathForResource:NSStringFromClass([self class]) ofType:@"xib"] != nil)
{
    // nib file exists...
}

Я признаю, что это довольно грубо и косвенно:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...