Objective c 在didFinishLaunchingWithOptions中连续显示两个UIAlertView
我希望只有当用户第一次打开我的应用程序时,才会显示两个警报视图——第二个警报视图在第一个警报视图关闭后出现。我已将其设置为仅在以前未显示UIAlertView时显示UIAlertView,我不需要这方面的帮助。在这种情况下,我需要帮助了解如何在一行中显示两个警报视图 -(void)alertView:(UIAlertView*)alertView使用buttonIndex进行了删除:(NSInteger)buttonIndex对我不起作用 这是我的代码--记住这是在didFinishLaunchingWithOptions中:Objective c 在didFinishLaunchingWithOptions中连续显示两个UIAlertView,objective-c,ios,Objective C,Ios,我希望只有当用户第一次打开我的应用程序时,才会显示两个警报视图——第二个警报视图在第一个警报视图关闭后出现。我已将其设置为仅在以前未显示UIAlertView时显示UIAlertView,我不需要这方面的帮助。在这种情况下,我需要帮助了解如何在一行中显示两个警报视图 -(void)alertView:(UIAlertView*)alertView使用buttonIndex进行了删除:(NSInteger)buttonIndex对我不起作用 这是我的代码--记住这是在didFinishLaunch
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL didFirstLaunch = [defaults boolForKey:@"DidFirstLaunch"];
if (!didFirstLaunch) {
[defaults setBool:YES forKey:@"DidFirstLaunch"];
UIAlertView *successAlert = //not important
[successAlert show];
[successAlert release];
//Somehow show second alert after the first is dismissed
}
我将使用发布一个非常简单的解决方案(GCD部分只是为了防止在另一个线程上创建警报视图,然后在主线程上创建,回调应该可以在主线程上安全执行)。记住,我只是在5分钟内编写了这个代码,所以你肯定应该努力改进代码。有一件事有点难看,那就是在我的子类中重写的委托参数。子类的接口可以稍微更改一下,使其更清楚地显示发生了什么 不管怎样,这是 首先创建
UIAlertView
的子类,使其看起来有点像以下内容
@interface FSAlertView () <UIAlertViewDelegate>
@property (nonatomic, copy) void (^dismissHandler)(NSInteger buttonIndex);
@end
@implementation FSAlertView
@synthesize dismissHandler = _dismissHandler;
- (void)showWithDismissHandler:(void (^)(NSInteger buttonIndex))dismissHandler
{
self.dismissHandler = dismissHandler;
self.delegate = self;
[self show];
}
// Alert view delegate
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
dispatch_async(dispatch_get_main_queue(), ^ {
if (_dismissHandler)
{
_dismissHandler(buttonIndex);
}
});
}
FSAlertView *alert1 = [[FSAlertView alloc] initWithTitle:@"Alert 1"
message:@"Some message"
delegate:nil
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Show 2nd Alert", nil];
[alert1 showWithDismissHandler:^ (NSInteger buttonIndex) {
NSLog(@"button pressed: %d", buttonIndex);
if (buttonIndex == 1)
{
UIAlertView *alert2 = [[UIAlertView alloc] initWithTitle:@"Alert 2"
message:@"Hi!"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert2 show];
}
}];
我将使用发布一个非常简单的解决方案(GCD部分只是为了防止在另一个线程上创建警报视图,然后在主线程上创建,回调应该可以在主线程上安全执行)。记住,我只是在5分钟内编写了这个代码,所以你肯定应该努力改进代码。有一件事有点难看,那就是在我的子类中重写的委托参数。子类的接口可以稍微更改一下,使其更清楚地显示发生了什么 不管怎样,这是 首先创建
UIAlertView
的子类,使其看起来有点像以下内容
@interface FSAlertView () <UIAlertViewDelegate>
@property (nonatomic, copy) void (^dismissHandler)(NSInteger buttonIndex);
@end
@implementation FSAlertView
@synthesize dismissHandler = _dismissHandler;
- (void)showWithDismissHandler:(void (^)(NSInteger buttonIndex))dismissHandler
{
self.dismissHandler = dismissHandler;
self.delegate = self;
[self show];
}
// Alert view delegate
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
dispatch_async(dispatch_get_main_queue(), ^ {
if (_dismissHandler)
{
_dismissHandler(buttonIndex);
}
});
}
FSAlertView *alert1 = [[FSAlertView alloc] initWithTitle:@"Alert 1"
message:@"Some message"
delegate:nil
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Show 2nd Alert", nil];
[alert1 showWithDismissHandler:^ (NSInteger buttonIndex) {
NSLog(@"button pressed: %d", buttonIndex);
if (buttonIndex == 1)
{
UIAlertView *alert2 = [[UIAlertView alloc] initWithTitle:@"Alert 2"
message:@"Hi!"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert2 show];
}
}];
如果我正确理解您的问题,那么这可能会有帮助:
UIAlertView *firstAlert = [[UIAlertView alloc] initWithTitle:@"Alert 1" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
[firstAlert show];
[self performSelector:@selector(test:) withObject:firstAlert afterDelay:2];
[firstAlert release];
UIAlertView *secondAlert = [[UIAlertView alloc] initWithTitle:@"Alert 2" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
[secondAlert show];
[self performSelector:@selector(test:) withObject:secondAlert afterDelay:2];
[secondAlert release];
-(void)test:(UIAlertView*)alert{
[alert dismissWithClickedButtonIndex:-1 animated:YES];
}
这将依次显示两个警报视图
注意:我不确定您是否使用“取消”按钮解除警报,因此我会在几秒钟后自动解除警报。如果我正确理解您的问题,这可能会有帮助:
UIAlertView *firstAlert = [[UIAlertView alloc] initWithTitle:@"Alert 1" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
[firstAlert show];
[self performSelector:@selector(test:) withObject:firstAlert afterDelay:2];
[firstAlert release];
UIAlertView *secondAlert = [[UIAlertView alloc] initWithTitle:@"Alert 2" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
[secondAlert show];
[self performSelector:@selector(test:) withObject:secondAlert afterDelay:2];
[secondAlert release];
-(void)test:(UIAlertView*)alert{
[alert dismissWithClickedButtonIndex:-1 animated:YES];
}
这将依次显示两个警报视图
注意:我不确定您是否使用“取消”按钮解除警报,因此我会在几秒钟后自动解除警报。尝试以下操作:
UIAlertView *firstAlert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
[firstAlert setTag:444];
[firstAlert show];
firstAlert = nil;
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
switch (alertView.tag) {
case 444:
{
//Cancel ButtonIndex = 0
if (buttonIndex == 1) {
UIAlertView *secondAlert = [[UIAlertView alloc] initWithTitle:@"Title 2" message:@"Message2" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Dismiss", nil];
[secondAlert setTag:555];
[secondAlert show];
secondAlert = nil;
}
}
break;
case 555:
{
if (buttonIndex == 1) {
NSLog(@"Code Here");
}
}
break;
}
}
AlertView委托方法:
UIAlertView *firstAlert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
[firstAlert setTag:444];
[firstAlert show];
firstAlert = nil;
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
switch (alertView.tag) {
case 444:
{
//Cancel ButtonIndex = 0
if (buttonIndex == 1) {
UIAlertView *secondAlert = [[UIAlertView alloc] initWithTitle:@"Title 2" message:@"Message2" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Dismiss", nil];
[secondAlert setTag:555];
[secondAlert show];
secondAlert = nil;
}
}
break;
case 555:
{
if (buttonIndex == 1) {
NSLog(@"Code Here");
}
}
break;
}
}
试试这个:
UIAlertView *firstAlert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
[firstAlert setTag:444];
[firstAlert show];
firstAlert = nil;
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
switch (alertView.tag) {
case 444:
{
//Cancel ButtonIndex = 0
if (buttonIndex == 1) {
UIAlertView *secondAlert = [[UIAlertView alloc] initWithTitle:@"Title 2" message:@"Message2" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Dismiss", nil];
[secondAlert setTag:555];
[secondAlert show];
secondAlert = nil;
}
}
break;
case 555:
{
if (buttonIndex == 1) {
NSLog(@"Code Here");
}
}
break;
}
}
AlertView委托方法:
UIAlertView *firstAlert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
[firstAlert setTag:444];
[firstAlert show];
firstAlert = nil;
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
switch (alertView.tag) {
case 444:
{
//Cancel ButtonIndex = 0
if (buttonIndex == 1) {
UIAlertView *secondAlert = [[UIAlertView alloc] initWithTitle:@"Title 2" message:@"Message2" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Dismiss", nil];
[secondAlert setTag:555];
[secondAlert show];
secondAlert = nil;
}
}
break;
case 555:
{
if (buttonIndex == 1) {
NSLog(@"Code Here");
}
}
break;
}
}
伟大的解决方案+我为那件事感到高兴。。!伟大的解决方案+我为那件事感到高兴。。!为什么
-(void)alertView:(UIAlertView*)alertView不使用buttonIndex:(NSInteger)buttonIndex
为您工作?当用户点击一个按钮时会调用它,您可以在此方法中显示另一个警报视图。在我看来,使用UIAlertView子类似乎有些过分。可能没有为delegate方法设置delegate属性。那反正也不行。代码可能丢失successAlert.delegate=self代码>这就是沃尔夫冈的全部——谢谢!我会接受你的答案,因为它是有效的,但解决方案就是你刚才说的一行。为什么你不能使用UIAlertViewDelegate方法?我个人认为你应该使用我发布的解决方案。与块相比,委托处理可能变得非常难看且难以跟踪。基于块的方法不会让您扫描代码的各个部分,而是将它们放在一个位置。出于这个原因,我认为这是一个“更好”的解决方案。为什么-(void)alertView:(UIAlertView*)alertView不使用buttonIndex:(NSInteger)buttonIndex
对您不起作用?当用户点击一个按钮时会调用它,您可以在此方法中显示另一个警报视图。在我看来,使用UIAlertView子类似乎有些过分。可能没有为delegate方法设置delegate属性。那反正也不行。代码可能丢失successAlert.delegate=self代码>这就是沃尔夫冈的全部——谢谢!我会接受你的答案,因为它是有效的,但解决方案就是你刚才说的一行。为什么你不能使用UIAlertViewDelegate方法?我个人认为你应该使用我发布的解决方案。与块相比,委托处理可能变得非常难看且难以跟踪。基于块的方法不会让您扫描代码的各个部分,而是将它们放在一个位置。因此,我认为这是一个“更好”的解决方案。