Tableview控制器在IOS中加载数组错误

时间:2017-10-05 12:24:15

标签: ios objective-c arrays uitableview

我有一个表VC,其中我已经传递静态数组列表,当我们点击数组中的项目时,它打开它的视图控制器,现在我已经在索引9写了另一个视图控制器但是当我运行应用程序时它显示我错误 *由于未捕获的异常终止应用程序' NSRangeException',原因:' * - [__ NSArrayI objectAtIndex:]:索引10超出范围[0 .. 9] &#39 ;.索引很好,但我不知道它为什么会来。我的代码是,

     NSString *success= [successDefaults valueForKey:@"Success"];
    if ([success isEqual:@"Success"]) {
        NSString *string1 = [successDefaults stringForKey:@"name"];

        NSLog(@"Name is %@",string1);

         LeftMenuData1=[[NSArray alloc]initWithObjects:string1,@"Home",@"Show Franchiser",@"AboutUs",@"Logout",@"Contact Us",@"Wanted",@"Terms&Conditions",@"Share App",@"View Properties",@"Chat", nil];
        [self.tableView reloadData];

    }else{

        LeftMenuData1=[[NSArray alloc]initWithObjects:@"",@"Home",@"Show Franchiser",@"AboutUs",@"Login/Register",@"Contact Us",@"Wanted",@"Terms&Conditions",@"Share App",@"Chat",nil];
        [self.tableView reloadData];

    }

}

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [LeftMenuData1 count];
}

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *MyIdentifier = @"MyIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];


    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];

    }
    cell.textLabel.text=[LeftMenuData1 objectAtIndex:indexPath.row];
    cell.imageView.image=[UIImage imageNamed:[LeftMenuDataImages1 objectAtIndex:indexPath.row]];


    return cell;
}

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    float height = 40;

    NSUserDefaults *successDefaults=[NSUserDefaults standardUserDefaults];
    NSString *str111=[NSString stringWithFormat:@"%@",[successDefaults valueForKey:@"currentUser"]];
    int currentLoginStatus = [str111 intValue];
    if(currentLoginStatus == 0 && indexPath.row == 0)
        height = 0;

    return height;
}

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    UITableViewCell *selectedCell=[tableView cellForRowAtIndexPath:indexPath];
    NSLog(@"%@",selectedCell.textLabel.text);

    AppDelegate *app=(AppDelegate *)[[UIApplication sharedApplication]delegate];

    NSUserDefaults *successDefaults=[NSUserDefaults standardUserDefaults];

    NSInteger row = indexPath.row;

    NSString *str=[NSString stringWithFormat:@"%@",[LeftMenuData1 objectAtIndex:indexPath.row]];


    NSLog(@"%@",str);
    if (row == 0) {

        NSString *str111=[NSString stringWithFormat:@"%@",[successDefaults valueForKey:@"currentUser"]];

        int currentLoginStatus = [str111 intValue];
        if(currentLoginStatus == 1)
        {

            UpViewController *presales = [self.storyboard instantiateViewControllerWithIdentifier:@"Up"];
            UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:presales];

            [app.drawer setCenterViewController:nav withCloseAnimation:true completion:nil];

        } else if(currentLoginStatus == 2)
        {
            UserProfileViewController *presales = [self.storyboard instantiateViewControllerWithIdentifier:@"profile"];
            UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:presales];

            [app.drawer setCenterViewController:nav withCloseAnimation:true completion:nil];
        }
    }else if(row == 1){

        HomePageViewController *presales = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"];
        UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:presales];

        [app.drawer setCenterViewController:nav withCloseAnimation:true completion:nil];

    }else if (row == 2){

        FransFormViewController *presales = [self.storyboard instantiateViewControllerWithIdentifier:@"frans"];

        UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:presales];



        [app.drawer setCenterViewController:nav withCloseAnimation:true completion:nil];



    }else if (row == 3){
        AboutUsViewController *presales = [self.storyboard instantiateViewControllerWithIdentifier:@"AboutUs"];
        UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:presales];
        [app.drawer setCenterViewController:nav withCloseAnimation:true completion:nil];

    }else if (row == 4){

        NSUserDefaults *successDefaults=[NSUserDefaults standardUserDefaults];

        if ([[successDefaults valueForKey:@"Success"] isEqualToString:@"Success"]) {
            [successDefaults setObject:@"NO" forKey:@"Success"];
            [successDefaults setObject:@"0" forKey:@"currentUser"];

            [successDefaults synchronize];
            [successDefaults synchronize];
            [app.drawer toggleDrawerSide:MMDrawerSideLeft animated:YES completion:nil];

        }else{
            GeneralLoginViewController *presales = [self.storyboard instantiateViewControllerWithIdentifier:@"General"];
            UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:presales];
            [app.drawer setCenterViewController:nav withCloseAnimation:true completion:nil];

        }

    }else if(row == 5){
        ContactInfoViewController *presales = [self.storyboard instantiateViewControllerWithIdentifier:@"ContactInfo"];

        UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:presales];

        [app.drawer setCenterViewController:nav withCloseAnimation:true completion:nil];
    }else if (row == 6){
        WantedViewController *presales = [self.storyboard instantiateViewControllerWithIdentifier:@"WantedViewController"];
        UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:presales];
        [app.drawer setCenterViewController:nav withCloseAnimation:true completion:nil];
    }else if (row == 7){

        Terms_ConditionViewController *presales = [self.storyboard instantiateViewControllerWithIdentifier:@"Terms"];
        UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:presales];
        [app.drawer setCenterViewController:nav withCloseAnimation:true completion:nil];
    }else if (row == 8){

        ShareViewController *presales = [self.storyboard instantiateViewControllerWithIdentifier:@"Share"];
        UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:presales];
        [app.drawer setCenterViewController:nav withCloseAnimation:true completion:nil];

    }
   else if (row==9) {
       TestChat *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"Chat"];
        [self.navigationController pushViewController:vc animated:YES];
    }

    else if (row == 10){
        NSUserDefaults *successDefaults=[NSUserDefaults standardUserDefaults];

        if ([[successDefaults valueForKey:@"Success"] isEqualToString:@"Success"]){

        ViewPersonalTableViewController *presales = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewProps"];
        UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:presales];
        [app.drawer setCenterViewController:nav withCloseAnimation:true completion:nil];

        }


    }else{
    }

}

1 个答案:

答案 0 :(得分:1)

在代码的开头,检查字符串是否等于"Success"。 如果 ,则使用 11 元素创建数组LeftMenuData1,包括string1"View Properties"。如果 "Success",那么您告诉该数组包含 10 元素,包括@""(而不是string1但< strong>不 "View Properties"

numberOfRowsInSection中,您会返回LeftMenuData1 10 11 的元素数。

cellForRowAtIndexPath(将被称为10或11次)中,您可以使用以下文本创建每个单元格:cell.textLabel.text=[LeftMenuData1 objectAtIndex:indexPath.row];。这很好,因为LeftMenuData1已经拥有与tableView中的索引相同数量的元素。 但是你也是这样做的:cell.imageView.image=[UIImage imageNamed:[LeftMenuDataImages1 objectAtIndex:indexPath.row]];试图访问另一个数组(LeftMenuDataImages1),这(通过你的代码)不会改变它的数量基于"Success"的元素。由于这是崩溃,我假设LeftMenuDataImages1 总是 10 元素。

如果这是真的,那么只有在"Success"true时才会发生崩溃,因为cellForRowAtIndexPath会尝试获取LeftMenuDataImages1中的第11个元素,其中只有10个元素

即使你向你添加了第11个元素Images - 数组,它们也是错误的,因为最后一个元素的索引是错误的。您需要根据LeftMenuDataImages1"Success"设置为两个不同的数组,方法与基于LeftMenuData1设置"Success"的方式完全相同。

例如:

 NSString *success= [successDefaults valueForKey:@"Success"];
if ([success isEqual:@"Success"]) {
    NSString *string1 = [successDefaults stringForKey:@"name"];

    NSLog(@"Name is %@",string1);

    LeftMenuData1=[[NSArray alloc]initWithObjects:string1,@"Home",@"Show Franchiser",@"AboutUs",@"Logout",@"Contact Us",@"Wanted",@"Terms&Conditions",@"Share App",@"View Properties",@"Chat", nil];
    LeftMenuDataImages1 =[[NSArray alloc]initWithObjects:someImageName,@"HomeImage",@"ShowFranchiserImage",@"AboutUsImage",@"LogoutImage",@"ContactUsImage",@"WantedImage",@"Terms&ConditionsImage",@"ShareAppImage",@"ViewPropertiesImage",@"ChatImage", nil];
    [self.tableView reloadData];

}else{

    LeftMenuData1=[[NSArray alloc]initWithObjects:@"",@"Home",@"Show Franchiser",@"AboutUs",@"Login/Register",@"Contact Us",@"Wanted",@"Terms&Conditions",@"Share App",@"Chat",nil];
    LeftMenuDataImages1=[[NSArray alloc]initWithObjects:@"EmptyImage",@"HomeImage",@"ShowFranchiserImage",@"AboutUsImage",@"Login/RegisterImage",@"ContactUsImage",@"WantedImage",@"Terms&ConditionsImage",@"ShareAppImage",@"ChatImage",nil];
    [self.tableView reloadData];

}

只需插入您自己的图片名称。