2012-09-04 20 views
7

Vâng, mọi người đều biết rằng trong ObjC chúng tôi cóLàm thế nào để chuyển đối số cho NSAction?

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion 

ý rằng completion khối có một cuộc tranh luận BOOL. Bây giờ chúng ta hãy nhìn vào MonoTouch:

public static void Animate (double duration, double delay, UIViewAnimationOptions options, NSAction animation, NSAction completion) 

NSAction là:

public delegate void NSAction(); 

Chỉ cần các đại biểu mà không cần bất kỳ đối số. Hơn nữa, trong Monotouch "internals", chúng ta có thể thấy:

public static void Animate (double duration, double delay, UIViewAnimationOptions options, 
NSAction animation, NSAction completion) 
{ 
    UIView.AnimateNotify (duration, delay, options, animation, delegate (bool x) 
    { 
     if (completion != null) 
     { 
      completion(); 
     } 
    }); 
} 

Thông báo delegate (bool x), Nó gọi hàm giống như tôi cần. Bây giờ, làm cách nào tôi có thể vượt qua Action<bool> khi hoàn tất thành UIView.Animate?

Trả lời

8

Đó là lỗi liên kết cũ (loại sai) và vì lý do tương thích, Animate vẫn sử dụng trình xử lý hoàn tất NSAction.

Để khắc phục điều này, phương pháp mới AnimateNotify đã được thêm vào MonoTouch. Phiên bản này chấp nhận một UICompletionHandler được định nghĩa như thế này:

public delegate void UICompletionHandler (bool finished); 

Vì vậy, giải pháp cho vấn đề của bạn là sử dụng AnimateNotify API mới hơn.

+0

Đừng có nghĩ đó là thời gian để loại bỏ wrapper cũ? –

+0

@Maxim: Tôi tưởng tượng nó sẽ là quá mức cần thiết để loại bỏ nó qua đêm. Nhưng lỗi thời nó nghe như một ý tưởng hay đối với tôi. (Tôi không phải là nhà phát triển MT, chỉ là một người dùng.) –

5

Vì vậy, đó sẽ giống như thế:

UIView.AnimateNotify(duration, 0, UIViewAnimationOptions.CurveEaseInOut, delegate() { 

}, delegate (bool finished) { 

}); 

Hoặc với cú pháp lambda:

UIView.AnimateNotify(duration, 0, UIViewAnimationOptions.CurveEaseInOut,() => { 

}, (finished) => { 

});