CS193P UITabBarController MVC Справка по заданию 4

Я прохожу курс Stanford CS193P в iTunesU и немного озадачен тем, как сделать часть недавно просмотренных фотографий в задании 4.

В задании у нас должен быть контроллер панели вкладок с двумя вкладками. 1-я вкладка — это навигационный контроллер, который покажет таблицу мест, которая выдвинет таблицу имен фотографий, которая выдвинет прокрутку с фотографией. 2-я вкладка — это навигационный контроллер, который покажет таблицу недавно просмотренных фотографий, которая будет нажать прокрутку с фотографией.

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

  1. Контроллер представления вкладок (если это так, в документах говорится, что этот класс не предназначен для подклассов)

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

  3. Корневой контроллер табличного представления 1-й вкладки (тогда как вторая вкладка извлекает эти данные из первой вкладки?)

  4. Что-то другое

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

В итоге я выталкивал и извлекал данные из пользовательских настроек по умолчанию. Хотя мне любопытно, почему контроллер панели вкладок не предназначен для подкласса. Это кажется наиболее логичным местом для хранения данных, когда они нужны нескольким вкладкам.


person Joe_Schmoe    schedule 09.03.2012    source источник


Ответы (3)


Я сделал что-то подобное, и если я не совсем понял ваш вопрос, вы могли бы создать Singelton, который мог бы действовать как какая-то общая база данных. Он никогда не будет инициализирован обычным образом, он будет создан только при первом использовании. Этот синглтон может содержать ваш массив, и вы можете вызывать его отовсюду, просто написав:

[SingeltonType main].sharedPhotos

Следующий пример взят из моего собственного кода, где у меня есть «Пользователь», который является владельцем приложения. Там я храню базу данных с информацией, которая будет доступна из любого места во время выполнения.

заголовок:

@interface User : NSObject {
Database *_storage;
}

@property (nonatomic, retain) Database *storage;

+(User*)owner;

основной файл:

#import "User.h"

@implementation User

@synthesize password = storage = _storage;

static User* _owner = nil;

+(User*)owner {
    @synchronized([User class]) {
        if(!_owner) [[self alloc] init];

        return _owner;
    }
    return nil;
}

+(id)alloc {
    @synchronized([User class]) {
        NSAssert(_owner == nil, @"Attempted to allocate a second instance of a singleton.");
        _owner = [super alloc];

        return _owner;
    }
    return nil;
}

-(id)init {
    self = [super init];

    if(self != nil) {
        self.storage = [[[Database alloc] init] autorelease];
    }
    return self;
}

Тогда я просто называю это так:

[User owner].storage // which gives me access to it 

Надеюсь, это поможет! Действительно полезно, если вам нужно получить доступ к данным из разных мест :)

Примечание. У вас будет только ОДИН экземпляр этого объекта, и вы не сможете создать больше.

person chikuba    schedule 09.03.2012

После множества дополнительных поисков я не нашел ни одного последовательного способа передачи данных с вкладки на вкладку.

Поскольку мы храним только относительно небольшой объем данных, я решил создать класс с методами класса (для удобства) для передачи и извлечения данных в пользовательские значения по умолчанию.

person Joe_Schmoe    schedule 10.03.2012
comment
не могли бы вы использовать синглтон для этого? тогда вам не нужно передавать ссылку на него, поскольку вы никогда не создаете его обычным способом. это похоже на статическую переменную, но вы можете иметь методы и переменные, связанные с ней, и когда вы добавляете к ней что-то на одной вкладке, она будет там, когда вы извлекаете ее на другой вкладке. - person chikuba; 10.03.2012
comment
Не понимаю, почему бы и нет, но еще одной функцией, необходимой для этого задания, было сохранение недавно просмотренных фотографий между запусками приложения. Таким образом, пользовательские настройки по умолчанию выполняют обе задачи. - person Joe_Schmoe; 11.03.2012
comment
Скрытие недавних фотографий в отдельном классе звучит как хорошая идея. Однако вам все равно нужно где-то создать этот класс и передать экземпляр между контроллерами. Как вы этого добились? - person aleene; 15.03.2012

Я немного возился с этим вопросом, используя протокол. Я создал протокол в классе, отображающем изображение (и UIScrollView). Затем я принял протокол в классе tableController «просмотренных фотографий» и реализовал этот метод протокола, который передает просматриваемое изображение. Проблема, с которой я столкнулся, заключается в том, как определить класс tableController «просмотренных фотографий» в качестве делегата, учитывая, что 1) он еще не загружен и может не загружаться до тех пор, пока не просмотрит изображения 2) как вы работаете по-своему, хотя навигация контроллеры и контроллер вкладок, чтобы указать на класс, объявляющий протокол. Хотел бы услышать от экспертов здесь о том, является ли метод протокола или класса правильным здесь из методологии программирования?

Спасибо, КБ

person Khaled Barazi    schedule 05.07.2012