-1

私が使用した最終的な解決策:このメソッドは私にはうまく機能せず、転送する必要のある変数が2つしかないため、NSNotificationCenterを使用してオブジェクトを送信することにしました。転送するオブジェクトが非常に少ない場合にのみこれを使用してください。そうしないと、非常に乱雑になる可能性があります。これについて詳しく知りたい場合は、この質問を確認することをお勧めします。NSNotificationGoodLuckを使用してNSString変数を他のクラスに渡します

App Delegateからデータにアクセスしようとしていますが、常に(null)を取得しています。

編集:誰かが完全なコードを望んでいるなら、ここにあります:http: //pastebin.com/hNUPMcvB

AppDelegateのコードは次のとおりです。

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    // Stop Location Services
    [locationManager stopUpdatingLocation];
    // Some Reverse Geocoding...
    CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
    [geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
        for (CLPlacemark * placemark in placemarks) {
            City = [[placemark locality] stringByReplacingOccurrencesOfString:@" " withString:@"+"];
            State = [[placemark administrativeArea] stringByReplacingOccurrencesOfString:@" " withString:@"+"];
            Final = [NSString stringWithFormat:@"%@,%@", City, State];
            currentLocation = [NSString stringWithFormat:@"%@", Final];
            [self everythingelse];
            NSLog(@"AAA%@", currentLocation);
        }
    }
     ];

}

これは、他のViewControllerからコードにアクセスする方法です。

    ForecasterAppDelegate *BossMan = (ForecasterAppDelegate *)[[UIApplication sharedApplication] delegate];
    CurrentLocation = BossMan.currentLocation;
    NSLog(@"CCC%@", CurrentLocation);

常にCCC(null)としてログに記録されます。私のAppDelegateでは正しく表示されますが、他のViewControllerでは正しく表示されません。私は小さな間違いか大きな間違いのどちらかを犯しています、どんな助けでも素晴らしいでしょう!

編集:これが私のヘッダーファイルです:

My App Delegate .h:

@interface ForecasterAppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate> {
    UIStoryboard *storyboard;
    NSString *City, *State, *Final, *currentLocation;
    NSMutableString *FinalQuery;
    CLLocationManager *locationManager;
    CLPlacemark * myPlacemark;
}

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic,retain) CLLocationManager *locationManager;
@property (nonatomic, retain) NSMutableString *FinalQuery;
@property (strong, nonatomic) NSString *currentLocation;
@property (nonatomic, retain) NSString *Final;

これが私のViewController.hファイルです。

@interface View1 : UIViewController <CLLocationManagerDelegate, LocationDamn> {
        CLLocationManager *locationManager;
        CLPlacemark * myPlacemark;
        NSString *launchpath;
        NSString *City, *State, *condition, *Final, *degreesign, *changeLocation, *currentLocations;
    }


    @property (nonatomic,retain) CLLocationManager *locationManager;
    @property (nonatomic,retain) IBOutlet UILabel *currentTempLabel, *highTempLabel, *lowTempLabel, *conditionsLabel, *cityLabel, *day2c, *day3c, *currentconditions;
    @property (nonatomic,retain) IBOutlet NSString *currentLocations;



    @end

ViewControllerのviewdidloadには、次のものがあります。

    [self performSelector:@selector(DoSomethingCool) withObject:nil afterDelay:1.5];

これにより、ロケーションマネージャーはロケーションを取得する時間ができます。

4

2 に答える 2

2

値を割り当てるときにセッターを使用していないため、値が保持されません。変更してみてください:

currentLocation = [NSString stringWithFormat:@"%@", Final];

self.currentLocation = [NSString stringWithFormat:@"%@", Final];

混乱を避けるために、ヘッダーでインスタンス変数を宣言するのをやめることができます...これを試してください:

@interface ForecasterAppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate> 

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic,retain) CLLocationManager *locationManager;
@property (nonatomic, retain) NSMutableString *FinalQuery;
@property (strong, nonatomic) NSString *currentLocation;
@property (nonatomic, retain) NSString *Final;

これを実装に追加します

@sysnthesize window=_window, locationManager=_locationManager, FinalQuery = _FinalQuery, currentLocation=_currentLocation, Final=_final;

それが標準的な方法です。

 currentLocation = [NSString stringWithFormat:@"%@", Final];

コンパイラはエラーをスローします。これにより、誤ってインスタンス変数を設定することを防ぐことができます。さて、これらの変更により、あなたの本当の問題が明らかになり始めます。あなたのコードは次のような値を設定していました

_currentLocation = [NSString stringWithFormat:@"%@",Final];

これにより、インスタンス変数が直接設定されるため、値は保持されません。値が保持されていないため、値はおそらく次の中括弧で破棄されます。self.currentLocation = some valueとしてselfをプレフィックスとして付けると、その値を保持するセッターに渡します。そうすれば、すべてのViewControllerで利用できるようになります:)

これがお役に立てば幸いです。混乱する場合はお知らせください。少し編集してみます。

于 2012-07-11T23:47:52.650 に答える
0

どこで定義するかによりますCurrentLocation。他のViewController(私が想定した)からアクセスしている間はエラーが発生しないため、ファイル内CurrentLocationのプロパティとして定義しました。ForecasterAppDelegate.hにretainプロパティを追加するのを忘れた可能性がありますCurrentLocation。または、ARCを使用strongしている場合は、以下のように使用できます。

@property(strong) NSString *currentLocation

于 2012-07-11T22:13:37.210 に答える