dotnet/maui · error · InvalidOperationException

Content not found for active {ShellItem}. Title: {ShellItem.

Error message

Content not found for active {ShellItem}. Title: {ShellItem.Title}. Route: {ShellItem.Route}.

What it means

Thrown by the iOS ShellItemRenderer.CreateTabRenderers when ShellItem.CurrentItem is null. On iOS, the ShellItemRenderer builds UITabBarController view controllers for each ShellContent. If the active ShellContent (CurrentItem) is null, it cannot determine what to display. This mirrors the Android counterpart (error 444) but in the iOS renderer.

Source

Thrown at src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellItemRenderer.cs:412

		{
			const int maxTabs = 5;
			var currentViewControllers = ViewControllers;
			if (currentViewControllers == null)
				return;

			bool willUseMore = currentViewControllers.Length > maxTabs;
			for (int i = 0; i < currentViewControllers.Length; i++)
			{
				var renderer = RendererForViewController(currentViewControllers[i]);
				if (renderer != null)
					renderer.IsInMoreTab = willUseMore && i >= maxTabs - 1;
			}
		}

		void CreateTabRenderers()
		{
			if (ShellItem.CurrentItem == null)
				throw new InvalidOperationException($"Content not found for active {ShellItem}. Title: {ShellItem.Title}. Route: {ShellItem.Route}.");

			var items = ShellItemController.GetItems();
			var count = items.Count;
			int maxTabs = 5; // fetch this a better way
			bool willUseMore = count > maxTabs;

			UIViewController[] viewControllers = new UIViewController[count];
			int i = 0;
			foreach (var shellContent in items)
			{
				var renderer = _context.CreateShellSectionRenderer(shellContent);

				renderer.IsInMoreTab = willUseMore && i >= maxTabs - 1;

				renderer.ShellSection = shellContent;
				AddRenderer(renderer);
				viewControllers[i++] = renderer.ViewController;
			}

View on GitHub (pinned to f377ff1c5e)

Solutions

  1. Ensure ShellItem has at least one ShellContent child with a valid page.
  2. Set ShellItem.CurrentItem explicitly when building items dynamically.
  3. Verify XAML hierarchy completeness: ShellItem must contain ShellContent (directly or via ShellSection/Tab).
  4. Check DataTemplate/Content resolution for ShellContent.
  5. Use the Title/Route from the error to identify the problematic ShellItem.

Example fix

<!-- before: ShellItem with no content -->
<ShellItem Title="Home">
</ShellItem>

<!-- after -->
<ShellItem Title="Home">
  <ShellContent Title="Home" ContentTemplate="{DataTemplate local:HomePage}" Route="home"/>
</ShellItem>
Defensive patterns

Strategy: validation

Validate before calling

// Verify ShellItem has content before iOS renderer builds tabs
if (shellItem.CurrentItem == null)
    throw new InvalidOperationException($"ShellItem '{shellItem.Title}' has no ShellContent.");

Type guard

public static bool ShellItemHasContent(ShellItem item)
    => item?.CurrentItem != null && item.Items.Count > 0;

Prevention

When it happens

Trigger: At line 412: `if (ShellItem.CurrentItem == null) throw`. Called during CreateTabRenderers which builds the UIViewController array for the tab bar. Triggered when a ShellItem exists but has no ShellContent selected as CurrentItem — either no children exist, or CurrentItem was explicitly nulled or not auto-selected.

Common situations: 1) ShellItem with zero ShellContent children. 2) ShellContent removed at runtime. 3) Shell defined in XAML with structural issues (ShellItem without ShellContent). 4) Auto-selection of CurrentItem failed due to routing or binding errors. 5) Migration from Xamarin.Forms where CurrentItem auto-selection timing differs.

Related errors


AI-assisted analysis of dotnet/maui@f377ff1c5e (2026-08-13). Data as JSON: /api/errors/159c484c266703cc. Report an issue: GitHub.