重新排序 UITableView 行时,详细视图未更新
Posted
技术标签:
【中文标题】重新排序 UITableView 行时,详细视图未更新【英文标题】:Detail view not updating when UITableView rows are re-ordered 【发布时间】:2014-09-08 15:39:50 【问题描述】:我有一个推送到 Detail ViewController 的 UITableView。在我的表格视图中,我的行是可拖动/可重新排列的。但是,当切换行时,选择行时路径保持不变并显示详细视图。示例:TableView Re-order Pic
如果我将“牛奶”行与“健身房”行切换,然后选择“健身房”,详细视图仍会返回牛奶行的详细信息。
我该如何解决这个问题,以便行的路径可以适当地切换?
.m :
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
// Return the number of sections.
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [self->newArray count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
NSDictionary *theFood = [values objectAtIndex:indexPath.row];
cell.textLabel.text = [theFood valueForKey:@"name"];
cell.detailTextLabel.text = [theFood valueForKey:@"price"];
return cell;
- (IBAction) EditTable:(id)sender
if(self.editing)
[super setEditing:NO animated:NO];
[_myTableView setEditing:NO animated:NO];
// [_myTableView reloadData];
[self.navigationItem.leftBarButtonItem setTitle:@"Edit"];
[self.navigationItem.leftBarButtonItem setStyle:UIBarButtonItemStylePlain];
else
[super setEditing:YES animated:YES];
[_myTableView setEditing:YES animated:YES];
// [_myTableView reloadData];
[self.navigationItem.leftBarButtonItem setTitle:@"Done"];
[self.navigationItem.leftBarButtonItem setStyle:UIBarButtonItemStyleDone];
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
return YES;
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
if( fromIndexPath == toIndexPath )
return;
NSDictionary *moveFood = [self->newArray objectAtIndex:fromIndexPath.row];
[self->newArray removeObjectAtIndex:fromIndexPath.row];
[self->newArray insertObject:moveFood atIndex:toIndexPath.row];
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"detailSegue"])
NSIndexPath *indexPath = [self.myTableView indexPathForSelectedRow];
DetailViewController *detailVC = segue.destinationViewController;
detailVC.detailFood = [values objectAtIndex:indexPath.row];
【问题讨论】:
您在 TableView 的“后面”使用什么数据结构。你不能更新一下然后reloadData
吗?
(将 TableView 视为表的“视图”。您管理表,然后让 TableView “查看”它。您不使用 TableView 作为数据结构。)
所以,更新您的values
数组和reloadData
。
我在 moveRowAtIndexPath 方法的末尾尝试了 [_myTableView reloadData],但它似乎不起作用.. :(
你更新values
了吗?您是否从values
(更新后)获取详细视图的信息? (您上面的代码正在更新newArray
,但不是values
。)
【参考方案1】:
当您切换行时,您还应该更新您的数据源。否则当调用 tableView 的 didSelect 方法时,它会访问数据源数组中的错误对象。
所以在–tableView:moveRowAtIndexPath:toIndexPath:
switch 中切换的对象的位置。
【讨论】:
【参考方案2】:特别感谢@HotLicks 帮助我!
问题是在我的tableView:moveRowAtIndexPath:toIndexPath:
方法更新之后,我没有将详细视图的数据源从 values NSArray 更改为我的 newArray NSMutableArray!
【讨论】:
以上是关于重新排序 UITableView 行时,详细视图未更新的主要内容,如果未能解决你的问题,请参考以下文章
从 iOS 中的 UIView 子视图重新加载时 UITableView 未重新加载