如何将另一个 ViewController 设置为 AlertView 的委托

Posted

技术标签:

【中文标题】如何将另一个 ViewController 设置为 AlertView 的委托【英文标题】:How to set another ViewController as a delegate of AlertView 【发布时间】:2013-12-03 06:41:09 【问题描述】:

我想知道是否可以将警报视图委托设置为其他视图控制器。 原因是因为我打算根据用户按下的警报视图按钮来实现某个动作。

这是我想要做的:-

1] 在需要实现 alertView 委托方法的视图 controller.h 文件中声明 <UIAlertViewDelegate>

2]这就是我的 alertView 在 AppDelegate 中的声明方式。

 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
 
      if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive)
     
         alertView = [[UIAlertView alloc]initWithTitle:@"New Message" message:@"Click switch to check out" delegate:rosterListController cancelButtonTitle:@"OK" otherButtonTitles:@"Switch ", nil];
        [alertView show];
     
 

3] 现在我想在另一个 View Controller 中实现 alertView 委托方法 clickedButtonAtIndex,但它没有被调用。

 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
 
    if (buttonIndex == 0)
    
        NSLog(@"Cancel button pressed");
    
   

【问题讨论】:

rosterListController 是否存在或者它不存在? ohk....名册列表控制器为零.... 好吧,为了让某人为你做某事,那个人需要存在,不是吗?因此,如果您希望您的 viewController 处理委托方法,则需要在将其设置为委托之前创建它 (alloc, init)。 【参考方案1】:

您应该将 AppDelegate 设为 AlertView 委托,因为它是应用程序委托呈现 Alter View。使用随机不相关的视图控制器是没有意义的。如果您无论如何都强烈希望这样做,请考虑您的设计和应用程序逻辑有问题。

或者,您可以创建一个新类,它成为委托。此类的唯一目的是处理警报视图事件,并可能在演示者和警报视图之间传递数据和强制。您可以定义一个协议,该协议定义了演示者必须满足的最小 API 才能与委托处理程序进行通信。

对于呈现此警报视图的每个演示者,都有一个代表对象的 ivar。当您呈现警报视图时,无论是哪个呈现者,都创建并初始化委托对象并将其设置为委托。当警报视图将被关闭时,释放委托对象。

请注意,委托对象可能需要对演示者的引用,以便处理解除事件。

【讨论】:

【参考方案2】:

在全局位置设置 rosterListController 委托,然后将 alertview 委托设置为其 rosterListController 委托。 Alertview delgate 函数将在设置其委托的视图中调用。

GlobalSpace

id rosterDelegate;
+(void)setRosterDelegate:(id)_delegate
_rosterDelegate=_delegat;

+(id)getRosterDelegate
return _rosterDelegate;

现在在你的rosterListController 类中设置你的委托

[GlobalSpace setRosterDelegate:self];

你的 alertView 像这样

alertView = [[UIAlertView alloc]initWithTitle:@"New Message" message:@"Click switch to check out" delegate:[GlobalSpace getRosterDelegate] cancelButtonTitle:@"OK" otherButtonTitles:@"Switch ", nil];

【讨论】:

以上是关于如何将另一个 ViewController 设置为 AlertView 的委托的主要内容,如果未能解决你的问题,请参考以下文章

使用 SearchController 推送 ViewController 在搜索栏下显示黑色矩形

将另一个视图附加到同一“文件所有者”

如何判断我的 ViewController 何时再次成为栈顶?

如何在没有情节提要的情况下创建 ViewController 并将一个设置为另一个的委托?

如何创建一个透明的 ViewController? [复制]

如何将tableView的约束设置为viewController?