2010-01-17 91 views
1

我在主屏幕上有4個按鈕,每個按鈕都將我發送給viewController。第三個,發送給我想要設置managedObjectContext的視圖。如果我使用類名來創建一個實例,那沒關係。但我正在尋找一種方法來使用一種方法,它使用一個數組來檢索所需viewController的Class的名稱。但它導致了一個錯誤消息,就像它不存在於目標viewController中一樣?任何人有關於這個問題的任何想法?提前致謝!如何將managedObjectContext分配給動態viewController?

下面是代碼:

NSArray *viewControllers = [[NSArray alloc] 
initWithObjects:@"nil",@"OpcoesView",@"nil",@"TheNames", nil]; 

NSString *viewName = [viewControllers objectAtIndex:[sender tag]]; //the taped button tag 

UIViewController *viewController = [[NSClassFromString(viewName) alloc] 
initWithNibName:viewName bundle:nil]; 


if ([sender tag] == 3) { 
    viewController.managedObjectContext = contexto; 
} 

回答

2

根本不需要知道子類。由於Objective-C是一種動態語言,消息在運行時被解析,所以您可以發送消息,而不必知道任何有關子類的信息。

首先我會將子類作爲id(而不是UIViewController)來引用,只要你有它的頭文件導入,你可以直接調用[viewController setManagedObjectContext:contexto]

但是,如果你不想或者不能導入頭就用KVC如下:

[viewController setValue:contexto forKey:@"managedObjectContext"]; 
+0

好點。我重新回答了我的答案。我可能會爭辯說,應儘可能使用特定的類來澄清和編譯器的幫助,但這只是我的看法。 – gerry3 2010-01-18 04:05:41

+0

在Objective-C中投射通常是不必要的,而且當來自其他強類型語言時,這是一種很多形式的習慣。具有'id'的全部要點是能夠發送任何消息並允許在運行時發生分辨率。這是Objective-C的核心,允許綁定等工作。 瞭解並熟悉KVC/KVO是成爲Objective-C開發人員的必備條件。沒有這些知識,你只需編寫帶有有趣括號的[Java | C#]。 – 2010-01-18 17:27:23

+0

感謝Gerry和Marcus,非常有幫助,並且清楚瞭解我的情況。這很棒,而且我學到的東西比我預想的要多得多。你們很棒,它讓我更加註重客觀的C,現在我把它稱爲激情!非常感謝! – 2010-01-19 15:00:42

0

要設置屬性,這只是在子類視圖控制器(如「managedObjectContext」),你可以利用的事實,你知道像這種類型:

NSArray *viewControllerNames = [[NSArray alloc] initWithObjects:@"nil",@"OpcoesView",@"nil",@"TheNames", nil]; 

NSString *viewControllerName = [viewControllerNames objectAtIndex:[sender tag]]; //the tapped button tag 

UIViewController *viewController = [[NSClassFromString(viewControllerName) alloc] initWithNibName:viewControllerName bundle:nil]; 

if ([sender tag] == 3) { 
    TheNames *namesVC = (TheNames*)viewController; 
    namesVC.managedObjectContext = contexto; 
} 
+0

Humm,似乎我需要回到目標C的一些基本原理。很高興看到它!謝謝Gerry! – 2010-01-19 15:02:59

0

我會保持MOC在我的應用程序委託,而不是分配給它下到每一個我viewControllers:

而且在我的viewController .m文件:

#import "MyAppDelegate.h" // Assuming you have a property called managedObjectContext in your MyAppDelegate 

@interface MyViewController (PrivateMethgods) 
@property (nonatomic, readonly) NSManagedObjectContext * managedObjectContext; 
@end 

@implementation MyViewController 
@dynamic managedObjectContext 

- (NSManagedObjectContext *)managedObjectContext { 
    MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate; 
    return appDelegate.managedObjectContext; 
} 

所以我可以用它在我的viewController這樣的:

if ([self.managedObjectContext hasChanges]) { 
    ... 
} 
+1

這是一個*非常*脆弱的設計。推薦的模式是將'NSManagedObjectContext','NSManagedObject'和/或'NSFetchedResultsController'傳遞給UIViewController。促進重用並允許重新安排應用程序流程更容易。 – 2010-01-18 17:25:10

+0

雖然我聽說它沒有像馬庫斯說的那樣推薦,但我對此有所顧慮。無論如何,因爲我生活在這個問題的噩夢中,這將是我的出路,但現在我正在研究可能性,感謝您的幫助! – 2010-01-19 14:19:44

相關問題