2016-07-18 9 views
0

私はObjective-Cを初めて使用しています。私はオープン気象マップからデータを解析する天気アプリを作成しようとしています。私は解析されたデータを配列に格納しました。今度は、他のクラスの配列値にアクセスしたいが、ヌル値を取得したい。NSObjectをNSObjectクラスからUIViewControllerクラスに渡すには?

誰でも手伝ってもらえますか?私が試してみました何

:ここ

は、私がデータを格納し、コントローラを表示することを送信しようとしています私のNSObjectクラスです:

- (void)getCurrentWeather:(NSString *)query 
{ 
    NSString *const BASE_URL_STRING = @"http://api.openweathermap.org/data/2.5/weather?q="; 
    NSString *const API_KEY = @"&APPID=APIKEYSTRING"; 

    NSString *weatherURLText = [NSString stringWithFormat:@"%@%@%@", 
    BASE_URL_STRING, query,API_KEY]; 
    NSURL *weatherURL = [NSURL URLWithString:weatherURLText]; 

    dispatch_async(kBgQueue, ^{ 
    NSData* data = [NSData dataWithContentsOfURL:weatherURL]; 
    [self performSelectorOnMainThread:@selector(fetchedDataSmile | :) withObject:data waitUntilDone:YES]; 

    }); 
} 

- (void)fetchedData:(NSData *)responseData { 
    NSError* error; 
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; 

    NSString* cityName = [json objectForKey:@"name"]; 

    int currentTempCelsius = (int)[[[json objectForKey:@"main"] objectForKey:@"temp"] intValue] - ZERO_CELSIUS_IN_KELVIN; 
    int maxTemp = (int)[[[json objectForKey:@"main"] objectForKey:@"temp_max"] intValue] - ZERO_CELSIUS_IN_KELVIN; 
    int minTemp = (int)[[[json objectForKey:@"main"] objectForKey:@"temp_min"] intValue] - ZERO_CELSIUS_IN_KELVIN; 
    NSString *weatherDescription = [[[json objectForKey:@"weather"] objectAtIndexBlush | :O ] objectForKey:@"description"]; 

    weatherArray = [[NSMutableArray alloc] initWithObjects:cityName, weatherDescription, 
    [NSString stringWithFormat:@"%d", currentTempCelsius], 
    [NSString stringWithFormat:@"%d", maxTemp], 
    [NSString stringWithFormat:@"%d", minTemp],nil]; 

私のようにNSObject.hファイルを持っています私のビューコントローラで

@interface WeatherData : NSObject 

@property (nonatomic) NSString *weatherDescription; 
@property (strong, nonatomic) NSString *currentTemp; 
@property (nonatomic) int maxTempCelsius; 
@property (nonatomic) int minTempCelsius; 
@property (nonatomic, retain) NSMutableArray *weatherArray; 

- (void)getCurrentWeather:(NSString *)query; 

@end 

.hファイル:

@property (nonatomic, retain) NSMutableArray *weatherResultArray; 

.mファイル:

-(void)searchButtonClicked:(UIButton*)sender 
{ 
    [self.view endEditing:YES]; 
    WeatherData *weather = [[WeatherData alloc] init]; 
    [weather getCurrentWeather:_textField.text]; 
    self.weatherResultArray = weather.weatherArray; 

    //temperatureLabel.text = [NSString stringWithFormat:@"%d°",weather.currentTempCelsius]; 
} 

は、私はちょうどUILabelでの結果を示したいと思います。

+0

weather.weatherArrayにアクセスしようとすると、データがhttpコールから返されていないため、コードをすばやく確認できます。したがって、self.weatherResultArrayはNULLです。 – jsondwyer

+0

あなたの戻り値の型は上記の関数では無効ですし、どうすれば配列を取得できますか? –

+0

ビューコントローラ間でデータをやり取りするのは簡単です。このためには、NSObject.hにデリゲート関数を作成する必要があります。この関数では、気象データの配列を作成します。 View Controllerファイルにデリゲートを追加するだけで、デリゲートが呼び出されるときにデータが返されます。 – WasimSafdar

答えて

0

は、あなたがこの方法ではこれに代えて

- (NSMutableArray*)getCurrentWeather:(NSString *)query 

をNSMutable配列を返すしようとしたことがあり、

- (void)getCurrentWeather:(NSString *)query 

これは検証とも値にする最も簡単な方法のように、単一の文で取得することができ、次のようになります。

self.weatherResultArray = [weather getCurrentWeather:_textField.text]; 

さらに1つのこと、あなたを割り当てて初期化することを忘れないでくださいr weatherResultArray as:

self.weatherResultArray = [[NSMutableArray alloc]init]; 
0

NSObjectクラスでは、天気プロトコルを定義します。 yourViewControllerクラスで

- (void)fetchedData:(NSData *)responseData { 

NSError* error; 
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; 
    NSString* cityName = [json objectForKey:@"name"]; 

    int currentTempCelsius = (int)[[[json objectForKey:@"main"] objectForKey:@"temp"] intValue] - ZERO_CELSIUS_IN_KELVIN; 
    int maxTemp = (int)[[[json objectForKey:@"main"] objectForKey:@"temp_max"] intValue] - ZERO_CELSIUS_IN_KELVIN; 
    int minTemp = (int)[[[json objectForKey:@"main"] objectForKey:@"temp_min"] intValue] - ZERO_CELSIUS_IN_KELVIN; 
    NSString *weatherDescription = [[[json objectForKey:@"weather"] objectAtIndexBlush | :O ] objectForKey:@"description"]; 

    weatherArray = [[NSMutableArray alloc] initWithObjects:cityName, weatherDescription, 
    [NSString stringWithFormat:@"%d", currentTempCelsius], 
    [NSString stringWithFormat:@"%d", maxTemp], 
    [NSString stringWithFormat:@"%d", minTemp],nil]; 

    id<WeatherDelegate> strongDelegate = self.delegate; 

    if ([strongDelegate respondsToSelector:@selector(getWeatherData:getWeatherData:)]) 
    { 
     [strongDelegate getWeatherData:self getWeatherData:weatherArray]; 
    } 

} 

//NSObject.h file 
@protocol WeatherDelegate<NSObject> 

-(void)getWeatherData:(YourNSObjectClass*)viewController getWeatherData:(NSMutableArray*)array; 

@end 

//NSObject.mファイルは、このWeatherDataプロトコルを追加し、データをフェッチする.mファイルにデリゲート機能を追加します。

@interface yourViewControllerClass()<WeatherDelegate> 
{ 
    YourNSObjectClass *nsClass; 
    NSMutableArray *dataArray; 
} 

-(void)getWeatherData:(YourNSObjectClass*)viewController getWeatherData:(NSMutableArray*)array{ 

dataArray = [[NSMutableArray alloc]initWithArray:array]; 

} 

-(void)searchButtonClicked:(UIButton*)sender 
{ 
    [self.view endEditing:YES]; 
    WeatherData *weather = [[WeatherData alloc] init]; 
    [weather getCurrentWeather:_textField.text]; 
    self.weatherResultArray = dataArray; 

    //temperatureLabel.text = [NSString stringWithFormat:@"%d°",weather.currentTempCelsius]; 
} 
+0

これは一般的な例ですが、私はあなたに役立つことを願っています。 – WasimSafdar

+0

ご協力いただきありがとうございます。しかし、私はまだ問題を抱えています。 –

+0

どの問題が起こっていますか? – WasimSafdar

0

プロトコルを次のように追加する必要がありますか?

@interface WeatherData : NSObject 

@property (nonatomic) NSString *weatherDescription; 
@property (strong, nonatomic) NSString *currentTemp; 
@property (nonatomic) int maxTempCelsius; 
@property (nonatomic) int minTempCelsius; 
@property (nonatomic, strong) NSMutableArray *weatherArray; 

@end 
@protocol WeatherDelegate<NSObject> 

-(void)getWeatherData:(WeatherData *)viewController getWeatherData:(NSMutableArray *)array; 
@end 
関連する問題