【问题标题】:Calling method from principal class in objective-C从objective-C中的主体类调用方法
【发布时间】:2013-11-20 05:58:28
【问题描述】:

如果用户在 10 分钟内无法触摸屏幕,那么我完成了定时器功能,然后我的应用程序直接进入登录屏幕。 对于上述问题,我使用此处https://github.com/B-Sides/ELCUIApplication 的示例代码对类的命名进行了一些更改,因此我的类是PB_TIMER_UIApplication 而不是ELCUIApplication。 我在 main.m 类中调用PB_TIMER_UIApplication 类,它的实现如下,

return UIApplicationMain(argc, argv, NSStringFromClass([PB_TIMER_UIApplication class]), NSStringFromClass([AppDelegate class]));

我将 principalClassName 设置为 PB_TIMER_UIApplication

现在我在PB_TIMER_UIApplication 中创建一个属性和实例方法,如下所示,

@interface PB_TIMER_UIApplication :  UIApplication{
    NSTimer *_idleTimer;
}
@property(nonatomic) int timerTimeOutIntervals;

- (void)resetIdleTimer;

现在我希望我的应用程序在进入登录屏幕/超时会话之前显示警报。如果警报按钮按下确定,那么我的计时器再次启动 10 秒。这就是为什么我为timerTimeOutIntervals 创建一个属性以及该属性和resetIdleTimer 我想在整个应用程序中调用的实例方法。所以我尝试像 Appdelegate 调用一样访问属性/方法,[[PB_TIMER_UIApplication sharedApplication] setTimerTimeOutIntervals:10]; 但它显示静态错误,

我的问题在哪里我错了,如何从原理类调用实例方法的属性?

【问题讨论】:

    标签: ios iphone objective-c


    【解决方案1】:

    你的类应该继承自 UIResponder。 例如:

     MyAppDelegate:UIResponder <UIApplicationDelegate>
    

    你应该使用这种方式来获取它:

     [[[UIApplication sharedApplication] delegate] setTimerTimeOutIntervals:10];
    

    如果你想调用你的方法,那么试试:

     [(MyAppDelegate*)[[UIApplciation sharedApplication] delegate] someMethod];
    

    UPD:你可以试试看:

     [(PB_TIMER_UIApplication*)[UIApplication sharedApplication] setTimerTimeOutIntervals:10];
    

    【讨论】:

    • 对不起朋友它不起作用,因为我的 priciple 类之前运行过,所以我无法声明或初始化 idletimeinterval。
    【解决方案2】:

    是的,我解决了我的问题。我首先更改了应用程序的体系结构,我创建了UIApplication 的子类,并将其设置为 main.m 文件中的主类。因此,我的 UIApplication 子类首先运行,然后是主要的 UIApplication,其中设置了 UIApplicationDelegate。这就是为什么我无法声明启动超时间隔的原因,我的应用程序处于递归状态。

    搜索后我得到了this 链接。我在该链接中遵循@Brian King 的建议。 我创建了自己的自定义 UIWindow 类,并将所有超时代码作为他给定的 Github 链接代码。

    现在我的应用程序架构师将我的 rootviewcontroller 放在我的自定义 UIWindow 类上,然后显示我的自定义警报视图并在警报视图按钮上编写超时/继续计时器功能。 注意:- 根据苹果文档给出的 UIResponder 链,每次触摸都调用它 superview,最后调用 UIWindow。

    【讨论】:

      【解决方案3】:

      根据您的要求,如果事件触摸阶段类型为 UITouchPhaseBegan,我建议您在应用程序的 AppDelegate 和重置计时器中使用 sendEvent:(UIEvent *)event 方法。

      【讨论】:

        【解决方案4】:

        这终于对我有用了。

        #define gkSDUIApplication (SDUIApplication *)[UIApplication sharedApplication]
        
        SDUIApplication *myUIApplication = gkSDUIApplication;
        myUIApplication.myProperty;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-09
          • 1970-01-01
          • 2012-12-12
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 2011-12-21
          • 1970-01-01
          相关资源
          最近更新 更多