我需要运行一些依赖于用户决策的验证(例如,如果批准购买超过支出限额),并且如果失败则拒绝“完成”操作。
然而,看起来像是不可能有像其他语言一样的真正的模态动作(比如showmessage,alert()等),而且一切都是代表。
但后来我不知道该怎么做。如果用户按下“完成”按钮,程序会询问“你确定吗?”并且他说“取消”流程继续,视图被推回!
如何在可可世界解决这个问题?
答案 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模型而不是黑客攻击它。这太傻了。