Совместное использование данных / строки с одноэлементным между представлениями - PullRequest
0 голосов
/ 05 декабря 2011

Я пытаюсь разделить строку между двумя представлениями в моем проекте 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

до

initWithFormat:@"%@",locationField.text

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

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

Ответы [ 3 ]

1 голос
/ 05 декабря 2011

Ошибка передавать nil в качестве строки формата в [NSString initWithString].

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

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

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

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

0 голосов
/ 05 декабря 2011

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

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

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

0 голосов
/ 05 декабря 2011

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

    self.locationString = [[NSString alloc] initWithString:locationField.text]; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...