0

在我永無止境地尋求將錶行選擇共享到以模態視圖加載的多個視圖時,我已將它歸結爲一個問題。我使用Apples DrillDownSave示例代碼作爲模型來重新創建這個魔術。並認爲我已經設置完全相同...分享didSelectRowAtIndexPath選擇在2個控制器之間的數組中

在我的RootViewController.m的didSelectRowAtIndexPath部分,我有以下代碼將violinMakers MSMutableArray複製到同名的DetailsView MSMuteableArray。所有的顏色編碼,並沒有錯誤告訴我,我在正確的道路上..但是..

detailsView.violinMakers = [violinMakers objectAtIndex:indexPath.row]; 
在RootviewController.h文件

我引用DetailsViewController通過:

@class DetailViewController 

DetailsViewController *detailsView; 
NSMutableArray *violinMakers; 
@property (nonatomic, retain) NSMutableArray *violinMakers; 

然後在DetailsViewController。 .h文件:

NSMutableArray *violinMakers; 
IBOutlet UITextView *violinMakerDescription; 
@property (nonatomic, retain) NSMutableArray *violinMakers; //tried assign or copy no difference 
@property (nonatomic, retain) IBOutlet UITextView *violinMakerDescription; 

而在DetailsViewController .m文件:

- (void)viewWillAppear:(BOOL)animated 
ViolinMaker *violinMaker = (ViolinMaker *)violinMakers; 
[violinMakerDescription setText: [violinMaker description]]; 
NSLog(@"violinMakerDescription in detailsView: %@", [violinMaker description]); 

我有一個單獨的類,如上所示,我用它來定義數據violinMaker。這在didSelectRowAtIndexPath內的rootviewcontroller中工作正常,所以我知道這不是問題的一部分,我當然在.m文件中引用它。 它正常地連接IB,因爲我測試它的工作原理是直接從RootViewController中直接推送DetailsViewController,並將數據正確加載到UITextView中。

我推送的觀點啓動DetailsViewController(完美的作品)從RootViewController的(tableViewColler),它是通過啓動一個模態的視圖:

DetailsViewController *detailsViewController = [[DetailsViewController alloc] initWithNibName:@"DetailsViewController" bundle:nil ]; 
UINavigationController *aDetailsViewController = [[UINavigationController alloc] initWithRootViewController:detailsViewController]; 

[self presentModalViewController:aDetailsViewController animated:YES]; 

// [violinMakerView release]; 
[DetailsViewController retain]; // or release no different 
[aDetailsViewController release]; 

我得到的構建沒有錯誤,並查看加載,但textView中的信息是空白的。這也告訴我,它是裝載什麼,而且正確連接......我這麼近......但是我可以從我的NSLog看到,該值是:

violinMakerDescription in detailsView: (null) 

所以小提琴製作從RootViewController的不被複制到DetailsViewController中的violinMakers數組中。我討厭承認它,但幾個星期以來,我嘗試了各種解決方案,通過使用NSDefender和其他各種方法來解決這個問題。我認爲答案是,violinMakers被釋放,然後只傳遞任何東西,或者RootViewController中的分配行不起作用。任何人都知道我可以改變什麼?

我真的很感謝一些幫助,我只是沒有得到我想念的東西,但是這是我得到的最接近我只需要鏈接權利,或者看看爲什麼值不被保留。如果有方法檢查值的發佈時間,我可以檢查這個問題,也許就是這樣。我試圖在任何地方保留它(並且在我開始工作後正確)但它只是不工作......幫助?

謝謝大家!

真誠柯克

試圖改變加載線在RootViewController的到:

[detailsView.violinMakers addObject: [violinMakers objectAtIndex:indexPath.row]]; 

@Frank 首先感謝您對這種幫助! 我也設置在RootViewController的的小提琴對象以相同的方式,並能正常工作有,如下:

violinMaker = [self.violinMakers objectAtIndex:indexPath.row]; 

     ViolinMakerViewController *violinMakerViewController = [[ViolinMakerViewController alloc] initWithNibName:@"ViolinMakerViewController" bundle:nil]; 
     self.violinMakerView = violinMakerViewController; 

     [[self navigationController] pushViewController:violinMakerView animated:YES]; 


     [self.violinMakerView.violinMakerName setText:[violinMaker name]]; 
    .... 
     [self.violinMakerView.violinMakerDescription setText:[violinMaker description]]; 

     NSLog(@"violinMaker description variable in RootView: %@", [violinMaker description]); 

     DetailsViewController.violinMakers = [violinMakers objectAtIndex:indexPath.row]; 

在這裏,我看到的NSLog它加載在這裏很好,所以我堅信這裏加載到數組從objectAtIndex:indexPath.row然後複製該數組並將其放入DetaisViewController中的ViolinMaker對象將會起作用。我不希望再次在DetailsViewController中重新創建ViolinMaker對象,只需從數組中重新加載它,就像從RootViewController中重新加載它一樣。

這是DrillDownSave Apple示例如何執行此操作,並且鏡像此配置。凡在didSelectRowAtIndex的level1ViewController下面的代碼

// provide the 2nd level its content 
level2ViewController.listContent = [[listContent objectAtIndex:indexPath.row] objectForKey:kChildrenKey]; 

我不需要的關鍵部分,因爲這是對召回的位置。那裏的示例代碼中的兩個控制器都使用相同名稱的NSArrays,並且它似乎通過此行將L1陣列複製到L2陣列。

他們使用推送TableViews,這將使它很容易,但我沒有這樣做,IBOutlets將信息加載到UITextView的,所以我必須在RootView控制器中進行數組賦值,選擇發生在那裏。 如果我只能保留在RootView控制器中分配的ViolinMaker,那麼我可以在Details中挑選它,但我似乎無法弄清楚這兩者之一...

感謝您的幫助,我真的很粘..

+0

你可以添加你的大括號和什麼不回來?我越來越困惑:) – 2009-12-16 17:23:25

+0

另外,我是否正確地認爲細節視圖一次顯示一個ViolinMaker的細節? – 2009-12-16 17:30:49

回答

1

我認爲問題的關鍵是這一行:

ViolinMaker *violinMaker = (ViolinMaker *)violinMakers; 

你分配NSMutableArray對象的地址violinMaker。如果我理解正確,violinMakers是一組ViolinMaker對象。在這種情況下,您希望:

ViolinMaker *violinMaker = [violinMakers objectAtIndex:index]; 

您必須抓取didSelectRowAtIndexPath:過程中的索引。其實更好的辦法來做到這一點可能如下:

  1. 更改DetailsViewController有一個小提琴屬性(不是數組)
  2. 後你分配你的DetailsViewController,設置violinMaker屬性:

    detailsViewController.violinMaker = [violinMakers objectAtIndex:indexPath.row];

然後刪除cast(第一個代碼示例),你應該主要在那裏。

不幸的是,Objective-C/XCode不適合用「IntelliSense編碼」以及VS200x/.NET。這可能是明智的,通過幾個教程,然後回到這個項目。

+0

正確Frank,ViolinMakers是加載ViolinMaker對象的數組。在ViolinMaker中,我已經定義了從(violinMaker描述)中提取信息的字段,並且更正了detailsView僅僅是一個製造商信息。 我的問題是細節控制器不是一個表,所以我不能使用一個索引路徑調用,所以我在RootViewController中這樣做,然後嘗試將該選擇發送到數組,然後將其放置在DetailsView控件。 我無法在MakerView中設置indexPath.row,這是alloc的DetailsController,它不是TableView。 – Digiguy 2009-12-17 11:19:03

+0

只是要清楚數據的流程是: RootViewController的 - MakerView RootViewController的-DetailsView 但要到詳細信息視圖的方法是: RootViewController的(didSelectRow ...) - MakerView(SegmentSelectAction,推出ModalView) - DetailsViewController – Digiguy 2009-12-17 11:57:24

相關問題