Совместное использование данных/строки с синглтоном между представлениями

Я пытаюсь поделиться строкой между двумя представлениями в моем проекте iPhone. В настоящее время это работает, если я использую фактическое @"что-то здесь" для строки, но если я хочу использовать что-то вроде label.text, это не работает, даже если это все еще строка.

Я покажу вам, что у меня есть, чтобы было понятнее.

Первое представление: Info_ViewController.h

#import <UIKit/UIKit.h>

@interface Info_ViewController : UIViewController {

    IBOutlet UITextField *locationField;

}

@property (nonatomic, retain) NSString *locationString;

+ (id)sharedInfoVC;

@end

Первое представление: Info_ViewController.m

#import "Info_ViewController.h"

static Info_ViewController *sharedInfoVC = nil;

@implementation Info_ViewController
@synthesize locationString;


#pragma mark Singleton Methods
+ (id)sharedInfoVC {
    @synchronized(self) {
        if (sharedInfoVC == nil)
            sharedInfoVC = [[self alloc] init];
        }
    return sharedInfoVC;
}

- (id)init {
    if (self = [super init]) {
        locationString = [[NSString alloc] initWithString:locationField.text]; //This is there part I mentioned earlier, when using @"something" instead of locationField.text works.
    }
    return self;
}

Второе представление: Confirm_ViewController.m

#import "Confirm_ViewController.h"
#import "Info_ViewController.h"

@implementation Confirm_ViewController

- (IBAction)buttonZ:(id)sender
{
    Info_ViewController *infoVCmanager = [Info_ViewController sharedInfoVC];
    locationLabel.text = infoVCmanager.locationString;
}

Я пока поместил его под кнопку, но в конечном итоге он будет под viewDidLoad. Если вы замените locationField.text строкой (@"blahblahblah"), он не будет падать и будет работать.

Когда он падает, я получаю сообщение об ошибке: Программа получила сигнал: "SIGABRT"

РЕДАКТИРОВАТЬ: я пытался изменить

initWithString:locationField.text

to

initWithFormat:@"%@",locationField.text

и теперь моя метка во втором представлении печатает "(NULL)"

Спасибо, что нашли время дать совет, я очень ценю это.


person benwiz    schedule 05.12.2011    source источник
comment
Попробуйте объявить locationString.   -  person Hot Licks    schedule 05.12.2011
comment
Я попытался добавить его в Info_ViewController.h как ivar, но это ничего не изменило. Вы хотели, чтобы я объявил это в другом месте?   -  person benwiz    schedule 05.12.2011


Ответы (3)


Передача nil в качестве строки формата для -[NSString initWithString] является ошибкой.

Итак, как вы передаете ноль? На самом деле у вас есть два экземпляра Info_ViewController. У вас есть один экземпляр, который является обычной частью вашего приложения, а затем у вас также есть второй экземпляр, который является вашим "синглтоном" (который на самом деле больше не является синглтоном).

Таким образом, в вашем «одиночном» экземпляре UITextField равен нулю (и всегда будет равен нулю), поэтому locationField.text равен нулю, и вы передаете его в initWithString:, что является сбоем. На самом деле «синглтон» даже не полностью испечен, когда работает контроллер представления.

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

Надеюсь, это поможет вам понять, что здесь происходит.

person Firoze Lafeer    schedule 05.12.2011
comment
Я пришел к этому пониманию во время серфинга в Интернете, я просто надеялся, что этот способ тоже сработает. Спасибо, вечером попробую. - person benwiz; 06.12.2011
comment
Хорошо, это работает отлично, и это было намного проще. Спасибо за помощь. - person benwiz; 06.12.2011

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

    self.locationString = [[NSString alloc] initWithString:locationField.text]; 
person Rayfleck    schedule 05.12.2011
comment
Когда он падает, я получаю сообщение об ошибке: Программа получила сигнал: SIGABRT - person benwiz; 05.12.2011

Насколько я понимаю ваш код, вы получили значение для locationString, когда вы из текстового поля, когда вы инициализируете viewController. В этот момент ваше текстовое поле не будет видно. После того, как он станет видимым и вы что-то введете, у вас не будет кода для его сохранения в locationString.

Что вам нужно сделать, так это дождаться инициализации и отображения объекта Info_ViewController. Затем при нажатии какой-либо кнопки или другого события назначьте locationLabel.text из locationString или даже напрямую из locationField.text.

Я бы предоставил код, но понятия не имею, как вы его структурируете. Если вам все еще нужна помощь, сообщите подробности.

person MadhavanRP    schedule 05.12.2011