1

私はこれに関する他のほとんどすべての投稿を見てきましたが、私はそれを得ることができないようです。私はiOSとObjective-Cを初めて使用し、Objective-CとiOSの両方のBigNerdRanchガイドに従っています。彼らのサイトで私が見つけた課題の1つは、単純なCoreLocationアプリを作成することです。コードをクラスに分割して、後で再利用できるようにしようとしています。

ViewController.mファイルのボタンを取得して、MyLocationクラスであるMyLocation.mファイルのlocationManagerを呼び出したいと思います。NSNotificaitonを調べましたが、それも正しく機能しませんでした。

私は一生の間、自分が何を見逃しているのか、何を間違っているのかを理解することはできません。質問が単純であることをお詫び申し上げます。できるだけ多くの基本を学ぼうとしています。

以下は私のファイルです:

ViewController.h:

#import <UIKit/UIKit.h>
#import "MyLocation.h"

@interface ViewController : UIViewController
- (IBAction)GetLocation:(id)sender;
@property (weak, nonatomic) IBOutlet UILabel *LocationOutput;

@end

ViewController.m:

#import "ViewController.h"
#import "MyLocation.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize LocationOutput;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
    [self setLocationOutput:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (IBAction)GetLocation:(id)sender {

    //WHAT GOES HERE?
}
@end

MyLocation.h:

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>

@class MyLocation;

@protocol MyLocationDelegate <NSObject>;

@end

@interface MyLocation : NSObject <CLLocationManagerDelegate>
@property (nonatomic, strong) CLLocationManager *locationManager;

@end

MyLocation.m:

#import "MyLocation.h"

@implementation MyLocation
@synthesize locationManager = _locationManager;

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    NSLog(@"Latitude is: %f", newLocation.coordinate.latitude);
}

@end

ラベルにはまだ何も出力していないことはわかっていますが、NSLogを実行しています。

助けてくれてありがとう。ほんとうにありがとう。

4

1 に答える 1

2

オブジェクトにメッセージを送信するには、オブジェクトへの参照が必要です。投稿している2つのクラスで、同じ問題が発生します。それらへの参照がないため、メッセージを送信できません。

ではViewController、何らかの方法でオブジェクトへの参照を取得する必要がありMyLocationます。たとえば、コードを次のように変更した場合:

- (IBAction)GetLocation:(id)sender {
    MyLocation *myLocation = [[[MyLocation alloc] init] autorelease];
    [myLocation someMethod];
}

これにより、アクションが呼び出されるたびに、新しいMyLocationオブジェクトがインスタンス化され、someMethodメッセージが送信されます。あなたの場合、これはもう少し複雑です。クラスにはインスタンス化MyLocationされたインスタンスが必要CLLocationManagerです。おそらく、そのためのインスタンス変数が必要であり、次のようなことを行います。

@interface MyLocation {
    CLLocationManager *_locationMananger;
}
@end

@implementation MyLocation

- (id)init {
   self = [super init];
   if (self) {
       _locationManager = [[CLLocationManager alloc] init];
       _locationManager.delegate = self;
   }
   return self;
}

- (void)dealloc {
   [_locationManager release];

   [super dealloc];
}

@end

次に、CLLocationManager作成したインスタンスはMyLocation、場所が変更されたときにそのデリゲートメソッドを呼び出します。そのメソッドで行うべきことは、その場所をのインスタンス変数に格納するMyLocationことです。これにより、後でアクセスできるようになります。

最後に、を変更して、インスタンスを1回だけViewController作成するか、初期化するか、ロードを表示します。MyLocation

@interface ViewController {
    MyLocation *_myLocation;
}
@end

@implementation ViewController

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle {
    self = [super initWithNibName:nibName bundle:bundle];
    if (self) {
        _myLocation = [[MyLocation alloc] init];
    }
    return self;
}

- (void)dealloc {
   [_myLocation release];
   [super dealloc];
}

- (IBAction)GetLocation:(id)sender {
   // Grab the location from _myLocation using a property or method defined
}

@end

あなたがアイデアを得て、これがあなたを始めることができることを願っています。

于 2012-05-03T20:48:39.580 に答える