1

我几乎看过所有其他关于此的帖子,但我似乎无法理解。我是 iOS 和 Objective-C 的新手,我正在关注 Objective-C 和 iOS 的 Big Nerd Ranch 指南。我在他们的网站上发现的挑战之一是制作一个简单的 CoreLocation 应用程序,我正在尝试将代码分离到类中,以便以后可以根据需要重用它。

我想在我的 ViewController.m 文件中获取按钮来调用 MyLocation.m 文件中的 locationManager,这是 MyLocation 类。我已经研究过 NSNotificaiton,但我也无法让它正常工作。

我一生都无法弄清楚我错过了什么或做错了什么。对于这个问题的简单性,我深表歉意,我正在努力学习尽可能多的基础知识。

以下是我的文件:

视图控制器.h:

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

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

@end

视图控制器.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

我的位置.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

我的位置.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

为了向对象发送消息,您需要对其进行引用。在您发布的两个类中,您有同样的问题:您没有对它们的引用,因此您将无法向它们发送消息。

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,以便您以后可以访问它。

最后,我将更改为仅在初始化或视图加载时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 回答