【问题标题】:How to set another ViewController as a delegate of AlertView如何将另一个 ViewController 设置为 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)。

标签: ios uiviewcontroller delegates uialertview


【解决方案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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-06
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多