2012-07-05 50 views
1

我想請一些專家MVC設計反饋請:如何在另一個選項卡的viewcontroller中爲協議設置委託?

我有一個UITabBarController與2個選項卡,每個選項卡導致一個導航控制器與VC堆棧。

第一個選項卡路徑上的最後一個視圖控制器將顯示圖像。我希望將該圖像存儲在表格中並隨時查看第二個選項卡。

如何從第一個選項卡 - > NaVController->上一個VC(圖像VC)將此圖像發送到第二個選項卡 - > NavController->表VC?

我有幾個選擇:

1中創建tableVC一個類的方法,並有imageVC調用類的方法,並通過該圖像直接保存到用戶默認。這似乎違背了MVC

2-在imageVC中使用方法和委託屬性創建協議,並讓表VC使用該方法將圖像保存到數組中。這裏的問題是,要設置委託的唯一地方是在viewDidLoad中:

[[[[self.tabBarController.viewControllers objectAtIndex:0] viewControllers] objectAtIndex:1] setDelegate:self]; 

這裏的問題是,如果用戶選擇從一開始就第二個選項卡,應用程序會崩潰,因爲很明顯的viewControllers一直沒加載到導航堆棧中的第一個選項卡。同樣,如果用戶首先看到1個圖像,然後選擇第二個選項卡,它將執行並設置委託,但不保存第一個選定的圖像。

必須有一個更簡單的方法.....提前 KB

回答

1

我認爲你應該將你的數據模型與視圖控制器分開一點。遵循MVC方法,模型不應該知道它是如何表示的。因此,對ImageVC中的型號進行更改不應涉及對任何其他VC的直接呼叫。

我會創建一個單獨的實體,例如SelectedImages,並從ImageVC添加圖像到它,並有TableVC需要顯示自己時從它讀取。 SelectedImages可能是應用程序委託,Core數據實體,單例類或類似的屬性。

+0

我認爲在MVC模型中,模型只能由VC使用。通過讓TableVC讀取SelectedImages,不會使這個模型對兩個MVC都可用嗎?謝謝您的幫助。 – Spectravideo328 2012-07-05 19:21:34

+2

多個VC可以使用相同的模型。就像你的情況一樣,你有一個用於將數據添加到模型的VC,另一個用於將模型作爲表格查看。這完全正常。另一個例子:包含一些數字的電子表格和從這些數字繪製的圖表使用的是相同的模型,但它們是兩個完全不同的VC。 – Macondo2Seattle 2012-07-05 19:37:12

+0

只是在這裏明確。你是說普通的模型類是一個具有類方法的類,它將被調用來設置和檢索圖像。從我所瞭解的MVC中,實例方法在這裏不起作用。 – Spectravideo328 2012-07-07 03:11:53

0

感謝您能有AppDelegate的是兩個風險投資的代表。然後,當第一個標籤選擇一個圖像時,它可以做一些[self.delegate setTheImage:theImage];調用。第二個選項卡可以調用其代理(AppDelegate),類似於theImage = [self.delegate getTheImage];。如果圖像還沒有被選中,那麼在顯示第二個選項卡(並且可能建立某種界面對象,讓用戶知道正在發生的事情)之前,AppDelegate會通過零並檢查theImage == nil

下面是用於設置的AppDelegate爲代表的一些代碼:

AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
self.delegate = appDelegate; 

然後AppDelegate中可以有一個屬性像「theImage」的形象:

-(void) setTheImage:(UIImage *)image: 
{ 
    self.theImage = image; 
} 

-(UIImage *) getTheImage 
{ 
    if(self.theImage) 
     return self.theImage; 
    else 
     return nil; 
} 

希望有所幫助。

0

選項2的變體:

的MainVC可以採用ImageVC協議和圖像設置爲TableVC。 TableVC必須是MainVC屬性

相關問題