2013-05-31 5 views
2

У меня есть 2 контроллера просмотра, которые содержат данные об объекте, которые я хочу сохранить в качестве избранного. Оба контроллера содержат один и тот же тип объекта < Release> который я хочу сохранить в избранном классе.Связывание объекта между 2 классами объектива c?

Любимый класс довольно прост, он имеет 3 функции addFavourite, removeFavourite и getFavourites. Что я хочу сделать, так это то, что оба View Controllers могут добавлять объекты в класс Favorite и получать массив favouriteObjects из объекта Favorite.

То, что я пытался делал Любимый класс статичным, как это:

@implementation Favourites 
static Favourites * favourites = nil; 
-(id)init { 
if(favourites == nil) { 
    if((favourites = [super init])) { 
    return favourites; 
    } 
} 
return favourites; 
} 
@end 

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

С уважением, Sem Wong.

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

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

Редактировать 2: Похоже, я ничего не могу возвысить, но хе-хе :). Спасибо Wain и Lithu T.V и Anum90 за отличные ответы :).

+1

, что вы называете *, что делает Favourit e class static * - это попытка создать одноэлемент. это не то, что тривиально в объективе-с. пожалуйста, найдите его, есть много сообщений об этом. – vikingosegundo

ответ

1

Вы можете искать для singleton instance

Как я использую его

+(Favourites *)sharedInstance 
{ 
    static Favourites*_sharedClient = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     _sharedClient = [[Favourites alloc]init]; 
    }); 
    return _sharedClient; 

} 

вы можете вызвать его в классах, как

[Favourites sharedInstance]; 

Это вернет вам объект, который инициализируется один раз и вернуть этот экземпляр всякий раз, когда вы вызываете

+0

При попытке вашего кода у меня возникла ошибка при попытке написать _sharedClient = [[Избранное alloc] init]; что я должен попробовать sharedCleint = [[Избранное alloc] init]; вместо. Это то, что я ищу? –

+0

Обратите внимание, что я объявляю 'static Favorites * _sharedClient = nil;' использовал это или вы пробовали без подчеркивания? –

+0

Да, я исправил это :). Спасибо за ответ, я получил его сейчас –

1

Try Структурирование фаворитов класс, как это:

@implementation Favourites 

- (Favourites *)sharedFavourites 
{ 
static dispatch_once_t pred = 0; 
__strong static id _sharedObject = nil; 
dispatch_once(&pred, ^{ 
    _sharedObject = [[self alloc] init]; 
}); 

return _sharedObject; 
} 

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

return self; 
} 

@end 

Затем все контроллеры, которым необходим доступ к favoutires должны вызвать [Favourites sharedFavourites], чтобы получить экземпляр (ни один контроллер не должен вызывать init).

+0

Спасибо, ваш ответ был в основном таким же, как ответ выше, который я использовал для его исправления. Однако ваша последняя небольшая информация, о которой вы говорили о том, чтобы не использовать init нигде, была спасателем жизни :). –

-1

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

@interface Favourites : NSObject 
+(Favourites *)sharedManager; 
@end 

@implementation Favourites 

static Favourites *instance = nil; 

+ (Favourites *)sharedManager { 

    static dispatch_once_t onceToken; 

    dispatch_once(&onceToken, ^{ 
     if (instance == nil){ 
      instance = [[self alloc] init]; 
     } 
    }); 
    return instance; 
} 

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

+ (id)allocWithZone:(NSZone *)zone 
{ 
    return [self sharedManager]; 
} 

-(void) addFavorite 
{ 
//Do anything or pass any data by making function with argument 
} 

@end 

Anywhere, вы можете назвать это после импорта, как,

[[Favourites sharedManager] addFavorite]; 

Если вы будете звонить Favorite из любой точки мира, и это было не выделяется прежде, он будет автоматически вызывать инициализации и назначит вам объект. Каждый раз, когда вы его вызываете, он возвращает тот же выделенный экземпляр.

+0

Кто бы ни отклонил, дайте мне основание для этого плз! – NightFury

Смежные вопросы