2016-07-21 3 views
1

저는 Xamarin.forms를 사용하여 응용 프로그램을 만들고 있습니다. (PCL)nuGet 패키지의 사용자 지정 렌더링이 Xamarin.forms에서 충돌합니다.

난 그냥 사용자 정의 렌더러를 사용하여 심각한 문제를 발견했습니다. 이 스레드에서 왔습니다. https://forums.xamarin.com/discussion/54317/new-xamarin-forms-guide-custom-renderers/p2

이 스레드는 말합니다. 그리고 나는 오직 하나의 렌더러 클래스 만 동시에 작동한다는 것을 경험했습니다. 두 개의 다른 패키지가 동일한 렌더러를 사용하는 경우 그 중 하나는 작동하지 않습니다. (클래스 계층 구조를 따르므로 서브 클래 싱 된 클래스가 작동하고 다른 클래스는 작동을 멈 춥니 다.)

방금 ​​추가 한 패키지가 원래 패키지 나 광산을 망칠 수 있으며 실제 문제는 개발자가 그 시간에 알지 못하는 것입니다.

왜 작동하는가? 아니면 내가 잘못했거나 잘못 했습니까? 이미 ContentPage 또는 페이지에 대한 사용자 정의 렌더러를 가지고 사용자 정의 ContentPage에 대한 렌더러 설치 패키지를 만든 경우

  • 예를

. 내 경우, KeyboardOverlap.Forms.Plugin 않습니다. 그리고 두 렌더러 클래스 모두 OnApearing()을 재정의했습니다. 앱을 실행할 때. 한 렌더러의 OnApearing 만 해고됩니다.

물론 손을 병합 할 수 있습니다. 그러나 둘 다 패키지를 nuGet하고 수정할 수 없으면 어떻게 될까요? 물론 Github를 사용할 수는 있지만 다른 문제가 발생할 수 있습니다.

+0

예를 들려 줄 수 있습니까? 나는 완전히 따라갈 지 모르겠다. 나는 폼이있는 꽤 복잡한 어플리케이션을 작성하고 렌더러가 작동하지 않는 문제에 결코 빠지지 않았습니다. –

+0

@ChaseFlorell 이미 ContentPage 용 사용자 정의 렌더러 및 ContentPage 또는 Page에 대한 사용자 정의 렌더러가 설치된 패키지를 만든 경우. 내 경우, KeyboardOverlap.Forms.Plugin 않습니다. 그리고 두 렌더러 클래스 모두 OnApearing()을 재정의했습니다. 앱을 실행할 때. 한 렌더러의 OnApearing 만 해고됩니다. –

+0

각 사용자 지정 렌더러에 고유 한 이름이 있습니까? 이것이 실패 할 수있는 유일한 방법은 디폴트를 오버라이드하는 것입니다 ... 결코하지 말고, 디폴트에서 상속 받고 오버라이드 할 때'base'를 호출해야합니다. 너겟 팩이 기본값보다 우선 함으로 인해 깨진 경우이를 고치십시오. –

답변

2

각 사용자 지정 렌더러에는 고유 한 이름이 있어야합니다. 충돌을 일으키는 유일한 방법은 렌더러가 기본 클래스를 재정의하는 경우입니다. 절대로이를 수행하지 말고 대신 기본값을 상속하고 오버라이드 할 때 base으로 호출해야합니다.

너겟 패키지가 기본 설정을 덮어 쓰기 때문에 깨진 경우, 너겟 패키지를 고쳐야합니다. 당신이 언급하고있는 코드에서

은, 저자는 최우선 Page 대신 자신이 KeyboardOverlapPage

대신

This line is causing you pain!

[assembly: ExportRenderer (typeof(KeyboardOverlapPage), typeof(KeyboardOverlapRenderer))] 

해야하며, 다음에 클래스를 만드는 것입니다 PCL

public class KeyboardOverlapPage : Xamarin.Forms.Page {} 

즉, 작성자의 패키지가 제대로 구현되지 않아 수정해야합니다. 고정 된 후에는 페이지 대신 해당 기능을 원할 때마다 사용할 수 있습니다.

특정 플랫폼에 사용자 지정 렌더러가 없으면 자동으로 기본 동작으로 되돌아갑니다.

+0

내가 언급 한 특정 저장소에 [https://github.com/paulpatarinski/Xamarin.Forms.Plugins/issues/101] 문제를 추가했습니다. –

+0

안녕하세요. 당신의 관대 한 답변에 감사드립니다. 하지만 이미 기본 클래스를 재정의하는 것을 피하는 것이 중요하다는 것을 이미 알고 있습니다. 하지만 여전히 한 번에 하나의 렌더러 만 작동 할 수 있다는 것을 의미합니까? 렌더러의 두 기능을 모두 사용하는 것은 핸드 머지 (HAND MERGE)입니까? 나는 정말로 알고 싶다. 그렇다면 조금 성가시 않습니까? –

+0

문제를 추가해 주셔서 다시 한 번 감사드립니다. –

관련 문제