2011-07-06 25 views
3

可能重复:
Make UIAlertView blockingIOS UIAlertView中:使警报等我反应

了打我的头靠在墙上的这一个小时。

下面是我得到了什么:OrderDetailsViewController被设置为UIAlertViewDelegate

我有一个接收信息传回从一个搜索表单的过程。它检查项目是否已经在订单上,如果没有继续添加项目。如果它看到一个副本,它会弹出一个UIAlertView中询问用户想要做什么:有3个选项,“组合” - 新的数量增加了老项目,“添加”副本作为一个单独的项目,或者“取消“扔掉新物品。我需要它等待来自UIAlertView的回答,以便我可以继续添加该投掷物或扔掉投掷物 - “组合”由代表处理,但我仍然需要主程序的答案。

这是我到目前为止有:

- (void)returnItemAndQty:(ProductsSearchController *)productsSearchController 
     withItemsToAdd:(NSMutableArray *)itemsToAdd 
     withQty:(NSDictionary *)qtyToAdd andClose:(BOOL)close 
{ 
if ([itemsToAdd count] == 0) { 
    return; 
} 
Items *items; 
for (int index = 0; index < [itemsToAdd count]; index++) { 
    items = [itemsToAdd objectAtIndex:index]; 
    qtyAddedToOrder = [NSDecimalNumber decimalNumberWithString:[qtyToAdd objectForKey:items.ItemCode]];  
    NSLog(@"Item Code: %@", items.ItemCode); 
    NSLog(@"Qty: %@", [qtyToAdd objectForKey:items.ItemCode]); 
    NSError *error; 

    //For handling duplicate items. . . 
    duplicateItemDisposition = -1; //Reset the dispostion for normal operation 
    if([self isItemOnOrder:items.ItemCode]) 
    { 
     int i = [self itemIsAlreadyOnOrder:itemAlreadyOnOrder withQty:qtyAddedToOrder]; 

     if (i == COMBINE || i == CANCEL){ //either Cancel or Combine was pressed. 
      items.Checked = NO; 
      if (![items.managedObjectContext save:&error]) 
      { 
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      } 
      continue; 
     } 
    } 
    //Add the new item or duplicate if that's what you want 
    OrdersDetails *newOrderDetail = [NSEntityDescription insertNewObjectForEntityForName:@"OrdersDetails" 
                    inManagedObjectContext:self.managedObjectContext]; 

.//more code snipped, that handles the "ADD" or non-dupe 
. 
. 

在此处,它测试的重复。 。 。

- (BOOL)isItemOnOrder:(NSString *)itemCode 
{ 

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"OrdersDetails" 
              inManagedObjectContext:managedObjectContext]; 
    [request setEntity:entity]; 

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"Desc1" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sort, nil]; 
    [request setSortDescriptors:sortDescriptors]; 
    [sort release]; 
    [sortDescriptors release]; 

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(ItemCode=%@ AND OrderID=%@)", itemCode, orders.OrderID]; 
    [request setPredicate:pred]; 

    NSError *error; 
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:& error] mutableCopy]; 
    [request release]; 
    if (mutableFetchResults == nil) { 
     itemAlreadyOnOrder = nil; 
     return NO; 
    }else if ([mutableFetchResults count] > 0){ 
     itemAlreadyOnOrder = [mutableFetchResults objectAtIndex:0]; 
     return YES; 
    }else{ 
     itemAlreadyOnOrder = nil; 
     return NO; 
    } 
} 

这里就是它看到愚弄的人存在,它的UIAlertView中委托。 。 。

- (int) itemIsAlreadyOnOrder:(OrdersDetails *)existingOrderDetail withQty:(NSDecimalNumber *)qty 
{ 
    if (existingOrderDetail == nil) { 
    return -1; 
    } 

    UIAlertView *duplicateAlert = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"Duplicate Item %@ found.",existingOrderDetail.ItemCode] message:@"Tap Combine to combine the items, Tap Add to add the duplicate item or Tap Cancel to discard the duplicate" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Combine", @"Add", nil]; 
    [duplicateAlert show]; 

    return duplicateItemDisposition; 

    [duplicateAlert release]; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
// Cancel = 0, Combine = 1, Add = 2 

    if (buttonIndex == CANCEL){ 
     duplicateItemDisposition = CANCEL; 
    }else if (buttonIndex == COMBINE){ 
      duplicateItemDisposition = COMBINE; 
      NSDecimalNumber *existingQty = [[NSDecimalNumber alloc] initWithDecimal:[itemAlreadyOnOrder.Qty decimalValue]]; 
      NSDecimalNumber *existingPrice = itemAlreadyOnOrder.Price; 
      NSDecimalNumber *newQty = [existingQty decimalNumberByAdding:qtyAddedToOrder]; 
      itemAlreadyOnOrder.ExtPrice = [newQty decimalNumberByMultiplyingBy:existingPrice]; 
      [existingQty release]; 
      NSError *error; 
      if (![itemAlreadyOnOrder.managedObjectContext save:&error]){ 
     NSLog(@"Error saving. %@, %@", error, [error userInfo]); 
       [self handleFreeGoods:itemAlreadyOnOrder]; 
      }else if (buttonIndex == ADD){ 
       duplicateItemDisposition = ADD; 
      } 
} 

现在我读了一些关于在后台线程中使用NSCondition的内容,但我不知道这意味着什么。我抬头看了一下NSCondition,它不如启发。

有关如何暂停执行任何想法?

+0

你上的NSOperation或后台执行一些其他的方法进行一些工作?你试图“暂停”什么? – RyanR

+0

我不是。我基本上只是试图让代码等待来自UIAlertView的响应,然后再继续。我没有使用任何后台执行或多线程。 –

回答

2

UIAlertView不能阻止,因为它得到在runloop结束时显示。相反,具有方法itemIsAlreadyOnOrder:返回指示应该如何处理重复项来完成的值,从UIAlertView委托方法需要通知你的控制器有问题的项目已得到解决。跟踪问题的地方(_objectToVerify或类似的东西)的对象,并从UIAlertView呼叫基于用户选择的方法,这将在该_objectToVerify行动的委托方法。

+0

请原谅我的无知,但我不确定自己明白。由于我在添加项目的方法中检查重复项,因此我不确定我将如何处理非重复项。 –

+0

我认为您期待UIAlertView -show方法阻止执行 - 它不会,也不会。除了实现自己的弹出视图(这不是非常困难,但它是非标准的),唯一的选择是改变代码的工作方式,直到UIAlertView调用'clickedButtonAtIndex'时它才会执行任何操作。 – RyanR

+0

是的,我只是不知道该怎么做。不管怎么说,还是要谢谢你。 –

0

我不知道这可能会改变你目前的设计多少,但Cocoa设计模式会让提醒不返回任何东西的方法,所以像伪代码中的if (duplicate) showAlertView。然后在警报视图的委托中调用一个方法,该方法根据用户输入实际处理重复的处理。

+0

是的,我第一次尝试它。就像我说过的,我一直在这附近。我无法真正处理所有重复的案件,因为其中一个案件就是放过它。代码的最后一部分处理非重复,所以警报甚至不会被抛出。 –

+0

你有没有考虑过UIActionSheet? – FeifanZ

+0

我没有考虑过UIActionSheet。我会研究它。 –