簡體   English   中英

如何根據tableviewcell選擇將子視圖的nsdictionary保存到主視圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM