1

managedObjectContext をビュー コントローラーに配布しようとしているときに、次のエラーを受け取りました: プロパティ 'managedObjectContext' がタイプ 'UIViewController *' のオブジェクトに見つかりません。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    UIViewController *searchController = [[SearchCriteriaViewController alloc] initWithNibName:@"SearchCriteriaViewController" bundle:nil];
    UIViewController *managementController = [[WineManagementViewController alloc] initWithNibName:@"WineManagementViewController" bundle:nil];

    managementController.managedObjectContext = self.managedObjectContext;

WineManagementViewController のコードは次のようになります。

@interface WineManagementViewController : UIViewController <NSFetchedResultsControllerDelegate>
{
    IBOutlet UIButton *countryButton;
    WineStore *store;
}

- (IBAction)newCountry:(id)sender;

@property (strong, nonatomic) UIPopoverController *poCtrl;
@property (strong, nonatomic) WineStore *store;
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

そして、これは実装の始まりです:

@implementation WineManagementViewController
@synthesize store, managedObjectContext;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
...

その方法でアクセスしたい場合、またはsetterメソッドでアクセスしたい場合、プロパティが見つかりません。このプロパティが見つからない理由を知っている人はいますか?

4

2 に答える 2

1

次のようにする必要があります。

WineManagementViewController *managementController = [[WineManagementViewController alloc] initWithNibName:@"WineManagementViewController" bundle:nil];
于 2013-01-27T12:02:21.440 に答える
0

ドット構文を使用することの利点は、もう少し型チェックを行うことです。

あなたがしたことは、新しい managementController オブジェクトをUIViewController実際の type ではなくとして宣言したことWineManagementViewControllerです。これは、リスコフの置換原理の下では完全に有効です。

ただし、ドット構文を使用してプロパティ値を設定しているため、コンパイラは、オブジェクトが実際にはWineManagementViewControllerオブジェクトUIViewControllerではなく、managedObjectContext プロパティを持たないオブジェクトであることを認識できません。

これは、using メソッド送信構文が役立つ場所です。宣言をそのままにしておくと、次のようなコードを書くのに問題はありません。

UIViewController *managementController = [[WineManagementViewController alloc] initWithNibName:@"WineManagementViewController" bundle:nil];

[managementController setManagedObjectContext:self.managedObjectContext];

メソッド送信構文を使用すると、同じ型チェックが行われないためです。実行時にオブジェクトにメッセージを喜んで送信し、メソッドが実装されていない場合は例外をスローします。

そう; あなたがしていることは間違っていません。コンパイラがうるさいだけです。

于 2013-01-27T12:10:11.033 に答える