Skip to main content
This document describes how to programmatically navigate to pages, fields, table/collection rows, and individual cells within a form using the goto API on DocumentEditor.

Overview

The goto method enables programmatic navigation to specific locations within a form. This is useful for:
  • Guiding users to required fields after validation
  • Implementing custom navigation flows
  • Deep linking to specific form sections
  • Auto-scrolling to specific fields
  • Opening a specific table or collection row in its row form (modal)
  • Focusing a specific cell within a table or collection row

Path-Based Navigation

Navigate using a slash-separated path string. Up to four segments are supported.
// Navigate to a page
let status = editor.goto("page_123")

// Navigate to a field on a page (with auto-scroll)
let status = editor.goto("page_123/fieldPosition_456")

// Navigate to a table or collection row (optionally open row form)
let status = editor.goto("page_123/fieldPosition_456/row_789", gotoConfig: GotoConfig(open: true))

// Navigate to a specific cell in a table or collection row
let status = editor.goto("page_123/fieldPosition_456/row_789/column_012", gotoConfig: GotoConfig(open: true, focus: true))
Path FormatDescription
"pageId"Navigate to the top of the specified page
"pageId/fieldPositionId"Navigate to the page and automatically scroll to the field
"pageId/fieldPositionId/rowId"Navigate to the page, scroll to the table/collection field, and select the row. Use GotoConfig(open: true) to also open the row form modal.
"pageId/fieldPositionId/rowId/columnId"Navigate to the page, scroll to the table/collection field, select the row, and target a specific column/cell. Use GotoConfig(focus: true) to auto-focus the cell.
Important: Use fieldPositionId from page.fieldPositions[]._id, not fieldId from document.fields[]._id. Using the wrong ID will cause navigation to fail.
For row-level paths, the field must be a table or collection type. The rowId must match an existing row’s ID in that field’s value; otherwise goto returns .failure. For column-level paths, the columnId must match an existing visible column in the field; otherwise goto returns .failure (but still navigates to the row).

GotoConfig

Navigation behavior is configured via GotoConfig. Pass it as the second argument to goto.
public struct GotoConfig {
    /// When true, automatically opens the row form modal for table/collection rows.
    public let open: Bool

    /// When true, triggers the onFocus callback for the target field or cell.
    public let focus: Bool

    public init(open: Bool = false, focus: Bool = false)
}
PropertyDefaultDescription
openfalseIf the path targets a table/collection row, set to true to open that row’s form in a modal after navigation.
focusfalseWhen true, triggers the SDK’s onFocus event for the target field or cell. For text, number, and barcode cells this also opens the keyboard.
Examples:
// Navigate to a row and open its form for editing
let status = editor.goto("page_123/fieldPosition_456/row_789", gotoConfig: GotoConfig(open: true))

// Navigate to a field and trigger onFocus
let status = editor.goto("page_123/fieldPosition_456", gotoConfig: GotoConfig(focus: true))

// Navigate to a specific cell, open the row form, and focus the cell
let status = editor.goto("page_123/fieldPosition_456/row_789/column_012", gotoConfig: GotoConfig(open: true, focus: true))
If you omit gotoConfig, the default GotoConfig() is used (open: false, focus: false). The goto method returns a NavigationStatus indicating success or failure.
let status = editor.goto("page_123/fieldPosition_456", gotoConfig: GotoConfig())

switch status {
case .success:
    // Navigation succeeded - target exists and is visible
    print("Successfully navigated to the field")
case .failure:
    // Navigation failed - target doesn't exist, is hidden, or unsupported
    print("Navigation failed")
}
ResponseDescription
.successThe target exists, is supported, and is visible (and for row paths, the row exists; for column paths, the column exists and is visible).
.failureThe target does not exist, is hidden, or has an unsupported field type.
Failure reasons include:
  • Page does not exist
  • Page is hidden (due to conditional logic)
  • Field position does not exist
  • Field is hidden (due to conditional logic)
  • For row-level paths: field is not a table/collection, or the row ID is not found in the field’s value
  • For column-level paths: the column ID does not exist or is hidden
When the page changes, the SDK emits page focus and page blur events. See Event Handling for details.