在iPhone中真正的模态UIAlertView?

时间:2009-02-21 21:22:17

标签: objective-c iphone cocoa-touch user-interface

我需要运行一些依赖于用户决策的验证(例如,如果批准购买超过支出限额),并且如果失败则拒绝“完成”操作。

然而,看起来像是不可能有像其他语言一样的真正的模态动作(比如showmessage,alert()等),而且一切都是代表。

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

如何在可可世界解决这个问题?

5 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分: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
    }
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我刚刚将这个问题作为MonoTouch问题进行了讨论,在研究解决方案时遇到了这个悬而未决的问题。

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

要做到这一点,你可以做的是手动运行mainloop。我没有设法直接停止主循环,所以我改为运行主循环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;
}

答案 4 :(得分:0)

我同意NilObject的说法,你通常不应该反对它,而且我通常不会。但我正在使用AddressBookUI框架,当我在委托方法中时,

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

我真的想警告用户,例如,当他们点击地址时会离开应用程序,这会激活地图应用程序。我已经使用MapKit来制作我自己的地图,但我没有耐心重现完整的地图应用程序(让用户从其他地址获取路线),并且只是让shouldPerformDefaultAction这样做了工作和启动地图应用程序,但我没有办法警告用户他们正在离开应用程序。

我真的希望Apple提供一个非常基本的UIAlertView模型而不是黑客攻击它。这太傻了。