[英]How to save nsdictionary of a subview to a mainview based off tableviewcell selection
我目前正在解析一些看起來像這樣的xml
<Rows>
<Row MANUFACTURERID="76" MANUFACTURERNAME="Fondont" ISMANU="F" ISAUTO="F"/>
<Row MANUFACTURERID="18" MANUFACTURERNAME="Anti" ISMANU="T" ISAUTO="T"/>
</Rows>
我解析它,以便有一個字典數組(每個字典都有行的四個值)。
然后我將ManufacturerName傳遞給我的startSortingTheArray方法
if (dataSetToParse == @"ICMfg") // ICMfg is a string passed to this view from the parent view cell selection enabling me to pass different data sets to this view
{
//Filter results (ISAUTO = T)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"ISAUTO",@"T"];
NSArray *filteredArray = [myDataArray filteredArrayUsingPredicate:predicate];
//Passes Manufacturer strigs over to startSortingtheArray method
[self startSortingTheArray:[filteredArray valueForKey:@"MANUFACTURER"]];
}
因此,從這里將所有ManufacturerNames作為字符串數組發送到我的方法。 然后我使用這個數組來設置我的所有section / index-scroller。 下面的方法顯示了我是如何做到這一點的。
//method to sort array and split for use with uitableview Index
- (IBAction)startSortingTheArray:(NSArray *)arrayData
{
//If you need to sort incoming array alphabetically use this line of code
//TODO: Check values coming in for capital letters and spaces etc
sortedArray = [arrayData sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
//If you want the standard array use this code
//sortedArray = arrayData;
self.letterDictionary = [NSMutableDictionary dictionary];
sectionLetterArray = [[NSMutableArray alloc] init];
//Index scrolling Iterate over values for future use
for (NSString *value in sortedArray)
{
// Get the first letter and its associated array from the dictionary.
// If the dictionary does not exist create one and associate it with the letter.
NSString *firstLetter = [[value substringWithRange:NSMakeRange(0, 1)] uppercaseString]; //uppercaseString puts lowercase values with uppercase
NSMutableArray *arrayForLetter = [letterDictionary objectForKey:firstLetter];
if (arrayForLetter == nil)
{
arrayForLetter = [NSMutableArray array];
[letterDictionary setObject:arrayForLetter forKey:firstLetter];
[sectionLetterArray addObject:firstLetter]; // This will be used to set index scroller and section titles
}
// Add the value to the array for this letter
[arrayForLetter addObject:value];
}
//Reload data in table
[self.tableView reloadData];
}
從這里開始我在[self.tableView reloadData]之后設置tableview做了幾件事; 被稱為,最主要的是我用數組的字符串值設置單元格。
//Display cells with data
NSArray *keys = [self.letterDictionary objectForKey:[self.sectionLetterArray objectAtIndex:indexPath.section]];
NSString *key = [keys objectAtIndex:indexPath.row];
cell.textLabel.text = key;
然后,當選擇單元格時,單元格內的字符串值將被發送回主視圖,並在以后用作搜索參數......事實是我正在設置幾個將用作一個搜索字符串的參數。
回顧我解析的XML
<Rows>
<Row MANUFACTURERID="76" MANUFACTURERNAME="Fondont" ISMANU="F" ISAUTO="F"/>
<Row MANUFACTURERID="18" MANUFACTURERNAME="Anti" ISMANU="T" ISAUTO="T"/>
</Rows>
這些是SQl表中具有鍵值MANUFACTURERID的列的值,該值也可以在我解析的其他表中找到。 我想使用這些鍵值來限制/優化其他查詢但我無法弄清楚如何將它們傳遞給我設置所有搜索參數的父視圖,這是我的問題如何保存值的字典與子視圖中的用戶tableview選擇有關。 這樣我就可以將其中一個或一些值傳遞回不同數據集的子視圖,以限制顯示的信息,具體取決於用戶以前的選擇。
打電話需要一個小時左右。 希望它有意義,我仍然是iOS開發和Objective C的新手,這個概念真的在推動我的能力,在我繼續前進並最終得到一些廢話之后我將不得不修復我希望那個或者你們中的一些人能夠將這種類型的經驗借給我,所以我可以第一次得到這個:)
如果您需要我澄清任何內容或為您提供更多信息,以幫助您幫助我告訴我。
提前致謝!
在視圖控制器層次結構中向后傳遞信息的常見模式是使用委托。 您可以通過實現以下方法在您的方案中實現此目的:
1)在SearchParametersViewController中定義一個協議,它代表您提到的父視圖控制器。
@protocol SearchParametersViewControllerDelegate <NSObject>
@optional
- (void)searchOptionsSelected:(NSArray *)selectedSearchOptions;
@end
2)在SearchOptionsSelectionViewController中符合該協議,該協議表示具有可供選擇的選擇列表的表視圖控制器。 確保導入或轉發聲明定義協議的類(例如SearchParametersViewController)。
#import "SearchParametersViewController.h"
@interface SearchOptionsSelectionViewController <SearchParametersViewControllerDelegate>
3)在SearchOptionsSelectionViewController中定義委托屬性(假設您在iOS 5.0上使用ARC,4.x使用unsafe_unretained
而不是weak
。如果項目使用手動內存管理,請使用assign
)。 此委托對象將包含對父視圖控制器的引用(例如SearchParametersViewController)。 您不希望保留此屬性,以避免保留周期/循環引用,其中一個對象引用另一個對象,而該引用又引用返回第一個,並且兩個對象都不會被釋放。
@property (nonatomic, weak) id<SearchParametersViewControllerDelegate> delegate;
4)在父視圖控制器(SearchParametersViewController)中實例化SearchOptionsSelectionViewController實例時,將delegate
屬性設置為self
視圖控制器實例,由self
關鍵字表示。 這可確保您可以在視圖控制器層次結構中向后發送消息(和相應的數據),但對象關系保持松散耦合。 此委托協議可以符合任何其他視圖控制器,選擇視圖控制器中沒有緊密的關系回到父視圖控制器,鏈接它們的唯一事情是選擇視圖控制器采用靈活的委托協議。
SearchOptionsSelectionViewController *selectionViewController = [[SearchOptionsSelectionViewController alloc] init];
selectionViewController.delegate = self;
5)最后,在您的SearchOptionsSelectionViewController表視圖的-tableView:didSelectRowAtIndexPath:
delegate方法中,通過您在SearchParametersViewControllerDelegate協議中定義的委托方法將對應於所選行的數據傳遞回父視圖控制器(SearchParametersViewController)。 必須使用-respondsToSelector:
方法來確保委托對象實際實現-searchOptionsSelected:
delegate方法。 要強制此實現中,改變@optional
到@required
方法原型以上在步驟1#協議定義。 self.someDataArray
表示與選擇表視圖控制器一起使用的數據源。 可以更改發送回父視圖控制器的委托協議方法和數據對象的細節,這里重要的是委托模式,並且在任一類的實例之間沒有任何緊密耦合的關系,但特別是向后視圖控制器層次結構。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([self.delegate respondsToSelector:@selector(searchOptionsSelected:)])
{
NSArray *selectedObjs = [NSArray arrayWithObject:[self.someDataArray objectAtIndex:indexPath.row]];
[self.delegate searchOptionsSelected:selectedObjs]
}
}
6)在SearchOptionsSelectionViewController.m
實現委托方法
- (void)searchOptionsSelected:(NSArray *)selectedSearchOptions
{
// do what you need to with selectedSearchOptions array
}
進一步閱讀:
您可以使用應用程序委托來實現您的目標。
我假設您的應用程序的結構有點像這樣。 請原諒這種模式的粗糙。
Application delegate (A) --> Search Options View (B) --> Table where you do selections (C)
|
|
--> Some other view where you need the selection (D)
您的問題是您需要從C到D的信息。
您的應用程序委托的優點是可以通過[[UIApplication sharedApplication] delegate]
進行普遍訪問。 所以你可以從任何地方獲得指向它的指針。 從C,您可以將您的選擇信息發送回A. A可以自動發送給D,或者D可以隨時從A請求它。
幾點:
您有幾個選項,一個是使用用戶默認值。 這可能是最簡單的。
另一種方法是發布包含該信息的通知。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.