如何在nsmutablearray中获取特定索引的对象

时间:2013-01-24 16:48:58

标签: iphone ios objective-c nsmutablearray uilocalnotification

嗨我在scheduleNotification方法中遇到一些正确的描述问题因为remedyarray超出界限而得到sigbart。如何在nsmutablearray中获取该特定索引的对象

我在notify.alertbody中的scheduleNotification方法中得到了错误的描述, 在cellforrow中我得到了正确的描述

我无法得到正确的描述,因为我无法在计划表法中使用objectatindex。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *cellIdentifier=@"cellIdentifier";
    PPtableCell *cell=(PPtableCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell==nil) {
        cell=[[PPtableCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        cell.cellDelegate = self;
    }

    cell.notifyMe.on = NO;
    cell.remedyTextLabel.text=[[remedyArray objectAtIndex:indexPath.row]objectForKey:@"RemedyTxtDic"];

    return cell;
 }

    else {
        return nil;
    }

}

- (UILocalNotification *)scheduleNotification :(int)remedyID {

    [[UIApplication sharedApplication] cancelAllLocalNotifications];

    Class cls = NSClassFromString(@"UILocalNotification");
    if (cls != nil) {

        UILocalNotification *notif = [[cls alloc] init];

        notif.timeZone = [NSTimeZone defaultTimeZone];

        NSLog(@"%d",remedyID);

        NSString *descriptionBody=[[remedyArray objectAtIndex:remedyID]objectForKey:@"RemedyTxtDic"];

        NSLog(@"%@",descriptionBody);

        notif.alertBody = [NSString stringWithString:descriptionBody];

2 个答案:

答案 0 :(得分:2)

  • 小点,但-objectAtIndex:需要NSUInteger,而不是int

  • 我假设remedyArray是一个实例变量(?)

我不认为你的问题出现在你所展示的方法中,除了-objectAtIndex:的参数是错误的类型它应该可以正常工作。你能展示调用scheduleNotification:的代码吗?

如果我是你,我不会使用对象的数组索引来定位它,你可能会遇到竞争条件以及数组在通知计划周围发生变化的情况。相反,你应该在数组中进行线性搜索,或者如果它太慢,你应该保留它的哈希映射。

或者甚至更好,你的Remedy对象应该是一个NSManagedObject,然后你可以免费获得所有的表处理和查找器功能。

答案 1 :(得分:1)

嗨我能够解决它..这是我的代码

- (UILocalNotification *)scheduleNotification :(int)remedyID
{
    [[UIApplication sharedApplication] cancelAllLocalNotifications];

    Class cls = NSClassFromString(@"UILocalNotification");
    if (cls != nil)
    {
        UILocalNotification *notif = [[cls alloc] init];
        notif.timeZone = [NSTimeZone defaultTimeZone];

        NSString *descriptionBody;

        for (int i=0; i<remedyArray.count; i++)
        {
            int arrayid = [[[remedyArray objectAtIndex:i]objectForKey:@"RemedyID"]intValue];
            if (arrayid == remedyID)
            {
                descriptionBody=[[remedyArray objectAtIndex:i]objectForKey:@"RemedyTxtDic"];
                break;
            }

        }

        NSDateComponents *components = [[NSDateComponents alloc] init];
        [components setDay:25];
        [components setMonth:1];
        [components setYear:2013];
        [components setMinute:45];
        [components setHour:11];

        NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSDate *date = [gregorian dateFromComponents:components];


        notif.alertBody = [NSString stringWithString:descriptionBody];
        notif.alertAction = @"Show me";
        notif.soundName = UILocalNotificationDefaultSoundName;
        notif.applicationIconBadgeNumber = 1;

        notif.fireDate = date;

        NSDictionary *userDict = [NSDictionary dictionaryWithObject:notif.alertBody
                                                             forKey:@"kRemindMeNotificationDataKey"];
        notif.userInfo = userDict;

        [[UIApplication sharedApplication] scheduleLocalNotification:notif];

        return notif;
    }
    else
    {
        return nil;
    }

}