如何将就地编辑的内容传递回上一个tableview控制器(更新模型)

时间:2014-04-06 17:07:10

标签: ios objective-c uitableview

我有两个表视图,一个名为mainTableViewController(mtvc),另一个名为detailTableViewController(dtvc)。这是非常典型的点击主tableview单元格上的附件按钮带你到详细的tableview有点事。

在prepareForSegue方法中,从主tableview传递到detail tableview的数据是一个名为item的NSMutableArray。

这就是我显示的方式:cell.detailTextLabel.text = self.item [indexPath.row];

很酷的是我设法在详细信息表视图单元格上进行就地编辑(覆盖了NSTableViewCell,将UITextField添加为每个单元格的子视图)。

一切正常,我花了一整天最后一件事无法弄清楚如何在就地编辑后更新NSMutableArray项目,最终目标是就地编辑,主表视图数据应反映变化

我尝试使用委托和协议但它不起作用(就地编辑的内容没有被传回,部分原因是我不知道如何捕获已编辑的内容,它不喜欢它是一个带有名称的文本字段,我不能只使用updatedContent = self.myTextField.text来获取更改)

我的想法已经用完,任何帮助都会受到高度赞赏,谢谢。

这是主tableview控制器中的prepareForSegue

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.identifier isEqualToString:@"toInventoryDetail"]) {

            NSMutableArray *selectedItem = nil;

            if (self.searchDisplayController.active) {
                selectedItem = _searchResults[[sender row]];
            } else {
                selectedItem = _appDelegate.items[[sender row]];
            }

            UPFInventoryDetailTableViewController *idtvc = segue.destinationViewController;
            idtvc.item = selectedItem;
        }
    }

这里是详细tableview控制器的cellForRowAtIndex

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";

        UPFEditableUITableViewCell *cell = [[UPFEditableUITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellIdentifier];

        cell.textLabel.text = _appDelegate.title[indexPath.row];
        cell.detailTextLabel.text = self.item[indexPath.row];

        [cell showEditingField:YES];

        return cell;
    }

我写了代表团,但是因为他们没有工作而删除它们。

我有一个想法,显然仍然使用授权和协议:当完成'在详细的tableview命中按钮,我去抓取所有行内容并构建一个新数组,使用委托将这个新数组传递回主tableview控制器,将这个新数组添加到模型中,同时删除旧数组。棘手的问题仍然是我如何在详细的表格视图中获取所有内容?

更新: 哈哈!我认为解决了一半的难题!

这里是详细的tableview控制器

的解决方案
    - (IBAction)doneUpdate:(UIBarButtonItem *)sender {
        [self.delegate addItem:[self newItem]];
    }

    - (NSMutableArray *)saveItem
    {
        NSMutableArray *newItem = [[NSMutableArray alloc] init];
        NSArray *indexPathes = [self.tableView indexPathsForVisibleRows];
        for (NSIndexPath *indexPath in indexPathes) {
                UPFEditableUITableViewCell *cell = (UPFEditableUITableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];
        [newItem addObject:cell.editField.text];
        }
        return newItem;
    }

这里是主要的tableview控制器

    - (void)addItem:(NSArray *)item
    {
        //take the updated item then insert the items array as new item
        [_appDelegate.items addObject:item];
        //remove the selected item (the one being updated) from the items array
        [_appDelegate.items removeObject:_appDelegate.selectedItem];
        [self.tableView reloadData];
        [self.navigationController popViewControllerAnimated:YES];
    }

2 个答案:

答案 0 :(得分:1)

创建单元格时 - 为您的 UITextFields添加标签 您可以收集其委托方法输入的数据 - 您可以制作NSDictionary /键值对,也可以将其添加到NSArray

- (void)textFieldDidEndEditing:(UITextField *)textField {

       if(textField.tag == 11) {

          // you can add it to your desired array/dictionary
       }  

}

OR

- (BOOL)textFieldShouldReturn:(UITextField *)textField {

 if(textField.tag == 11) {

          // you can add it to your desired array/dictionary
       }  
}

您可以使用Delegation/Protocol或将此值存储在NSUserDefault中,然后将其恢复到mainViewController上。

答案 1 :(得分:0)

您的selectedItem是否有单独的数据模型类(类)?这将是在两个TableViewControllers之间保持数据的适当方式。它可以是Core Data,也可以是生活在内存中的NSMutableArray。 DetailViewController更新item并保存更改,然后mainTableViewController重新加载TableView(甚至只是支持先前编辑的单元格的数据。) 甚至可以考虑由pattern推广的模型 - 视图 - 控制器 - 商店BigNerdRanch