-1

PrefMySpotsViewCtrl.h

@class Location;

@interface PrefMySpotsViewCtrl : NSViewController
{
  NSTextField *locationSearchInput;
  NSString * enteredLocation;

  Location *l;
}

@property (nonatomic, retain) IBOutlet NSTextField *locationSearchInput;
@property (nonatomic, retain) NSString *enteredLocation;

PrefMySpotsViewCtrl.m

#import "Location.h"


- (void) controlTextDidChange:(NSNotification *)aNotification
{
   enteredLocation = [locationSearchInput stringValue];
   NSLog(@"in class:%@", enteredLocation);
   [l searchLocation];
}

Location.h

@class PrefMySpotsViewCtrl;

@interface Location : NSObject

{
  PrefMySpotsViewCtrl *p;  
}

- (void) searchLocation;

Location.m

#import "Location.h"
#import "PrefMySpotsViewCtrl.h"

@implementation Location

- (void) searchLocation
{
   NSLog(@"out of class: %@", [p enteredLocation]);
}

ユーザーが a を入力するlocationSearchInputと、ここに出力が表示されます

2012-09-30 10:18:12.915 MyApp[839:303] in class:
2012-09-30 10:18:12.917 MyApp[839:303] in class:a

searchLocationメソッドは実行されません。

もしそうならl = [[Location alloc] init];searchLocation実行されますが、出力はnull

2012-09-30 10:28:46.928 MyApp[880:303] in class:
2012-09-30 10:28:46.929 MyApp[880:303] out of class: (null)
2012-09-30 10:28:46.930 MyApp[880:303] in class:a
2012-09-30 10:28:46.931 MyApp[880:303] out of class: (null)

何か案が?

ありがとう?

4

2 に答える 2

2

しかし、問題は: コントローラー (PrefMySpotsViewCtrl) の有効なインスタンスをロケーション オブジェクトに割り当てましたか?

つまり :

l = [[Location alloc] init];
l->p = self;
[l searchLocation];

次のように、PrefMySpotsViewCtrl を Location 宣言のプロパティとして宣言することをお勧めします。

@interface Location : NSObject
{
  PrefMySpotsViewCtrl *p;  
}
@property (nonatomic, assign) PrefMySpotsViewCtrl *p;

そして、プロパティ セッターを使用して割り当てます。

l = [[Location alloc] init];
l.p = self;
[l searchLocation];

編集

以下のコメントから、OPはロジックを理解していないように見えるため、簡単な例を投稿して、彼がよりよく理解できるようにします。

1) ClassA 宣言:

@interface ClassA : NSObject
@property(nonatomic,retain) NSString *ABC;
@end

2) ClassB 宣言:

@interface ClassB : NSObject 
@property(nonatomic,assign) ClassA *p;
-(void) printClassAvar;
@end

@implementation ClassB
-(void) printClassAvar {
    NSLog(@"Variable = %@", [self.p ABC]);
}
@end

3) 使用法:

ClassA *a = [ClassA new];
a.ABC = @"XZY";
ClassB *b = [ClassB new];
b.p = a;
[b printClassAvar];
于 2012-09-30T08:42:39.933 に答える
1

init メソッドを表示していません。

の iVar を実際に作成していない可能性がありますl。つまり、次のようなものです:

// in the view controllers `initWithNibName:bundle:` method
l = [Location alloc] init]; // or whatever the inititializer for a Location object is.

タイプのオブジェクトを作成していないためlnilとにかく新しいLLVMコンパイラを使用)、メッセージを受信しないため、メソッドが呼び出されることはありません。

于 2012-09-30T08:42:56.580 に答える