2011-12-12 2 views
0

Objective-C에서 프로그래밍하는 데 상당히 익숙합니다. 나는 내 길을 발견 할 수 있었지만 지금은 해결할 수없는 문제가있다. 나는 실수로 인한 것이거나 수업에 대한 근본적인 오해가 있기 때문이다.하나의 클래스가 다른 클래스의 변수 (또는 객체)를 변경하는 방법

기본적으로 한 클래스가 다른 클래스의 변수 (또는 개체)를 변경하도록합니다. 여기에 내가 가지고있는 코드는 다음과 같습니다.

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

@interface LocationManager : NSObject <CLLocationManagerDelegate> { 
    CLLocationManager *locationManager; 
    CLLocation *locationByCustomLocation; 
} 

@property (nonatomic, retain) CLLocation *locationByCustomLocation; 

@end 

물론 구현 파일 LocationManager.m이 있습니다. locationByCustomLocation 변수를 합성합니다.

요점은 다른 클래스에서 locationByCustomLocation 변수를 조작하고 싶다는 것입니다.

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

@interface viewCustomLocation : UIViewController <UITableViewDataSource, UITableViewDelegate> { 
    UITableView *tblLocation; 
    UITableViewCell *cell; 
} 

- 나는 LocationByCustomLocation 변수에 뭐가 있는지보고 LocationManager.m에 NSLog를 사용하는 경우

//viewCustomLocation.m 
#import "viewCustomLocation.h" 
#import "LocationManager.h" 

@class LocationManager; 

@implementation viewCustomLocation 

@synthesize tblLocation; 
@synthesize cell; 

// some view related selectors here, but it boils down to this one: 

- (void)dismissView:(id)sender 
{ 
    [self dismissModalViewControllerAnimated:YES]; 

    LocationManager *locationManager = [[LocationManager alloc] init]; 

    // I made sure with NSLog that the customLoc variable contains the expected data 
    CLLocation *customLoc = [[CLLocation alloc] initWithLatitude:place.coordinate.latitude longitude:place.coordinate.longitude]; 

    [locationManager setLocationByCustomLocation:customLoc]; 
} 

지금, 나는 customLoc에서와 동일한 데이터를 기대. 대신 변수는 여전히 비어있는 것처럼 보입니다.

문제는 내가 LocationManager 클래스 복사본을 만들어서 원래 클래스가 아닌 복사 된 클래스의 LocationByCustomLocation 변수를 채우는 것입니다. 원래 LocationManager 클래스와 대화하는 방법을 알 수 없습니다.

이 문제를 해결할 수있는 몇 가지 방법이 있지만이 방법을 통해 언어에 대한 기본적인 이해를 향상시키는 방법을 알고 싶습니다.

읽어 주셔서 감사합니다.

답변

0

LocationManager의 새 인스턴스를 할당했기 때문입니다. 속성을 선언하고 이에 따라 두 컨트롤러를 연결할 수 있습니다. 당신이 컨트롤러 A에서 컨트롤러 B를 인스턴스화하는 경우

예를 들어, 당신은 너무, firstController처럼, 컨트롤러 B에 대한 속성을 구현해야합니다

B *controller = [[B alloc] init]; 
controller.firstController = A; 

다음 B 컨트롤러 내부에서, 당신이 컨트롤러에서 발생하는 제어를 A

다른 방법은 ApplicationDelegate에서 모든 것을 인스턴스화하고 제어하는 ​​것입니다. 더 강력한 패턴입니다.

+0

응용 프로그램 대리인이 아니라 masterController 클래스에서 모든 것을 인스턴스화하고 제어하는 ​​것이 더 좋은 패턴입니다. 일반적으로 전경/배경 변경, 알림 등에 응답하는 것과 같이 앱 위임에서 애플리케이션 수준의 작업 만 수행하면됩니다. – Rayfleck

+0

@danipralea 답장을 보내 주셔서 감사합니다. 이제는 실제로 LocationManager의 두 번째 인스턴스를 할당하고 있음이 분명합니다. 그러나 지금 문제를 이해하는 동안 제안한 솔루션을 이해하지 못합니다. 조금 더 자세히 설명해 주시겠습니까? –

+0

정확히 무엇을 이해하지 못했습니까? 조금 유치한 것 같지만, 나는 더 나은 이해를 위해 비교하기를 좋아합니다. 예를 들어 앱 위임자는 회사의 보스이며 "알립니다"- 직원 (클래스)에게 메시지를 보냅니다. 물론 위임자의 인스턴스를 호출하는 것만으로도 다른 인스턴스와 같은 클래스 일 수 있습니다. 당신이 그들을 부르는 순서와 그 뒤에있는 논리가 중요한 것입니다.Rayfleck이 말했듯이, 당신은 App Delegate 대신 master 클래스를 사용할 수 있습니다. –

관련 문제