2014-05-01 86 views
0

讓我首先說我可以通過prepareForSegue方法傳遞數據,但是我相信我做這件事的方式並不是最優的,我總是希望提高我的編碼技能。我看到這是否是正確的做法?它有效,但可能「根本上」是錯誤的。通過segue傳遞NSArray

我有一個plist中填充一個UITableView

// Find out the path of recipes.plist 
NSString *path = [[NSBundle mainBundle] pathForResource:@"law" ofType:@"plist"]; 

// Load the file content and read the data into arrays 
self.dataArray = [NSArray arrayWithContentsOfFile:path]; 

//Sort the array by section 
self.sortedArray = [self.dataArray sortedArrayUsingDescriptors:@[ 
       [NSSortDescriptor sortDescriptorWithKey:@"Section" ascending:YES], 
       [NSSortDescriptor sortDescriptorWithKey:@"Title" ascending:YES]]]; 

//Title 
self.namesArray = [self.sortedArray valueForKeyPath:@"Title"]; 

self.sectionArray = [self.dataArray valueForKeyPath:@"Section"]; 

//Legislation 
self.legislationArray = [self.sortedArray valueForKeyPath:@"Legislation"]; 

我通過了賽格瑞方法準備傳遞值這麼

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
if ([segue.identifier isEqualToString:@"detailAll"]) { 
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
    DetailTableViewController *destViewController = segue.destinationViewController; 
    destViewController.title = [self.namesArray objectAtIndex:indexPath.row]; 
    destViewController.nameLabel = [self.namesArray objectAtIndex:indexPath.row]; 
    destViewController.legislationLabel = [self.legislationArray objectAtIndex:indexPath.row]; 
} 
} 

這工作。但是,有沒有更乾淨的方法來做到這一點?值被傳遞到另一個數組,然後填充到一個詳細視圖UItableview

+0

這是正確的,乾淨的。你爲什麼認爲這是錯的? –

+0

很高興知道,只是覺得價值觀可以一起傳遞,而不是單獨傳遞。也許在一個NSobject中。 – memyselfandmyiphone

+0

這對我來說看起來不錯,但如果詳細信息VC負責編輯這些值,則您需要屬性上的'copy'屬性,以便以後取消的更改不會影響原始值。 – Droppy

回答

1

你沒有使用特定的模型對象,所以你當前的代碼是好的。

但是,更健壯的工作方式是定義一個對象,該對象表示您在每個單元格中表示的模型對象。這將具有代表名稱,部分和立法的屬性。然後你的tableview會根據對象配置每個單元格,並且數據源爲每個屬性保存一個數組而不是多個數組。

當您推送到詳細視圖控制器時,您只需傳遞此模型對象。

這種方法有幾個優點:

  • 更少的代碼
  • 更多可擴展的(如果你添加了另一個屬性,你的模型對象,你就不需要添加另一個陣列和財產上的細節視圖控制器)
  • 更清晰的理解

製作模型對象是非常簡單的,特別是現在有特性的自動完成。只需製作一個NSObject子類,並在標題中聲明您的屬性:

@property(nonatomic,copy) NSString *title; 
@property(nonatomic,copy) NSString *name; 
@property(nonatomic,copy) NSString *legislation; 

這就是它的全部。編譯器會自動爲你合成這些屬性。

+0

是的,這是我的想法。你知道這方面有什麼好的材料嗎?我應該搜索存儲數組的NSobject嗎? – memyselfandmyiphone

+0

你不需要「材料」 - 只需創建一個NSObject子類。我會給答案添加一個例子 – jrturton

1

我已經爲此創建了一個庫,請查看它! https://github.com/stefanomondino/SMQuickSegue

基本上你越過(期間執行SEGUE,忘掉prepareForSegue)屬性/值的字典,將目的地視圖控制器上,如果它是響應對應選擇器進行設置(這將跳過否則錯誤的參數)。