Ios [\uu NSArrayM objectAtIndex:]:获取textvalue时索引1超出边界[0..0]

Ios [\uu NSArrayM objectAtIndex:]:获取textvalue时索引1超出边界[0..0],ios,tags,uibutton,uitextview,Ios,Tags,Uibutton,Uitextview,我有UIWebView用于显示HTML页面。当长按webview时,我会将x&y坐标保存到数据库中。在UIMenuItem中,单击“注释”按钮,它将显示编写注释的UITextView。如果单击“完成”按钮,它将以x&y坐标存储到数据库中。然后,在x&y坐标上显示一个带有标记的按钮,每个可触摸坐标都带有文本。稍后,如果我单击按钮,标记将与坐标匹配,我需要显示数据库中的文本。但我犯了个错误 -(void)viewDidLoad{ NSMutableArray *items = [[[UIMenuC

我有
UIWebView
用于显示HTML页面。当长按webview时,我会将x&y坐标保存到数据库中。在
UIMenuItem
中,单击“注释”按钮,它将显示编写注释的
UITextView
。如果单击“完成”按钮,它将以x&y坐标存储到数据库中。然后,在x&y坐标上显示一个带有
标记的按钮,每个可触摸坐标都带有文本。稍后,如果我单击按钮,标记将与坐标匹配,我需要显示数据库中的文本。但我犯了个错误

-(void)viewDidLoad{

NSMutableArray *items = [[[UIMenuController sharedMenuController] menuItems] mutableCopy];
    if (!items) items = [[NSMutableArray alloc] init];

    UIMenuItem *menuItem;
    menuItem = [[UIMenuItem alloc] initWithTitle:@"BookMark" action:@selector(book:)];
    [items addObject:menuItem];
    [menuItem release];
    menuItem = [[UIMenuItem alloc] initWithTitle:@"Notes" action:@selector(note:)];
    [items addObject:menuItem];
    [menuItem release];

    [[UIMenuController sharedMenuController] setMenuItems:items];


    [items release];


    tap = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(tapTest:)];
    [tap setDelegate:self];


    [wbCont.scrollView addGestureRecognizer:tap];

}
长按获取坐标保存:

- (void)tapTest:(UILongPressGestureRecognizer *)sender {
    NSLog(@"coordinate is %f %f", [sender locationInView:wbCont.scrollView].x, [sender locationInView:wbCont.scrollView].y);


     xcor = [sender locationInView:wbCont.scrollView].x;
     ycor = [sender locationInView:wbCont.scrollView].y;


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];


    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"];
    NSLog(@"filepath %@",path);


    if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {



        const char *sql = [[NSString stringWithFormat:@"SELECT xcoor FROM touch where xcoor = '%f' AND ycoor = '%f' AND artt_id='%@'",xcor,ycor,artID] cStringUsingEncoding:NSUTF8StringEncoding];


        NSLog(@"sql is %s",sql);

        BOOL favExist = false;

        sqlite3_stmt *statement, *addStmt;

        if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
            // We "step" through the results - once for each row.
            while (sqlite3_step(statement) == SQLITE_ROW) {



                favExist = true;
            }
        }


        if(!favExist){



            const char *sqlInsert = [[NSString stringWithFormat:@"insert into touch (xcoor,ycoor,artt_id) values ('%f','%f','%@')", xcor,ycor,artID] cStringUsingEncoding:NSUTF8StringEncoding];

            NSLog(@"sql insert is %s",sqlInsert);


            // [catID release];

            if(sqlite3_prepare_v2(database, sqlInsert, -1, &addStmt, NULL) != SQLITE_OK)
                NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));

            NSLog(@"error is %s",sqlite3_errmsg(database));

            if(SQLITE_DONE != sqlite3_step(addStmt))
                NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));


        }else {


        }

    }

}
单击UIMenuItem上的注释:

- (void)note:(id)sender   {

    NSLog(@"Note");


    txtview = [[UITextView alloc]initWithFrame:CGRectMake(0,0,320,568)];

    txtview.font = [UIFont fontWithName:@"Helvetica" size:12];
    txtview.font = [UIFont boldSystemFontOfSize:12];
    txtview.backgroundColor = [UIColor whiteColor];
    txtview.scrollEnabled = YES;
    txtview.pagingEnabled = YES;
    txtview.editable = YES;
     txtview.tag = mainTag*10000;




    [self.view addSubview:txtview];


 button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self
               action:@selector(done:)
     forControlEvents:UIControlEventTouchDown];
    [button setTitle:@"Done" forState:UIControlStateNormal];
    button.frame = CGRectMake(240.0, 20.0, 60.0, 40.0);
    [txtview addSubview:button];



}
在UITextView中写入文本并保存到数据库textnote表格(带有x&y坐标)后,单击“完成”按钮,然后在x&y坐标上显示webviewbutton:

-(void)done:(id)sender  {


    NSLog(@"done");


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    // NSString *documentsDirectory = [paths objectAtIndex:1];

    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"ohs.sqlite"];
    NSLog(@"filepath %@",path);


    if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {



        const char *sql = [[NSString stringWithFormat:@"SELECT textnotes,text_id,txcoor,tycoor FROM textnote where textnotes = '%@' AND text_id = '%@' AND txcoor = '%f' AND tycoor = '%f'",txtview.text,artID,xcor,ycor] cStringUsingEncoding:NSUTF8StringEncoding];

        NSLog(@"sql is %s",sql);

        BOOL favExist = false;

        sqlite3_stmt *statement, *addStmt;

        if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
            // We "step" through the results - once for each row.
            while (sqlite3_step(statement) == SQLITE_ROW) {


                favExist = true;
            }
        }


        if(!favExist){


            const char *sqlInsert = [[NSString stringWithFormat:@"insert into textnote (textnotes,text_id,txcoor,tycoor ) values ('%@','%@','%f','%f')", txtview.text,artID,xcor,ycor] cStringUsingEncoding:NSUTF8StringEncoding];

            NSLog(@"sql insert is %s",sqlInsert);

            // [catID release];

            if(sqlite3_prepare_v2(database, sqlInsert, -1, &addStmt, NULL) != SQLITE_OK)
                NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));

            if(SQLITE_DONE != sqlite3_step(addStmt))
                NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));



        }else {



        }

    }



    NSArray *coorpaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *coordocumentsDirectory = [coorpaths objectAtIndex:0];
    NSLog(@"docs dir is %@", coordocumentsDirectory);

    NSString *coorpath = [coordocumentsDirectory stringByAppendingPathComponent:@"ohs.sqlite"];
    NSLog(@"filepath %@",coorpath);

    if (sqlite3_open([coorpath UTF8String], &database) == SQLITE_OK) {


        const char *sql =  [[NSString stringWithFormat:
                             @"SELECT xcoor,ycoor,artt_id FROM touch where artt_id = %@", artID]cStringUsingEncoding:NSUTF8StringEncoding];


        NSLog(@"getmainsql is %s",sql);

        sqlite3_stmt *statement;

        if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
            // We "step" through the results - once for each row.
            while (sqlite3_step(statement) == SQLITE_ROW) {



                table_touch_xcor=sqlite3_column_double(statement, 0);

                table_touch_ycor=sqlite3_column_double(statement, 1);

                table_touch_artid = sqlite3_column_int(statement, 2);

                if(table_touch_xcor && table_touch_ycor && table_touch_artid){



                    NSArray *coorpaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
                    NSString *coordocumentsDirectory = [coorpaths objectAtIndex:0];
                    NSLog(@"docs dir is %@", coordocumentsDirectory);

                    NSString *coorpath = [coordocumentsDirectory stringByAppendingPathComponent:@"ohs.sqlite"];
                    NSLog(@"filepath %@",coorpath);

                    if (sqlite3_open([coorpath UTF8String], &database) == SQLITE_OK) {



                        const char *sql = [[NSString stringWithFormat:@"SELECT textnotes,text_id,txcoor,tycoor FROM textnote where  text_id = '%@' AND txcoor = '%f' AND tycoor = '%f'",artID,table_touch_xcor,table_touch_ycor] cStringUsingEncoding:NSUTF8StringEncoding];


                        NSLog(@"getmainsql is %s",sql);

                        sqlite3_stmt *statement;

                        if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
                            // We "step" through the results - once for each row.
                            while (sqlite3_step(statement) == SQLITE_ROW) {




                                txtstring = [[NSString alloc] initWithUTF8String:
                                             (const char *) sqlite3_column_text(statement, 0)];


                                table_textnote_artid = sqlite3_column_int(statement, 1);


                                table_textnote_xcor=sqlite3_column_double(statement, 2);

                                table_textnote_ycor=sqlite3_column_double(statement, 3);



                                if(table_textnote_xcor && table_textnote_ycor && table_textnote_artid ){


                                    webviewbutton = [UIButton buttonWithType:UIButtonTypeRoundedRect];

                                    [webviewbutton addTarget:self action:@selector(webviewbuttonclick1:) forControlEvents:UIControlEventTouchUpInside];

                                    [webviewbutton setTitle:@"click" forState:UIControlStateNormal];

                                    webviewbutton.frame = CGRectMake(table_textnote_xcor, table_textnote_ycor, 30.0, 20.0);


                                    webviewbutton.tag = gTag;
                                    gTag++;

                                    [wbCont.scrollView  addSubview:webviewbutton];






                                }




                            }
                        }
                    }


                }



            }
        }
    }
然后单击webviewbutton,我从数据库中获取保存文本的x&y坐标。在这里,我需要为webviewbutton标记获取保存的文本

-(void)webviewbuttonclick1:(id)sender{

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    // NSString *documentsDirectory = [paths objectAtIndex:1];

    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"];



    textArray=[[NSMutableArray alloc]init];


    if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {


      //  const char *sql =  [[NSString stringWithFormat:
                           //  @"SELECT textnotes,text_id,txcoor,tycoor FROM textnote where txcoor = '%f' AND tycoor = '%f'",xcor,ycor]cStringUsingEncoding:NSUTF8StringEncoding];





        const char *sql ="SELECT textnotes,text_id,txcoor,tycoor FROM textnote where txcoor = 113.0 AND tycoor = 342.0";

        NSLog(@"sql is %s",sql);

        sqlite3_stmt *statement;

        if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {

            while (sqlite3_step(statement) == SQLITE_ROW) {

                txtstring = [[NSString alloc] initWithUTF8String:
                             (const char *) sqlite3_column_text(statement, 0)];


                art_Idt = sqlite3_column_int(statement, 1);

                tx = sqlite3_column_double(statement, 2);
                ty = sqlite3_column_double(statement, 3);

                NSLog(@"txtstring is %@",txtstring);

                NSLog(@"art_Idt is %ld",(long)art_Idt);

                NSLog(@"tx is %f",tx);
                NSLog(@"ty is %f",ty);

                [textArray addObject:txtstring];

                NSLog(@"textArray is %@",textArray);





            }
        }


    }


    txtt=[[UITextView alloc]initWithFrame:CGRectMake(0,0,320,568)];

    txtt.text=txtstring;

    NSLog(@"text is %@",txtt.text);

    [self.view addSubview:txtt];

在访问大于数组大小的元素时,通常会显示错误消息
[\uuu NSArrayM objectAtIndex:]:索引1超出边界[0..0]

在本例中,数组只有一个元素,因此如果要访问该元素,则需要使用
objectAtIndex:0
。由于您没有向我们展示如何初始化/填充数组,因此我无法为您提供更多帮助


看在上帝的份上,请尝试使用更好的标识符名称并缩进代码。在这个世界上,除了你之外,没有人会理解
click1
button1
button4
的含义。事实上,两周后,我可以向您保证,您将忘记
click1
的含义。相信我,如果你继续这样做,你会很快变得讨厌编程。

我真的希望你不要真的这样写代码。。。请使用好的变量名并正确缩进代码。如果你不理解你的代码,我甚至不会去尝试去理解你的代码。与其用标签来识别按钮,为什么不直接使用你已经拥有的对象的引用呢?你的错误是什么?这是一个大过程。我不能简短地解释。我不知道怎么解释。你们能来聊天吗?我需要把webviewbutton标签存储到数据库吗?