2009-02-21 55 views
5

我需要运行一些验证,这取决于用户的决定(例如,如果批准购买超过支出限额),并且如果验证失败,则拒绝“完成”操作。在iPhone中真正模态的UIAlertView?

但是,看起来像是不可能有像其他语言(如showmessage,alert()等)的真正模态行为,一切都是由代表。

但后来我不知道该怎么办。如果用户按下“完成”按钮,程序会问“你确定吗?”他说“取消”流程继续,视图被推回!

这是怎么解决这个可可世界?

回答

7

解决方案是不打它,只是把你的逻辑分成两部分。如果用户单击取消,则不要执行第二部分。如果用户单击确定/继续,则执行第二部分。

阻塞主线程导致的主要问题是主线程处理事件。处理事件的经典方法可能会引入奇怪的事件处理错误,因为您没有一个事件循环,而是有多个事件循环嵌入到另一个事件循环中。

通过使用委托,您可以使用一个事件循环(通过UIApplicationMain调用),并且不会出现任何处理这些事件的奇怪事件。

+3

换句话说,完全重新组织你的代码,并祈祷在你计划发布的前一天,你不会让用户在大量复杂的计算过程中要求验证权利,的局部变量。 – GeneralMike 2012-10-25 18:57:26

+1

+1不与它战斗。 – 2012-12-04 20:38:56

0

将应用程序的状态保存在函数中变量以外的其他位置。例如,在我的一个应用程序中,有一个配置文件字符串,指出他们是否同意隐私政策。

0

我刚刚遇到了这个问题,作为一个MonoTouch问题,并在研究解决方案时遇到了这个未解决的问题。

简而言之,是的,这是可能的。以下示例显示了如何在iPhone上使用MonoTouch和C#完成此操作,但同样的原则适用于Objective-C。

要做到这一点,你可以做的是手动运行主循环。我没有设法直接停止主循环,所以我运行0.5秒的主循环并等待用户响应。

下面的函数展示了如何实现上述方法模态查询:

int WaitForClick() 
{ 
    int clicked = -1; 
    var x = new UIAlertView ("Title", "Message", null, "Cancel", "OK", "Perhaps"); 
    x.Show(); 
    bool done = false; 
    x.Clicked += (sender, buttonArgs) => { 
     Console.WriteLine ("User clicked on {0}", buttonArgs.ButtonIndex); 
    clicked = buttonArgs.ButtonIndex; 
    };  
    while (clicked == -1){ 
     NSRunLoop.Current.RunUntil (NSDate.FromTimeIntervalSinceNow (0.5)); 
     Console.WriteLine ("Waiting for another 0.5 seconds"); 
    } 

    Console.WriteLine ("The user clicked {0}", clicked); 
    return clicked; 
} 
3

退房: http://code.google.com/p/modal-uialertview-uiactionsheet/

有了它,你可以做这样的事情:

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:nil]; 
if ([actionSheet showModalInView:self.view] == actionSheet.destructiveButtonIndex) { 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:@"Do you want to delete this file?" delegate:nil cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]; 
    if ([alertView showModal]!= alertView.cancelButtonIndex) { 
     // Delete the file 
    } 
} 
0

我同意NilObject,你通常不应该打它,一般我不这样做。但是,我使用的是AddressBookUI框架,当我在委托方法,

- (BOOL)unknownPersonViewController:(ABUnknownPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier 

我很想提醒他们的用户,例如,将要离开该应用程序时,他们点击一个地址,它会关闭地图应用程序。我用MapKit来做我自己的地图,但我没有耐心来重现完整的地图应用程序(让用户从其他地址获得方向),并且只好让shouldPerformDefaultAction做它的工作,并启动地图应用程序,但我没有办法警告用户他们将离开应用程序。

我真的希望苹果能提供一个非常基本的UIAlertView模型,而不是绕开它。这很愚蠢。