Objective-C Передача параметров в класс делегата - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть проект XCode, который в основном загружает и анализирует XML-файл, который выводит список, список мест (мест), близких к текущему местоположению пользователей.Первоначально я жестко запрограммировал координаты долготы и широты, чтобы убедиться, что мой xml обрабатывался правильно (что это такое), но теперь я пытаюсь передать текущее местоположение пользователя, чтобы определить ближайшие местоположения пользователя (аналогично магазину).искатель).У меня есть файл класса делегата, который обрабатывает загрузку XML-файла и файл rootViewController, который обрабатывает текущее местоположение пользователя.Моя проблема в том, что я не знаю лучшего способа передачи параметров из одного класса в класс делегата ... Извините, я знаю, что это просто, но я борюсь с этим:)

Вот два фрагментаоснова того, что у меня есть:

RootViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];

    // Get Current Location
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
    [locationManager startUpdatingLocation];

    appDelegate = (XMLAppDelegate *)[[UIApplication sharedApplication] delegate];

}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    int degrees = newLocation.coordinate.latitude;
    double decimal = fabs(newLocation.coordinate.latitude - degrees);
    int minutes = decimal * 60;
    double seconds = decimal * 3600 - minutes * 60;
    NSString *lat = [NSString stringWithFormat:@"%d° %d' %1.4f\"", degrees, minutes, seconds];

    degrees = newLocation.coordinate.longitude;
    decimal = fabs(newLocation.coordinate.longitude - degrees);
    minutes = decimal * 60;
    seconds = decimal * 3600 - minutes * 60;
    NSString *longt = [NSString stringWithFormat:@"%d° %d' %1.4f\"", degrees, minutes, seconds];

    NSLog(@"longt Value: %@", longt);
}

XMLAppDelegate.m

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    //This code is incorrect (displays 'null') I want to display the values defined in the locationManager Method on RootViewController.m
    NSLog(@"lat Value: %@", currentLocation.coordinate.latitude);

    // Longitude and Latitude codes are hard-coded. I want to change this to dynamic values which are defined in the locationManager Method on RootViewController.m
    NSURL *url = [[NSURL alloc] initWithString:@"http://www.domain.com/phpsqlsearch_genxml.php?lat=-33.870017&lng=151.206547&radius=25"];

    //More code here....
}

Я могу отобразить результаты (NSLog) в файле RootViewController.m, но не в файле XMLAppDelegate.m.Мне нужно выяснить, как лучше всего передать параметры из RootViewController.m в XMLAppDelegate.m?

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Приветствия

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Ваши классы будут выглядеть примерно так с возможностью общения друг с другом:

RootViewController.h:

#import <Foundation/Foundation.h>
#import <CoreLoation/CoreLocation.h>
#import <UIKit/UIKit.h>
#import "XMLAppDelegate.h"

@interface RootViewController: UIViewController <CLLocationManagerDelegate, CustomDelegateProtocol> {
    float lon, lat;
}

@end

RootViewController.m:

#import "RootViewController.h"

@implementation RootViewController

// super

- (void)viewDidLoad {
    [super viewDidLoad];

    // Get Current Location
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
    [locationManager startUpdatingLocation];

    appDelegate = (XMLAppDelegate *)[[UIApplication sharedApplication] delegate];

}

// CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    int degrees = newLocation.coordinate.latitude;
    double decimal = fabs(newLocation.coordinate.latitude - degrees);
    int minutes = decimal * 60;
    double seconds = decimal * 3600 - minutes * 60;
    NSString *lat = [NSString stringWithFormat:@"%d° %d' %1.4f\"", degrees, minutes, seconds];

    degrees = newLocation.coordinate.longitude;
    decimal = fabs(newLocation.coordinate.longitude - degrees);
    minutes = decimal * 60;
    seconds = decimal * 3600 - minutes * 60;
    NSString *longt = [NSString stringWithFormat:@"%d° %d' %1.4f\"", degrees, minutes, seconds];

    NSLog(@"longt Value: %@", longt);
}

// CustomDelegateProtocol

@synthesize lon = lon, lat = lat;

@end

XMLAppDelegate.h:

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

@protocol CustomDelegateProtocol

@property (assign) float lon;
@property (assign) float lat;

@end

@interface XMLAppDelegate: NSObject <UIApplicationDelegate> {
    // whatever instance variables you need, put them here
    id <CustomDelegateProtocol> delegate;
}

@end

XMLAppDelegate.m:

#import "XMLAppDelegate.h"

@implementation XMLAppDelegate

/*
- (void)applicationDidFinishLaunching:(UIApplication *)application {
    // BTW: don't use this to obtain location info if you're NOT setting up your UI from code...
    // It has (conceptually, but also practically) be done in your view controller.
    // That's why it is called a view controller: it "glues" view and logic code together
    // and that way you won't even need the delegate
    // I also recommend using the -application:didFinishLaunchingWithOptions: method. This one is deprecated.
}
*/

- (BOOL) application:(UIApplication *)app didFinishLaunhingWithOptions:(NSDictionary *)launchOpts {
    // set up initial stuff, etc...
    // and if you *really, badly* want to use the delegation model, here you are:
    NSString *urlString = [[NSString alloc] initWithFormat: @"http://www.domain.com/phpsqlsearch_genxml.php?lat=-%f&lng=%f&radius=25", self.delegate.lat, self.delegate.lon];
    NSURL *url = [[NSURL alloc] initWithString:urlString];
    [urlString release];

    // do whatever you want to 


    return YES;
}

@end

Надеюсь, это поможет.

1 голос
/ 14 декабря 2011

Я бы сказал, делай так, как это делает Apple. Допустим, мы берем UITableView в качестве примера.

Во-первых, delegate - это объект, который будет help другим классом, вы должны думать о delegate как о helper классе (я знаю, что это не совсем так).
Таким образом, в случае UITableView UITableView запрашивает у своего делегата какую-то работу, а поскольку он запрашивает, прослушивает return to.
Когда вы получаете этот звонок от UITableView

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 

Вы отправляете обратно информацию master делегата о том, сколько разделов должно быть в UITableView.

Во-вторых, если вы внимательно посмотрите на сигнатуру метода, вы увидите, что master передает себя в качестве параметра, поэтому delegate может запросить у master дополнительную информацию, если это необходимо.

Так вот, как это работает, у master есть указатель на delegate, чтобы иметь возможность задать ему какой-то вопрос, и delegate узнает, что это master, когда он получает вызов. delegate может хранить указатель на master, но, как вы видите, в этом нет необходимости.

Это означает, что у вас всегда есть ссылка на delegate или master, и если у вас есть ссылка на нее, отправка информации не является проблемой.

И помните, что делегат должен предоставлять информацию своему хозяину, поэтому, если я правильно прочитал ваш код, вы делаете обратное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...