0

我想要实现的目标很简单,尽管从一开始就想到了。最后我发现很难处理。

我想推送一个表格视图作为选择列表,用户选择一个单元格,单元格字符串作为选定字符串发送到前一个视图,简单吧??

先看两张图

选择房屋,然后推到下一个视图

在此视图中选择一个单元格

困扰我的是:

我想提供(至少)两个按钮,左边一个是导航控制器自动生成的后退按钮,右边一个用于编辑。导航控制器默认有两个按钮(据我所知)。所以没有“完成”按钮的位置,用户应该点击然后确认并弹出到上一个视图。因此,当用户点击一个单元格时,例如“穿着”,我希望发生以下情况,自动和视觉上对用户可见:

  1. 用户可以看到“房屋”单元格未标记
  2. 然后用户可以看到“穿着”单元格被标记
  3. 然后经过一点时间间隔(比如 0.2 秒),弹出到上一个视图并自动更新选择。

起初我认为这很容易,但事实并非如此。这是我的代码,但工作有线

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0ul); dispatch_async(queue, ^{ //unmark previous cell if (selectedIndexPath!=nil) { [[self.tableView cellForRowAtIndexPath:selectedIndexPath]setAccessoryType:UITableViewCellAccessoryNone]; } selectedIndexPath=indexPath; //get the selected cell to mark UITableViewCell *cell=[self.tableView cellForRowAtIndexPath:indexPath]; [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; dispatch_sync(dispatch_get_main_queue(), ^{ //wait a little [NSThread sleepForTimeInterval:0.2]; //return to previous view NSLog(@"here........."); if ([objectToUpdateCategory respondsToSelector:@selector(updateCategoryTo:withSelectedIndexPath:)]) { NSLog(@"sending.......... update info"); [objectToUpdateCategory updateCategoryTo:cell.textLabel.text withSelectedIndexPath:selectedIndexPath]; NSLog(@"sent update info"); } [self.navigationController popViewControllerAnimated:YES]; }); });

棘手的是,如果我把[self.navigationController popViewControllerAnimated:YES] ; 到最后,视图不会在视觉上更新取消标记和标记步骤并立即返回上一个视图。起初,当我没有考虑取消标记的事情时,代码中的“队列”东西可以在弹出之前直观地执行标记步骤,但有时不起作用。我不知道我的代码是否正确,实际上我没有不太了解苹果的这种队列技术。但我很确定它与 NSThread / queue 或其他处理并发有关。我检查了苹果文档一整天,没有找到直接的答案。

希望有人可以帮助我,在此先感谢:)

4

2 回答 2

1

要“经过一点时间间隔(例如 0.2 秒),弹出到上一个视图”,请使用performSelector:withObject:afterDelay:方法或其变体之一,例如:

[self performSelector:@selector(delayedPop) withObject:nil afterDelay:0.2];

并将其放入popViewControllerAnimated方法delayedPop中,例如:

-(void)delayedPop{
    [self.navigationController popViewControllerAnimated:YES];
}
于 2013-05-12T11:44:47.287 回答
0

首先,正如我在评论中所写,您不应该在后台线程上更新 UI。这会导致很多问题,包括 UI 没有立即更新。在您的情况下,您根本不需要使用 dispatch_async 或 dispatch_sync 。我要做的是在视图控制器中创建一个显示类别表视图的属性:

@property (nonatomic, weak) id<CategoryControllerDelegate> delegate;

当您将类别控制器推入堆栈时,您将费用控制器设置为委托。然后,当用户在类别控制器中进行选择时,您调用委托上的方法(在协议中定义),例如代码示例中的方法:

@protocol CategoryControllerDelegate<NSObject>
@optional
- (void) updateCategoryTo: (NSString*) category withSelectedIndexPath: (NSIndexPath*) path;
@end

之后,您将当前视图控制器从堆栈中弹出。

于 2013-05-12T09:04:17.290 回答