iPhone: инициализировать объект в контроллере - PullRequest
0 голосов
/ 08 августа 2009

Я очень новичок в target-c и у меня проблема с инициализацией объекта в контроллере представления. Проблема, с которой я столкнулся, заключается в том, что при вызове метода setTemp на экране выводится «0» вместо значения cTemp, которое я бы хотел. Может кто-нибудь помочь мне в этой проблеме?

Ниже приведены выдержки из кода, который у меня есть.

SJT.h

#import <Foundation/Foundation.h>
#import <stdlib.h>
@interface SJT : NSObject {
int cTemp;
}
- (int) newTemp;
@end

SJT.m

#import "SJT.h"
@implementation SJT
- (int) newTemp
{
    cTemp =  25 + rand() % 8;
    return cTemp;
}
@end

SJTViewController.h

#import <UIKit/UIKit.h>
@class SJT;

@interface SJTViewController : UIViewController {
    IBOutlet UILabel *temp;
    SJT *sjt;
}

@property (retain, nonatomic) UILabel *temp;
@property (retain, nonatomic) SJT *sjt;

- (IBAction) setTemp: (id) sender;

@end

SJTViewController.m

#import "SJTViewController.h"
#import "SJT.h"

@implementation SJTViewController
@synthesize temp;
@synthesize sjt;



- (IBAction) setTemp: (id) sender
{
    NSString *tempText = [[NSString alloc] initWithFormat:@"%d",sjt.newTemp];
    temp.text = tempText;
    [tempText release];
}
.
.
.
@end

Ответы [ 3 ]

2 голосов
/ 08 августа 2009

Проблема в том, что вы ошибочно принимаете синтаксис свойства для вызова метода; т.е.

sjt.newTemp

станет вызовом [sjt newTemp]. Это именно то, что вы хотите, за исключением того, что вы не указали в своем заголовке / реализации, что на самом деле есть свойство с именем newTemp.

Итак, в этом сценарии вы хотите либо a) определить свойство в заголовке:

@property(nonatomic, readonly) int newTemp;

или b) , просто вызовите метод newTemp :

[sjt newTemp]
0 голосов
/ 08 августа 2009

И Джейкоб, и teabot указали действительные возможные причины - какая из них правильная (или обе!) Зависит от фрагментов кода, которые мы не видим в вашем посте.

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

- (IBAction) setTemp: (id) sender {
  int tempInt = [self.sjt newTemp];
  self.temp.text = [NSString stringWithFormat:@"%d", tempInt];
}

, что функционально эквивалентно. Обратите внимание, что удобный конструктор stringWithFormat: возвращает автоматически освобожденный объект, который затем сохраняется свойством retain text temp UILabel.

Еще одна вещь, которую нужно перепроверить в вашем коде, заключается в том, что self.sjt - это не nil, что в точности соответствует словам чайника. Objective-C возвращает 0 при вызовах методов, вызванных по указателю nil.

0 голосов
/ 08 августа 2009

Вы уверены, что sjt не nil? Вы не предоставляете код, где создается экземпляр SJT. В Objective-C вы можете вызвать метод для ссылки nil без ошибок, и если вы сделаете это для метода, который возвращает int, он вернет 0.

То есть sjt.newTemp вернет 0, если sjt равно nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...