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标签存储到数据库吗?