4

iOS 開発は初めてです。iOS アプリの開発に monotouch を使用しています。アプリがアイドル状態になってからの時間を知りたいです。ObjC コードを取得しましたが、C# に変換できません。コードは次のとおりです。

- (void)sendEvent:(UIEvent *)event {
    [super sendEvent:event];

    // Only want to reset the timer on a Began touch or an Ended touch, to reduce the number of timer resets.
    NSSet *allTouches = [event allTouches];
    if ([allTouches count] > 0) {
        // allTouches count only ever seems to be 1, so anyObject works here.
        UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase;
        if (phase == UITouchPhaseBegan || phase == UITouchPhaseEnded)
            [self resetIdleTimer];
    }
}

- (void)resetIdleTimer {
    if (idleTimer) {
        [idleTimer invalidate];
        [idleTimer release];
    }

    idleTimer = [[NSTimer scheduledTimerWithTimeInterval:maxIdleTime target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO] retain];
}

 - (void)idleTimerExceeded {
    NSLog(@"idle time exceeded");
}

これをC#に変換するのを手伝ってくれる人はいますか。

4

1 に答える 1

8

Obj-Cこれを達成するためのより良い方法は確かにありますが、このコードをXamarin.iOS C#次のようにほとんど行ごとに変換してみましょう。

sendEventの方法ですUIApplication。それをサブクラス化することは非常にまれです。UIApplication クラス リファレンスのサブクラス化に関する注意事項を参照してください。

それをサブクラス化したら、それを使用するようにランタイムに指示する必要があります。これMainは、通常は にあるメソッドで行われMain.csます。変更後のMain.cs現在の外観は次のとおりです。

public class Application
{
    // This is the main entry point of the application.
    static void Main (string[] args)
    {
        UIApplication.Main (args, "MyApplication", "AppDelegate");
    }
}

[Register ("MyApplication")]
public class MyApplication : UIApplication
{

}

Registerの 2 番目の引数として使用されるクラスの属性に注意してくださいUIApplication.Main

それでは、コードを実際に翻訳してみましょう。

[Register ("MyApplication")]
public class MyApplication : UIApplication
{
    public override void SendEvent (UIEvent uievent)
    {
        base.SendEvent (uievent);
        var allTouches = uievent.AllTouches;
        if (allTouches.Count > 0) {
            var phase = ((UITouch)allTouches.AnyObject).Phase;
            if (phase == UITouchPhase.Began || phase == UITouchPhase.Ended)
                ResetIdleTimer ();
        }
    }

    NSTimer idleTimer;
    void ResetIdleTimer ()
    {
        if (idleTimer != null) {
            idleTimer.Invalidate ();
            idleTimer.Release ();
        }

        idleTimer = NSTimer.CreateScheduledTimer (TimeSpan.FromHours (1), TimerExceeded);
    }

    void TimerExceeded ()
    {
        Debug.WriteLine ("idle time exceeded");
    }
}

に置き換えましmaxIdleTimeTimeSpan.FromHours (1)。そうしないと、バグがあれば Obj-C と同じ動作になります (問題ないように見えます)。

于 2013-11-12T14:24:29.540 に答える