错误数量的对象被添加到可变数组 [英] Incorrect number of objects getting added to mutable array

查看:66
本文介绍了错误数量的对象被添加到可变数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有表视图的视图控制器,该视图包含8个单元格(节).我创建了一个textField并将该文本字段作为子视图添加到6个单元格中,剩下2个单元格,其中一个单元格包含文本视图,另一个单元格包含文本视图因为我使用的是相同的文本字段,所以我已经分配了标签值,然后创建了一个可变数组,将文本字段添加到了该数组中.以下是实现代码:

I have a view controller with table view that contains 8 cells(sections).I have created a textField and added that text field as a subview to 6 cells,remaining 2 cells of which one cell contains a text view and the other with a button.Because I am using the same text field,I have assigned tag values and then created a mutable array,added the textfield to that array.Here is the implementation code:

考虑到兰克先生的建议,我更改了实施代码

编辑

- (UITableViewCell *)tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

 NSString *identifier = @"UITableViewCell";

UITableViewCell *cell = (UITableViewCell *)[atableView dequeueReusableCellWithIdentifier:identifier];

    atableView.backgroundColor = [UIColor clearColor];

    textField = [[[UITextField alloc]initWithFrame:CGRectMake(15, 12, 300, 24)]autorelease];
    textField.textColor = [UIColor whiteColor];
    textField.delegate = self;
    tagValues = textField.tag;


switch (indexPath.section) 
{
    case 0:
    {
        NSString *cellIdentifierA = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];
        if (cell == nil) 
        {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifierA];
            cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"reminderbutton.png"]];
        }
        textField.placeholder = @"Enter name";
        textField.tag = 101;
        textField.text = reminderInstance.Name;
        textField.autocorrectionType = UITextAutocorrectionTypeNo;
        [cell.contentView addSubview:textField];
    }
        break;

    case 1:
    {
        NSString *cellIdentifierB = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];
        if (cell == nil) 
        {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifierB];
            cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"reminderbutton.png"]];
        }
        textField.tag = 102;
        textField.text = reminderInstance.Event;
        [cell.contentView addSubview:textField];
    }
        break;

    case 2:
    {
        NSString *cellIdentifierC = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];
        if (cell == nil) 
        {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifierC];
            cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"reminderbutton.png"]];
        }
        textField.placeholder = @"Click here to set date and time";
        textField.inputView = self.datePicker;
        textField.text = reminderInstance.Date;
        textField.tag = 103;
        [cell.contentView addSubview:textField];
    }   
        break;

    case 3:
    {
        NSString *cellIdentifierD = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];
        if (cell == nil) 
        {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifierD];
            cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"reminderbutton.png"]];
        }
        textField.tag = 105;
        textField.text = reminderInstance.numDays;
        textField.inputView = self.reminderPicker;
        [cell.contentView addSubview:textField];
    }
        break;

    case 4:
    {   
        NSString *cellIdentifierE = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];
        if (cell == nil) 
        {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifierE];
            cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"reminderbutton.png"]];
        }
        checkboxButton = [[[UIButton alloc] initWithFrame:CGRectMake(16,1,120, 44)]autorelease];
        [checkboxButton setImage:[UIImage imageNamed:@"ewee.png"] forState:UIControlStateNormal];
        [checkboxButton addTarget:self action:@selector(toggleButton:) forControlEvents:UIControlEventTouchUpInside];

        NSString *one = reminderInstance.selString;
        NSNumber* i = [NSNumber numberWithInt:[one intValue]];
        BOOL isOn = [i boolValue];

        if(isOn)
        {
            [checkboxButton setImage:[UIImage imageNamed:@"checkarrow.png"] forState:UIControlStateNormal];
        }
        else
        {
            [checkboxButton setImage:[UIImage imageNamed:@"ewee.png"] forState:UIControlStateNormal];
        }            

        [checkboxButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
        [checkboxButton setImageEdgeInsets:UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)];
        [cell addSubview:checkboxButton];
        UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(55, 10, 225, 24)];
        label.text = @"Every Year";
        label.textColor = [UIColor whiteColor];
        label.backgroundColor = [UIColor clearColor];
        [cell addSubview:label];
        cell.textLabel.textColor = [UIColor whiteColor];
        [label release];
    }
        break;

    case 5:
    {
        NSString *cellIdentifierF = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];
        if (cell == nil) 
        {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifierF];
            cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"reminderbutton.png"]];
        }
        textField.placeholder = @"Enter the number here";
        textField.text = num;
        textField.text = reminderInstance.number;
        textField.tag = 106; 
        textField.userInteractionEnabled = YES;
        textField.keyboardType = UIKeyboardTypeNumberPad;
        [cell.contentView addSubview:textField];
    }
        break;

    case 6:
    {
        NSString *cellIdentifierG = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];
        if (cell == nil) 
        {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifierG];
            cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"reminderbutton.png"]];
        }
        cell.backgroundColor = [UIColor clearColor];
        textView.clipsToBounds = YES;
        textView = [[UITextView alloc]initWithFrame: CGRectMake(-2, -3, 307, 154)];
        UIImageView *imgView = [[[UIImageView alloc]initWithFrame: textView.frame]autorelease];
        imgView.image = [UIImage imageNamed: @"reminderbuttonxl.png"];
        [textView addSubview: imgView];
        [textView sendSubviewToBack: imgView];
        textView.backgroundColor = [UIColor clearColor];
        textView.delegate = self;
        textView.tag = 11;
        textView.text = reminderInstance.msgBody;
        tagValues = textView.tag;
        textView.textColor = [UIColor whiteColor];
        [cell.contentView addSubview:textView];
        [textView release];
    }
        break;

    case 7:
    {
        NSString *cellIdentifierH = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];
        if (cell == nil) 
        {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifierH];
            cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"reminderbutton.png"]];
        }
        textField.tag = 107;
        textField.inputView = self.groupPicker;
        tagValues = textField.tag;
        textField.text = reminderInstance.remGroup;
        [cell.contentView addSubview:textField];
    }
        break;

    default:
        break;
}

    [self.fields addObject:textField];

NSLog(@"Fields = %@",fields);

return cell;

}

现在,当我尝试使用以下语句打印数组时:

Now when I am trying to print the array using the following statement:

NSLog(@"Fields =%@",fields);我可以在控制台窗口中观察到以下内容:

NSLog(@"Fields = %@",fields); I could observe the following in console window:

Fields = (
    "<UITextField: 0x9d043a0; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; tag = 101; layer = <CALayer: 0x9d044e0>>"
)
Fields = (
    "<UITextField: 0x9d043a0; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; tag = 101; layer = <CALayer: 0x9d044e0>>",
    "<UITextField: 0x9d07d50; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; tag = 102; layer = <CALayer: 0x9d07ca0>>"
)
Fields = (
    "<UITextField: 0x9d043a0; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; tag = 101; layer = <CALayer: 0x9d044e0>>",
    "<UITextField: 0x9d07d50; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; tag = 102; layer = <CALayer: 0x9d07ca0>>",
    "<UITextField: 0x7108650; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; tag = 103; layer = <CALayer: 0x7108620>>"
)
Fields = (
    "<UITextField: 0x9d043a0; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; tag = 101; layer = <CALayer: 0x9d044e0>>",
    "<UITextField: 0x9d07d50; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; tag = 102; layer = <CALayer: 0x9d07ca0>>",
    "<UITextField: 0x7108650; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; tag = 103; layer = <CALayer: 0x7108620>>",
    "<UITextField: 0x5c7bf90; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; tag = 105; layer = <CALayer: 0x5c7c920>>"
)
Fields = (
    "<UITextField: 0x9d043a0; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; tag = 101; layer = <CALayer: 0x9d044e0>>",
    "<UITextField: 0x9d07d50; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; tag = 102; layer = <CALayer: 0x9d07ca0>>",
    "<UITextField: 0x7108650; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; tag = 103; layer = <CALayer: 0x7108620>>",
    "<UITextField: 0x5c7bf90; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; tag = 105; layer = <CALayer: 0x5c7c920>>",
    "<UITextField: 0x9d08b20; frame = (15 12; 300 24); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x9d08af0>>"
)

现在,从上面的o/p中我们可以看到,要打印的字段数是5,即4个文本字段和带有按钮的单元格,但是根据我们在-CellForRowAtIndexPath中的编码,6个单元格包含文本字段,因此字段数必须为6,但是我们得到的结果是错误的,即5(4个textfields + button),这是一个错误.

Now as we can observe from the above o/p that number of fields that are getting printed is 5 i.e the 4 textfields and the cell with button,But as per our coding in -CellForRowAtIndexPath,6 cells contains textfield,hence the number of fields must be 6,but we are getting wrong result i.e. 5 (4 textfields+button) which is a blunder.

这也导致我将数据保存在表格视图问题中,即对于本例中标题为保存"的右侧导航栏按钮项目,我已实现:

This is also leading me to saving the data in table view issue,i.e. for right navigation bar button item titled "Save" in my case,I have implemented:

-(IBAction)save:(id)sender
{
//Code for saving entered data using sqlite

    UITextField *fieldOne = [self.fields objectAtIndex:0];
    UITextField *fieldTwo = [self.fields objectAtIndex:1];
    UITextField *fieldThree = [self.fields objectAtIndex:2]; 
    UITextField *fieldFour = [self.fields objectAtIndex:3];
    UITextField *fieldFive = [self.fields objectAtIndex:5];
    UITextField *fieldSix = [self.fields objectAtIndex:7];
sqlite3_stmt *statement = nil;
    const char *dbpath = [databasePath UTF8String];

    if (sqlite3_open(dbpath, &remindersDB) == SQLITE_OK && textField.text != nil)
    {
if (self.navigationItem.rightBarButtonItem.title == @"Save")
        {
            NSLog(@"am in the save loop");
            NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO reminders(name,event,date,bfr,val,num,bod,grp) VALUES (\"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\")", fieldOne.text, fieldTwo.text,fieldThree.text,fieldFour.text,isSelected,fieldFive.text,textView.text,fieldSix.text]; 
            const char *insert_stmt = [insertSQL UTF8String];
            sqlite3_prepare_v2(remindersDB, insert_stmt, -1, &statement, NULL);

            if (sqlite3_step(statement) == SQLITE_DONE)
            {
                UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"\nReminder Saved" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:nil,nil];
                [alert show];
                [alert dismissWithClickedButtonIndex:0 animated:YES];
                [alert release];
            }

            else 
            {
                UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:@"Reminder not saved" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
                [alert show];
                [alert release];
            }
        }
//Check the last inserted row id
        rowID =  sqlite3_last_insert_rowid(remindersDB);
        NSLog(@"last inserted rowId = %d",rowID);

        sqlite3_finalize(statement);
        sqlite3_close(remindersDB);

        [self.tableView reloadData];
 }
}

现在问题出在索引位置值上,因为字段" 数组所保存的值(字段)数为5,所以索引值将为0-4,但是如果我给出相应的值,即在保存的同时,将数据插入sqlite数据库时,我得到的字段会减少,在控制台中打印时,我在表格视图的第5和第7个位置也得到了空值.在上面的实现代码段中,我们可以观察到我已经使用插入了到表视图节值(索引)的索引位置.

Now the problem is with the index location values,since the number of values(fields) that "fields" array is holding is 5,the index values would be 0-4,but If I give the values accordingly,i.e. while saving,I would get a field less while inserting data in to sqlite database,Also I am getting null values in 5th and 7th locations of table view when printing in console.In the above implementation snippet,we can observe that I have inserted using the index location to that of table view section values(indices).

当我根据表格视图的节索引值进行保存时,这些值会正确打印.但是当我不触摸表格视图的第5位和第7位时遇到崩溃问题. '***-[NSMutableArray objectAtIndex:]:索引5超出范围[0 .. 4]'

When I save according to section index values of table view,the values are getting printed properly.But I am getting crash problem when I don't touch the 5th and 7th locations of table view.i.e. '*** -[NSMutableArray objectAtIndex:]: index 5 beyond bounds [0 .. 4]'

我不明白为什么只将5个字段值而不是6个字段值插入到数组中的原因.任何一个都可以指导我正确的方向

I don't understand the reason why only 5 field values are getting inserted in to the array instead of 6.Can any one please guide me in right direction

很抱歉,我的信息量很大,因此我将其详细介绍了一下,以便可以轻松地解决该问题.

Sorry for this huge post,I wanted to be informative,hence I have made it look detailed so that the issue can be answered with ease.

编辑

用于表视图的节和行数的代码:

The code for number of sections and rows for table view:

#pragma mark -
#pragma mark TableView Datasource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)atableView
{

    return 8;

}

- (NSInteger)tableView:(UITableView *)atableView numberOfRowsInSection:(NSInteger)section
{

    int arr = 1;

    return arr;
}

行在索引路径处的高度:

Implementation of height for row at index path :

- (CGFloat)tableView:(UITableView *)atableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    float f;
    if (indexPath.section==6&&indexPath.row==0) 
    {
        f=140.0f;
        return f;
    }
    else
    {
        f = 44.0f;
    return f;
    }
}

所有表格视图单元格都不会在滚动之前加载.但是,当我滚动时,控件将到达第5、6和7个单元格.我发现这就是为什么第5、7个单元格的文本字段未添加到字段"数组.

All the table view cells are not loading before scrolling.But when I scroll then the control is reaching 5th,6th and 7th cells.I found out that's the reason why the textfield in 5th and 7th cells are not getting added to "fields" array.

我搜索的解决方案主要是类型

I searched for solution mostly the posts of this type

首先感谢所有:)

推荐答案

我找到了感谢所有查看该问题的人.

Thanks every one who viewed the question.

这篇关于错误数量的对象被添加到可变数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆