2012-05-03 6 views
1

私はこれについて他のほとんどの投稿を見てきましたが、私はそれを得ることができません。私はiOSとobjective-Cの新人です。Objective-CとiOSの両方のBig Nerd Ranchガイドに従っています。私が自分のサイトで見つけた課題の1つは、単純なCoreLocationアプリケーションを作ることです。コードをクラスに分けようとしているので、後で再利用することができます。ボタンを使って別のクラスのメソッドを呼び出す方法iOS

私のViewController.mファイル内のボタンを取得して、MyLocation.mファイル内のlocationManager(MyLocationクラス)を呼び出したいとします。私は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をやっています。

ありがとうございました。ほんとうにありがとう。

答えて

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 

その後、あなたはMyLocation上で作成CLLocationManagerインスタンスがそのデリゲートメソッドを呼び出しますし。その方法で何をすべきかは、その場所をMyLocationのインスタンス変数に格納することです。後でその場所にアクセスすることができます。

最後に、私はその初期化、またはビューの負荷で、一度だけMyLocationインスタンスを作成するViewControllerを変更します

@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 

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

+0

ありがとうございました。これははるかに明確になります。しかし、私のプログラムはbottonが '[myLocation locationManager]'の行に当たると停止します。 MyLocation.mの '@synthesize locationManager = _locationManager;'に行き、何もしません。私はそれに何が欠けていますか?私は今日まで、私はもっと快適に感じていたと思った。ありがとうございました。 – Siriss

+0

サンプルを再確認してください。コード私は訂正しました。オブジェクトをインスタンス変数に割り当てるときは、自動リリースしないでください! – pgb

+0

更新していただきありがとうございます。私は自動レファレンスを内蔵していますので、オートレリーズはしていませんでしたが、それは同じラインで止まってしまっています。 locationManagerメソッドが見つかりません。 – Siriss

関連する問題