ios - IOS 中的 Tableview Controller 加载数组错误

标签 ios objective-c arrays uitableview

我有一个表 VC,我在其中传递了列表的静态数组,当我们单击数组中的项目时,它会打开它的 View Controller ,现在我在索引 9 处编写了另一个 View Controller ,但是当我运行应用程序时它显示* 由于未捕获的异常“NSRangeException”而终止应用程序的错误,原因:“* -[__NSArrayI objectAtIndex:]:索引 10 超出范围 [0 .. 9]”。索引很好,但我不知道它为什么会出现。我的代码是,

     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{
    }

}

最佳答案

在代码的开头,检查字符串是否等于“Success”。 如果,则创建包含 11 个元素的数组 LeftMenuData1,其中包括 string1“View Properties” “。如果它不是“成功”,那么您就告诉该数组有10个元素,包括@"" (而不是string1,但没有“查看属性”

numberOfRowsInSection 中,您返回 LeftMenuData1 中的元素数量,即 1011

cellForRowAtIndexPath(将被调用10或11次)中,您使用以下文本创建每个单元格:cell.textLabel.text=[LeftMenuData1 objectAtIndex:indexPath.row];。这很好,因为 LeftMenuData1 已经具有与 tableView 中的索引相同数量的元素。 但是你也这样做:cell.imageView.image=[UIImage imageNamed:[LeftMenuDataImages1 objectAtIndex:indexPath.row]];尝试访问另一个 数组 (LeftMenuDataImages1),该数组(通过您的代码)不会根据 “成功” 更改其元素数量。由于这会崩溃,我假设 LeftMenuDataImages1 始终10 元素。

如果这是真的,只有当 "Success"true 时才会发生崩溃,因为 cellForRowAtIndexPath 试图获取中的第十一个元素LeftMenuDataImages1,只有 10 个元素。

即使您向 Images 数组添加第十一个元素,它们也会是错误的,因为最后一个元素的索引是错误的。您需要根据 "Success"LeftMenuDataImages1 设置为两个不同的数组,这与根据 LeftMenuData1 设置为不同的方式完全相同>“成功”

例如这样:

 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];

}

只需插入您自己的图像名称即可。

关于ios - IOS 中的 Tableview Controller 加载数组错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46585561/

相关文章:

ios - Objective-C iOS 类似雷达的 map

php - 如何根据与输入单词的相似性对数组进行排序。

c++ - 运行时边界数组的源级检测有多难?

html - Bootstrap 列在 iPad 纵向模式下的高度不同

android - Android 中的 iOS Background Fetch 等效项

iphone - 并非总是从Safari触发文档交互

ios - AVQueuePlayer AVPlayerItemDidPlayToEndTimeNotification 调用失败

objective-c - 如何访问用户的 Facebook 帐户? OSX 山狮

Javascript 从对象数组中的对象数组获取对象数组

ios - 使用 Codable 将复杂的 json 解码为没有嵌套结构的简单结构