2

Xamarin Forms 앱을 만들었습니다. "MyLabel"이라는 레이블이 붙은 새 페이지 안에 있습니다. 코드에서 뒤에 내 페이지에 대해 본인은 "컴파일러"탭에서 기호 __IOS__을 볼 수 있습니다 내 아이폰 OS 프로젝트 옵션에서Xamarin Studio에서 조건부 컴파일이 작동하지 않는 것 같습니다.

private void SetUpUI() 
{ 
    #if __IOS__ 
    this.MyLabel.BackgroundColor = Color.Navy; 
    #endif 
} 

있습니다. 나는 아이폰 OS에서 실행하면

enter image description here

는 블루 라벨하지 않습니다 (스크린 샷 참조) :

을하지만 #if __IOS__ 블록을 제거하는 경우는 파란색 라벨을 만드는 :

따라서 조건부 컴파일 작동 안됨. 저는 Mac에 있습니다. Visual Studio에서 테스트 할 수 없었습니다. 오래 동안 붙어 있지만 내가 놓친 것을 알아낼 수는 없습니다. 당신은 그 컴파일러를 포함하지 않을 당신의 PCL 프로젝트에서 조건문을 사용하는

답변

2

는 조건부 코드가 아웃 회색이며, 따라서 이유를 정의합니다.

Device.OnPlatform (iOS:() => this.MyLabel.BackgroundColor = Color.Navy;); 

재 : https://developer.xamarin.com/api/member/Xamarin.Forms.Device.OnPlatform/

+0

Xamarin Forms 버전 ** ** ** ** v2.3.4를 사용하는 경우이 방법을 사용할 수 있습니다. 그렇지 않으면, 내 대답에 명시된대로'Device.RuntimePlatform'을 사용하십시오. –

2

이 SushiHangover의 대답이 올바른지 : 당신의 PCL 프로젝트 컴파일러가없는 것이다 PCL 프로젝트에서

당신은 플랫폼 기반의 처리를 수행 할 Device.OnPlatform을 사용할 수 있습니다 플랫폼에 대한 정의.

그러나 그가 제공하는 솔루션은 Xamarin Forms 2.3.4가 릴리스 된 이후에는 쓸모 없게되었습니다. Device.OnPlatform은 this discussion에서 논의 된대로 다시 설계되었으며 this Pull Request으로 구현되었습니다.

Xamarin Forms 2.3.4 이상에서이 작업을 수행하는 올바른 방법은 Device.RuntimePlatform을 사용하는 것입니다. 과 같이 사용자의 요구에 맞게 스위치 또는 조건을 사용하여 당신이 질문처럼 당신이 PCL 대신 공유 프로젝트를 사용한다면

if(Device.RuntimePlatform == Device.iOS) 
{ 
    // iOS 
} 
else if(Device.RuntimePlatform == Device.Android) 
{ 
    // Android 
} 

그것을 할 수있을 것입니다. 공유 프로젝트를 사용하면 플랫폼 프로젝트의 컴파일러 지시문에 액세스 할 수 있기 때문입니다.