Установка NSDictionary в nil при передаче в другой класс (IOS) - PullRequest
2 голосов
/ 27 января 2012

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

Проходной контроллер:

[tweetController setTweet:tweet];

Receiving Controller.h:

@interface TweetViewController : UIViewController {
    NSDictionary *tweet;
}

@property (nonatomic, retain) NSDictionary *tweet;

Receiving Controller.m:

@implementation TweetViewController

@synthesize tweet = _tweet;

Затем я пытаюсь использовать эту информацию, чтобы установить свойства некоторых полей в моем представлении:

- (void)viewDidLoad
{
    [super viewDidLoad];
    tweetLabel.text = [_tweet objectForKey:@"text"];
}

Результатом является пустая метка, и если я проверяю значение _tweet на этом этапе, то это ноль.

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

Я предполагаю, что автоматическая установка через @synthasize работает, но где-то еще значение теряется.

Извините, это моя первая цель! Спасибо за любую помощь заранее.

Ответы [ 4 ]

2 голосов
/ 27 января 2012

Вы используете свою переменную экземпляра "твит", тогда как свойство "твит" синтезируется в переменную "_tweet".

1 голос
/ 27 января 2012

Вы уверены, что tweetLabel - не ноль?

Я внес несколько исправлений и оптимизаций в ваш код.Вам больше не нужно объявлять ivars в заголовочном файле, они генерируются автоматически с помощью @synthesize

- (void)dealloc;, требуется только в том случае, если вы не используете ARC.

//.h
@interface TweetViewController : UIViewController


@property (strong, nonatomic) NSDictionary *tweet;
@property (strong, nonatomic) IBOutlet UILabel *tweetLabel

@end


//.m
@implementation TweetViewController

@synthesize tweet = _tweet;
@synthesize tweetLabel = _tweetLabel;


- (void)viewDidLoad {
    [super viewDidLoad];

    self.tweetLabel.text = [self.tweet objectForKey:@"text"];
}

- (void)dealloc {

    [_tweet release];
    [_tweetLabel release];

    [super dealloc];
}

@end

Примечание: strong эквивалентно retain

1 голос
/ 27 января 2012

Вы, вероятно, вызываете метод setTweet после выполнения viewDidLoad.Я обычно передаю подобные вещи в пользовательский метод init.В качестве альтернативы, вы можете сделать набор, прежде чем помещать подробный VC в стек навигации.

0 голосов
/ 27 января 2012

Чтобы расширить ответ @ Rayfleck, поскольку вы новичок в Objective-C, ваш пользовательский метод init может выглядеть следующим образом:

В TweetViewController.h:

- (id)initWithTweet:(NSDictionary*)tweet;

В TweetViewController.m:

- (id)initWithTweet:(NSDictionary*)tweet
{
    self = [super init];
    if (self) {
       _tweet = tweet;
    }
    return self;
}

и затем в вашем проходящем контроллере вы будете выделять и инициализировать так:

TweetViewController *tvc = [[TweetViewController alloc] initWithTweet:myTweet];
...