我是iOS编程的新手,我正试图找出如何中断程序流以等待响应。
基本上我想从我的应用程序发送一封电子邮件,并提供数据,我想提示用户添加更多信息。
即:
- (IBAction)sendEmail:(id)sender {
MyManagedObject *myObj = nil;
//Retrieve from the database.
NSManagedObjectContext *ctx = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyManagedObject" inManagedObjectContext:ctx];
[request setEntity:entity];
NSError *error;
NSArray *array = [ctx executeFetchRequest:request error:&error];
NSUInteger count = [array count]; // May be 0 if the object has been deleted.
if (count > 0) {
myObj = (MyManagedObject *)[array objectAtIndex:0];
}
//Recipients
NSArray *toRecipents = [[NSArray alloc]init];
// Email Subject
NSString *emailTitle = [@"Report for Month of: " stringByAppendingString: dateString] ;
// Email Content
NSString *messageBody = @"";
if(myObj != nil) {
if (myObj.firstName) {
messageBody = [messageBody stringByAppendingString:[@"\nHello " stringByAppendingString: myObj.firstName]];
toRecipents = [NSArray arrayWithObject:myObj.emailAddress];
}
}
messageBody = [messageBody stringByAppendingString:@"\n\nBelow is my text...."];
messageBody = [messageBody stringByAppendingString:[@"\nMore Information...: " stringByAppendingString: myObj.moreInfo]];
NSString *addInfo = OPEN WINDOW FOR USER TO ADD INFO
if (addInfo != nil) {
messageBody = [messageBody stringByAppendingString:[@"\nAdditional Information...: " stringByAppendingString: addInfo]];
}
... send the email
}
我不确定在没有回调的情况下是否可行。基本上我想在完成电子邮件之前打断流程,设置覆盖并等待它关闭......
答案 0 :(得分:1)
根据我的理解,您要做的是显示自定义对话框或警报视图,并且仅在返回值时,代码应该进一步执行。
让我们假设,如果您在UIAlertView
内显示UITextView
以添加更多信息,则应将sendEmail
方法移至alertview按钮的回调。类似地,如果你想要一些自定义对话框,那么你应该在自定义对话框中写一个回调到主窗口,然后在该回调中,你应该编写用于发送电子邮件的代码。
我认为,类似的回调机制是您选择的唯一解决方案,如果您希望所有内容都写在相同的代码块中,那么我可以使用blocks in objective-c
答案 1 :(得分:0)
需要设计流程,以便在提示电子邮件时设置了所有内容并创建了一个带有按钮的窗口,此时您的代码已完成并且没有执行任何操作。然后,当按下按钮时,将调用下一个使用之前准备好的数据的函数/方法。
答案 2 :(得分:0)
我使用MB Progress HUD https://github.com/jdg/MBProgressHUD
我想这就是你要找的东西。它将显示一个加载器,它将叠加在添加它的视图上。 您可以像这样使用它:
在您的界面中添加
MBProgressHUD *HUD;
即使你需要
,也请调用它-(void) showHUD {
HUD = [[MBProgressHUD alloc] initWithView:self.view];
HUD.labelText = @"Loading";
HUD.detailsLabelText = @"Please Wait ...";
HUD.mode = MBProgressHUDModeIndeterminate;
[self.tableView addSubview:HUD];
[HUD show:YES];
}
最后隐藏它
[MBProgressHUD hideHUDForView:self.tableView animated:YES];