2016-12-14 64 views
1

我想實現一個事件的命令行爲(這表現在Xamarin:https://github.com/xamarin/xamarin-forms-samples/tree/master/Behaviors/EventToCommandBehavior)一旦標籤頁行爲導致Xamarin.Forms應用程序崩潰

,我嘗試將TabbedPage.Behaviors部分添加到我的TabbedPage .XAML應用程序會崩潰上推出iOS中,以下情況例外:

Foundation.MonoTouchException: Objective-C exception thrown. Name: NSInternalInconsistencyException Reason: Application windows are expected to have a root view controller at the end of application launch 
Native stack trace: 
    0 CoreFoundation      0x000000010b48434b __exceptionPreprocess + 171 
    1 libobjc.A.dylib      0x0000000115be221e objc_exception_throw + 48 
    2 CoreFoundation      0x000000010b488442 +[NSException raise:format:arguments:] + 98 
    3 Foundation       0x000000010c065e4d -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195 
    4 UIKit        0x000000010ecb0619 -[UIApplication _runWithMainScene:transitionContext:completion:] + 3827 
    5 UIKit        0x000000010ecacf69 -[UIApplication workspaceDidEndTransaction:] + 188 
    6 FrontBoardServices     0x000000011890b723 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 24 
    7 FrontBoardServices     0x000000011890b59c -[FBSSerialQueue _performNext] + 189 
    8 FrontBoardServices     0x000000011890b925 -[FBSSerialQueue _performNextFromRunLoopSource] + 45 
    9 CoreFoundation      0x000000010b429311 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 
    10 CoreFoundation      0x000000010b40e59c __CFRunLoopDoSources0 + 556 
    11 CoreFoundation      0x000000010b40da86 __CFRunLoopRun + 918 
    12 CoreFoundation      0x000000010b40d494 CFRunLoopRunSpecific + 420 
    13 UIKit        0x000000010ecab7e6 -[UIApplication _run] + 434 
    14 UIKit        0x000000010ecb1964 UIApplicationMain + 159 
    15 ???         0x000000012e4eb58c 0x0 + 5071877516 
    16 ???         0x000000012e4eb1fd 0x0 + 5071876605 

    at at (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr) 
    at UIKit.UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate) [0x00005] in /Users/builder/data/lanes/3969/44931ae8/source/xamarin-macios/src/UIKit/UIApplication.cs:79 
    at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00038] in /Users/builder/data/lanes/3969/44931ae8/source/xamarin-macios/src/UIKit/UIApplication.cs:63 
    at TabDemo.iOS.Application.Main (System.String[] args) [0x00008] in /Users/Shared/git/Experiments/TabDemo/TabDemo.iOS/Main.cs:17 

在Android應用程序只是掛在發射和永不顯示標籤頁。

MyTabbedPage.Xaml看起來是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<TabbedPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" 
    prism:ViewModelLocator.AutowireViewModel="True" 
    xmlns:local="clr-namespace:TabDemo.Views" 
    xmlns:behaviors="clr-namespace:TabDemo.Views.Behaviors" 
    x:Class="TabDemo.Views.MyTabbedPage"> 
    <TabbedPage.Behaviors> 
     <behaviors:EventToCommandBehavior 
      EventName="CurrentPageChanged" 
      Command="{Binding OnCurrentPageChangedCommand}" /> 
    </TabbedPage.Behaviors> 
    <NavigationPage 
     Title="Main"> 
     <x:Arguments> 
      <local:MainPage /> 
     </x:Arguments> 
    </NavigationPage> 
    <NavigationPage 
     Title="Second"> 
     <x:Arguments> 
      <local:SecondPage /> 
     </x:Arguments> 
    </NavigationPage> 
</TabbedPage> 

連線了在代碼的行爲背後導致完全相同的問題。如果我刪除TabbedPage.Behaviors部分中的行爲條目,則該應用程序在兩個平臺上均可正常運行。

任何人都可以闡明我可能做錯了什麼?

+0

我已經發布了一個示例應用程序演示問題[向上在github上(HTTPS ://github.com/jbachelor/TabbedAppSample/tree/master)。我會添加分支來嘗試不同的答案。感謝您的幫助,每個人! – jbachelor

回答

1

我相信你可能需要改變EventToCommandBehavior繼承的類型。打開EventToCommandBehavior.cs文件並更改:

public class EventToCommandBehavior : BehaviorBase<View> 

到:

public class EventToCommandBehavior : BehaviorBase<VisualElement> 

您還需要修改的兩種方法的簽名:

protected override void OnAttachedTo (View bindable) 

protected override void OnDetachingFrom (View bindable) 

到:

protected override void OnAttachedTo(VisualElement bindable) 

protected override void OnDetachingFrom(VisualElement bindable) 
+1

非常感謝您的幫助,@jgoldberger!看起來你讓我通過了最大的最初障礙。隨着你的建議,應用程序再次運行,而不是在啓動時崩潰,但是,由於某種原因,我的DelegateCommand沒有被調用。我會繼續調查。再次感謝你!如果你很好奇,我已經把代碼放在GitHub上了,在一個名爲'jganswer'的分支中我實現了你的建議:[link](https://github.com/jbachelor/TabbedAppSample/tree/jganswer) – jbachelor

+1

好的...我發現命令沒有執行的原因。我在ViewModel 中混淆了命名空間! – jbachelor

+1

已更新,現在工作代碼在[jganswer分支]上的github上(https://github.com/jbachelor/TabbedAppSample/tree/jganswer)...我只需要弄清楚如何獲取新選擇的標籤名稱的事件,我會關閉和運行!再次感謝你! – jbachelor

1

如果你正在關注str對於EventToCommandBehavior來說是一個例子,我的猜測是有一個異常被拋出,因爲你的命令需要的類型不同於傳入的類型。沒有看到你的項目,或者知道你想要完成什麼,很難給你一個更清晰的方向。

,你可以嘗試採取看看這個要點,提供瞭如何將行爲添加到TabbedPage上CurrentPageChanged一個例子:https://gist.github.com/dansiegel/cdc81671f3610d8992d70c65c202f0a4

+1

非常感謝,@ dan-s! Gist看起來就像我正在尋找的東西。這是Xamarin.Forms Prism框架的未來部分嗎?我不確定如何實現它,但我會玩弄它,看看我是否能得到像這樣的工作。如果您碰巧知道有人在應用程序中實際使用MultiPageNavigationBehavior的代碼示例,請告訴我。謝謝! – jbachelor

+1

@jbachelor您可以隨時查看Prism的[里程碑](https://github.com/PrismLibrary/Prism/milestones)。 XF 6.3版本的一個里程碑是包含這種類型的行爲,這些行爲將由NavigationService自動附加。我應該補充說,如果能夠幫助你,你現在可以在6.3 beta的TabbedPages中使用IActiveAware。 –

+1

謝謝,@ dan-s!我會去檢查6.3版本和IActiveAware。 – jbachelor