ios UIAlertView:使警报等待我的响应

ios UIAlertView:使警报等待我的响应,ios,ipad,uialertview,Ios,Ipad,Uialertview,可能重复: 在这件事上我已经撞了好几个小时了 我得到的是:OrderDetailsViewController设置为UIAlertViewDelegate 我有一个程序从搜索表单接收信息。它检查订单上是否已经有该项目,如果没有,则继续添加该项目。如果看到重复项,它会弹出一个UIAlertView,询问用户想要做什么:有3个选项,“合并”-将新数量添加到旧项目中,“添加”重复项作为单独的行项目,或“取消”丢弃新项目。我需要它等待UIAlertView的回答,以便我可以继续添加dupe或丢弃dup

可能重复:

在这件事上我已经撞了好几个小时了

我得到的是:OrderDetailsViewController设置为UIAlertViewDelegate

我有一个程序从搜索表单接收信息。它检查订单上是否已经有该项目,如果没有,则继续添加该项目。如果看到重复项,它会弹出一个UIAlertView,询问用户想要做什么:有3个选项,“合并”-将新数量添加到旧项目中,“添加”重复项作为单独的行项目,或“取消”丢弃新项目。我需要它等待UIAlertView的回答,以便我可以继续添加dupe或丢弃dupe——“合并”在委托中处理,但我仍然需要主过程的回答

以下是我目前掌握的情况:

 - (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
.
.
在这里,它可以看到一个dupe存在,并且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的内容,但我不知道这意味着什么。我查了一下这个条件,它并没有什么启发性


关于如何暂停执行有什么想法吗?

我不知道这可能会对您当前的设计造成多大的改变,但是Cocoa设计模式会有一种方法,即发出警报而不返回任何内容,因此类似于伪代码中的
if(duplicate)showAlertView
。然后在警报视图的委托中,调用一个根据用户输入实际处理副本处理的方法。

UIAlertView无法阻止,因为它显示在运行循环的末尾。方法
itemIsAlreadyOnOrder:
返回一个值,指示应如何处理重复条目,而不是让方法
UIAlertView
中的委托方法需要通知控制器相关项已解决。在某个地方跟踪有问题的对象(
\u objectToVerify
或类似的东西),并在
UIAlertView
的委托方法中根据用户的选择调用一个方法,该方法将对该
\u objectToVerify

执行NSOperation或其他后台执行方法的工作吗?你想“暂停”什么?我没有。我基本上只是想让代码在继续之前等待UIAlertView的响应。我没有使用任何后台执行或多线程。是的,我第一次就这样尝试过。就像我说的,我一直都在做这件事。我真的无法处理所有重复的案例,因为其中一个就是放手。另外,代码的最后一部分处理非重复项,因此警报从未抛出。您考虑过UIActionSheet吗?我没有考虑过UIActionSheet。我会调查的。我也有同样的问题。请原谅我的无知,但我不确定我是否理解。由于我正在检查添加项的方法中是否存在重复项,因此我不确定如何处理非重复项。我认为您希望UIAlertView-show方法阻止执行—它不会,也不能。除了实现自己的弹出式视图(这不是很难,但它是非标准的),唯一的选择是更改代码的工作方式,以便在UIAlertView调用
ClickedButtonIndex
之前它不会做任何事情。是的,我不确定如何做。无论如何,谢谢。更改您的
itemIsAlreadyOnOrder
方法,使其(及其调用者)在返回后不做任何操作。将其后的任何逻辑移到
ClickedButtonIndex
方法中。基本上,不需要让应用程序逻辑包含一系列步骤(检查是否是dupe、显示警报、执行某些操作、执行其他操作),而是包含导致应用程序做出反应的事件(如果是dupe显示警报,则警报导致下一步发生)。我知道,如果是dupe,我应该在委托中处理它。但如果这不是一个骗局,我还有很多事情要做,那么我该如何触发其他必须做的事情呢?更不用说数组中返回的其他项了?我只是不知道如何构造它,使它能够处理所有的问题。
- (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;
           }
}