无法访问传入值的 NSMutableDictionary 外部方法

发布于 2024-12-05 22:46:39 字数 3903 浏览 0 评论 0原文

我正在尝试为我的 uitableview 设置索引和部分,我已经成功做到了。但是,现在我尝试将 NSDictionary 值传递给我的 uitableviewcell,当我尝试访问外部的 NSDictionary 时,我的应用程序崩溃了我从中传递值的方法。

我想也许我没有正确传递值或类似的东西,但我根本无法弄清楚为什么会这样...

这是我的代码....

h

@interface VehicleResultViewController : UITableViewController <NSXMLParserDelegate> {

//......

    //Indexed tableview stuff
    NSArray *sortedArray;
    NSMutableDictionary *arraysByLetter;
    NSMutableArray *sectionLetters;

}


//.....

//Indexed tableview stuff
@property (nonatomic, retain) IBOutlet NSArray *sortedArray;
@property (nonatomic, retain) IBOutlet NSMutableDictionary *arraysByLetter; 
@property (nonatomic, retain) IBOutlet NSMutableArray *sectionLetters;

//....

.m .

//...
//This is where I try to access the NSDictionary to pass it to my uitableviewcells
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    } 

    cell.accessoryType = UITableViewCellAccessoryNone; //make sure their are no tickes in the tableview 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; // no blue selection

    // Configure the cell...

    NSString *value = [self.arraysByLetter objectForKey:[[self.arraysByLetter allKeys] objectAtIndex:indexPath.row]];
    cell.textLabel.text = key;
    NSLog(@"%@",arraysByLetter);

    return cell;
}

//This is where I set NSDictionary
//method to sort array and split for use with uitableview Index
- (IBAction)startSortingTheArray:(NSMutableArray *)arrayData
{
    //Sort incoming array alphabetically
    sortedArray = [arrayData sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
    //NSLog(@"%@",sortedArray);

    // Dictionary will hold our sub-arrays
    arraysByLetter = [NSMutableDictionary dictionary];
    sectionLetters = [[NSMutableArray alloc] init];
    // Iterate over all the values in our sorted array
    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)];
        NSMutableArray *arrayForLetter = [arraysByLetter objectForKey:firstLetter];
        if (arrayForLetter == nil) {
            arrayForLetter = [NSMutableArray array];
            [arraysByLetter setObject:arrayForLetter forKey:firstLetter];
            [sectionLetters addObject:firstLetter]; // This will be used to set index and section titles
        }

        // Add the value to the array for this letter
        [arrayForLetter addObject:value];
    }
    // arraysByLetter will contain the result you expect
    NSLog(@"Dictionary: %@", arraysByLetter); //This prints what is currently in the NSDictionary

    //Reloads data in table
    [self.tableView reloadData];
}

检查字典的输出使用上面最后一个方法中的 NSLog,

Dictionary: {
    H =     (
        Honda,
        Honda,
        Honda,
        Honda,
        Honda,
        Honda,
        Honda
    );
    M =     (
        Mazda,
        Mazda,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi
    );
    N =     (
        Nissan,
        Nissan,
        Nissan,
        Nissan,
        Nissan,
        Nissan,
        Nissan
    );
    T =     (
        Toyota,
        Toyota,
        Toyota
    );
}

我已经调试了两个点(我在方法中设置 NSdictionary 的地方)和(我在 cellforrowatindexpath 中访问 NSDictionary 的地方),并且在我尝试使用它之前就已经设置好了。

任何帮助将不胜感激..

I am trying to set up Index and sections for my uitableview, which I have managed to do.. However now that I am trying to pass my NSDictionary values over to my uitableviewcell my app is crashing when I try to access the NSDictionary outside of the method that I passed the values to it from.

I am thinking that maybe I am not passing the values in correctly or something along the line of that, but I simply cannot figure out why its going this...

Heres my code...

.h

@interface VehicleResultViewController : UITableViewController <NSXMLParserDelegate> {

//......

    //Indexed tableview stuff
    NSArray *sortedArray;
    NSMutableDictionary *arraysByLetter;
    NSMutableArray *sectionLetters;

}


//.....

//Indexed tableview stuff
@property (nonatomic, retain) IBOutlet NSArray *sortedArray;
@property (nonatomic, retain) IBOutlet NSMutableDictionary *arraysByLetter; 
@property (nonatomic, retain) IBOutlet NSMutableArray *sectionLetters;

//....

.m

//...
//This is where I try to access the NSDictionary to pass it to my uitableviewcells
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    } 

    cell.accessoryType = UITableViewCellAccessoryNone; //make sure their are no tickes in the tableview 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; // no blue selection

    // Configure the cell...

    NSString *value = [self.arraysByLetter objectForKey:[[self.arraysByLetter allKeys] objectAtIndex:indexPath.row]];
    cell.textLabel.text = key;
    NSLog(@"%@",arraysByLetter);

    return cell;
}

//This is where I set NSDictionary
//method to sort array and split for use with uitableview Index
- (IBAction)startSortingTheArray:(NSMutableArray *)arrayData
{
    //Sort incoming array alphabetically
    sortedArray = [arrayData sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
    //NSLog(@"%@",sortedArray);

    // Dictionary will hold our sub-arrays
    arraysByLetter = [NSMutableDictionary dictionary];
    sectionLetters = [[NSMutableArray alloc] init];
    // Iterate over all the values in our sorted array
    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)];
        NSMutableArray *arrayForLetter = [arraysByLetter objectForKey:firstLetter];
        if (arrayForLetter == nil) {
            arrayForLetter = [NSMutableArray array];
            [arraysByLetter setObject:arrayForLetter forKey:firstLetter];
            [sectionLetters addObject:firstLetter]; // This will be used to set index and section titles
        }

        // Add the value to the array for this letter
        [arrayForLetter addObject:value];
    }
    // arraysByLetter will contain the result you expect
    NSLog(@"Dictionary: %@", arraysByLetter); //This prints what is currently in the NSDictionary

    //Reloads data in table
    [self.tableView reloadData];
}

.output of checking the Dictionary with NSLog in the last method above

Dictionary: {
    H =     (
        Honda,
        Honda,
        Honda,
        Honda,
        Honda,
        Honda,
        Honda
    );
    M =     (
        Mazda,
        Mazda,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi
    );
    N =     (
        Nissan,
        Nissan,
        Nissan,
        Nissan,
        Nissan,
        Nissan,
        Nissan
    );
    T =     (
        Toyota,
        Toyota,
        Toyota
    );
}

I have debugged the two points (where i set the NSdictionary in the method) and (where I access the NSDictionary in cellforrowatindexpath) and it is defiantly set before I even try to use it.

Any help would be greatly appreciated..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夏九 2024-12-12 22:46:39
//Indexed tableview stuff
@property (nonatomic, retain) NSArray *sortedArray;
@property (nonatomic, retain) NSMutableDictionary *arraysByLetter; 
@property (nonatomic, retain) NSMutableArray *sectionLetters;

从属性声明中删除 IBOutlet。它仅适用于 Interface Builder 控件。

还正确的字典分配 - self.arraysByLetter = [NSMutableDictionarydictionary];

//Indexed tableview stuff
@property (nonatomic, retain) NSArray *sortedArray;
@property (nonatomic, retain) NSMutableDictionary *arraysByLetter; 
@property (nonatomic, retain) NSMutableArray *sectionLetters;

REMOVE IBOutlet from properties declarations. It's only for Interface Builder controls.

Also correct dictonary allocation - self.arraysByLetter = [NSMutableDictionary dictionary];

黄昏下泛黄的笔记 2024-12-12 22:46:39

分配的 NSMutableDictionary 是自动释放的,因此当在其他方法中调用它时,NSAutoreleasePool 已被耗尽,并且 NSMutableDictionary 已发布。如果你想使用属性保留对象,你必须这样做:

self.arraysByLetter = [NSMutableDictionary dictionary];

self将使用声明为retain的setter来设置字典,所以它将是当您稍后尝试使用它时可用。

请注意,任何以 new 或 alloc 开头或包含副本的方法都必须返回一个 autoreleased 对象,这就是您的情况。

The NSMutableDictionary that is allocated is autoreleased, therefore when it is called in the other method the NSAutoreleasePool has been drained, and the NSMutableDictionary has been released. If you want to retain the object using the property you have to do it like this:

self.arraysByLetter = [NSMutableDictionary dictionary];

self will set the dictionary using the setter which is declared as retain, so it will be available when you try to use it later on.

As a note any method that does not start with new or alloc or contains copy must return an autoreleased object, which is your case.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文