tyler53
tyler53

Reputation: 429

How Do I add a UITableViewCell using a button in IB

So what I am trying to do is create a notepad style addition to my app. All I want is for it to work exactly like apples existing notepad where you click the "add" button in the top right, then it creates a new note that you can write in and then when you click done it adds the note to a Cell in a UITableView.

I already have the UITableView and everything set up I just need to know how to run this action

-(IBAction)noteAdd:(id)sender{ }

And then when you click that button it does what I described above.

How would I go about doing this? I'm a little lost.

This Is How I am Adding the TableView to the scene, just By the way.

//tableview datasource delegate methods
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return cameraArray.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath{
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];


if(cell == nil){
    cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault     reuseIdentifier:@"Cell"];
}

NSEnumerator *enumerator = [cameraArray objectEnumerator];
id anObject;
NSString *cellName = nil;
while (anObject = [enumerator nextObject]) {
   cellName = anObject;
}
//static NSString *cellName = [cameraArray.objectAtIndex];
cell.textLabel.text = [NSString stringWithFormat:cellName];
return cell;

}

Upvotes: 0

Views: 129

Answers (1)

Kevin
Kevin

Reputation: 56049

In UITableView

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

So you'd do something like

-(IBAction) noteAdd:(id)sender
{
    NSIndexPath *newCellPath = [NSIndexPath indexPathForRow:cameraArray.count 
                                                  inSection:0];

    // I'm assuming cameraArray is declared mutable.
    [cameraArray addObject:@"New item"];

    [self.tableView insertRowsAtIndexPaths:@[newCellPath]
                          withRowAnimation:UITableViewRowAnimationFade];
}

While I'm at it, a few comments on your code:

I'm pretty sure this code:

NSEnumerator *enumerator = [cameraArray objectEnumerator];
id anObject;
NSString *cellName = nil;
while (anObject = [enumerator nextObject]) {
   cellName = anObject;
}

is a rather roundabout way of getting the last string in the array. You could do that easier with cameraArray.lastObject. But I don't think that's what you want either, I think you're looking for

// XCode >= 4.5:
cellName = cameraArray[indexPath.row];

// XCode < 4.5:
cellName = [cameraArray objectAtIndex:indexPath.row];

And the next line:

cell.textLabel.text = [NSString stringWithFormat:cellName];

Best case, this creates an extraneous string. If the cell name happens to have a % in it, you'll almost certainly either get an error or an EXC_BAD_ACCESS. To fix that error you could use

cell.textLabel.text = [NSString stringWithFormat:@"%@", cellName];

but there's really no reason to. Just assign the string directly:

cell.textLabel.text = cellName;

Or if you insist on a copy:

cell.textLabel.text = [NSString stringWithString:cellName];
// OR
cell.textLabel.text = [[cellName copy] autorelease];
// OR

Upvotes: 1

Related Questions