CINXE.COM
GitHub - xmartlabs/Eureka: Elegant iOS form builder in Swift
<!DOCTYPE html> <html lang="en" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark" data-a11y-animated-images="system" data-a11y-link-underlines="true" > <head> <meta charset="utf-8"> <link rel="dns-prefetch" href="https://github.githubassets.com"> <link rel="dns-prefetch" href="https://avatars.githubusercontent.com"> <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com"> <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/"> <link rel="preconnect" href="https://github.githubassets.com" crossorigin> <link rel="preconnect" href="https://avatars.githubusercontent.com"> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-74231a1f3bbb.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-8a995f0bacd4.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-f37fb7684b1f.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-9ac301c3ebe5.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-cd826e8636dc.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-f91b0f603451.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-83beb16e0ecf.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-6e122dab64fc.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-18119e682df0.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-225433424a87.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-aaa714e5674d.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-7d4d2344e7ab.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-43ae85d4871b.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-4fce88777fa8.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-0210be90f4d3.css" /> <script type="application/json" id="client-env">{"locale":"en","featureFlags":["a11y_quote_reply_fix","copilot_immersive_issue_preview","copilot_new_references_ui","copilot_chat_repo_custom_instructions_preview","copilot_no_floating_button","copilot_topics_as_references","copilot_read_shared_conversation","copilot_duplicate_thread","copilot_buffered_streaming","dotcom_chat_client_side_skills","experimentation_azure_variant_endpoint","failbot_handle_non_errors","fgpat_form_ui_updates","geojson_azure_maps","ghost_pilot_confidence_truncation_25","ghost_pilot_confidence_truncation_40","github_models_o3_mini_streaming","hovercard_accessibility","insert_before_patch","issues_react_remove_placeholders","issues_react_blur_item_picker_on_close","marketing_pages_search_explore_provider","primer_react_css_modules_ga","react_data_router_pull_requests","remove_child_patch","sample_network_conn_type","swp_enterprise_contact_form","site_proxima_australia_update","viewscreen_sandbox","issues_react_create_milestone","issues_react_cache_fix_workaround","lifecycle_label_name_updates","copilot_task_oriented_assistive_prompts","issues_react_assignee_warning","issue_types_prevent_private_type_creation","refresh_image_video_src","turbo_app_id_restore"]}</script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-4c1770d05ab0.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover_js-9da652f58479.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_arianotify-polyfill_ariaNotify-polyfill_js-node_modules_github_mi-3abb8f-46b9f4874d95.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_failbot_failbot_ts-75968cfb5298.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/environment-f04cb2a9fc8c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_primer_behaviors_dist_esm_index_mjs-0dbb79f97f8f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_selector-observer_dist_index_esm_js-f690fd9ae3d5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_relative-time-element_dist_index_js-62d275b7ddd9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_text-expander-element_dist_index_js-78748950cb0c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_auto-complete-element_dist_index_js-node_modules_github_catalyst_-8e9f78-a90ac05d2469.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-b5f1d7-a1760ffda83d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_markdown-toolbar-element_dist_index_js-ceef33f593fa.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_primer_view-co-c44a69-8c52cf4cd0d3.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-394f8eb34f19.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-0bebfa1427c4.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_braintree_browser-detection_dist_browser-detection_js-node_modules_githu-2906d7-2a07a295af40.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lit-html_lit-html_js-be8cb88f481b.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_morphdom_dist_morphdom-e-7c534c-a4a1922eb55f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_turbo_dist_turbo_es2017-esm_js-a03ee12d659a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-893f9f-b6294cf703b7.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_color-convert_index_js-e3180fe3bcb3.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_quote-selection_dist_index_js-node_modules_github_session-resume_-947061-e7a6c4a19f98.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_updatable-content_updatable-content_ts-2a55124d5c52.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_task-list_ts-app_assets_modules_github_sso_ts-ui_packages-900dde-768abe60b1f8.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_sticky-scroll-into-view_ts-3e000c5d31a9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_ajax-error_ts-app_assets_modules_github_behaviors_include-87a4ae-8be71414579a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_commenting_edit_ts-app_assets_modules_github_behaviors_ht-83c235-e429cff6ceb1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-7ebb6421bf22.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_delegated-events_dist_index_js-node_modules_github_catalyst_lib_index_js-f6223d90c7ba.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-01e85cd1be94.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_virtualized-list_es_index_js-node_modules_github_template-parts_lib_index_js-94dc7a2157c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-70450e-4b93df70b903.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_ref-selector_ts-3e9d848bab5f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/codespaces-c3bcacfe317c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-3eebbd-0763620ad7bf.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_decorators_js-node_modules_delegated-events_di-e161aa-9d41fb1b6c9e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_github_remote--3c9c82-b71ef90fbdc7.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repositories-7a0dbaa42c57.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_github_catalyst_lib_inde-dbbea9-26cce2010167.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/code-menu-1c0aedc134b1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-e05a7c4c5398.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-6a3ef8158713.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-f1bca44e0926.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-cf2f2ab8dab4.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-62da9f-2df2f32ec596.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-9a233856b02c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-55fea94174bf.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-58a0c58bfee4.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.f9eaf3e098aa7865fd95.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.f9eaf3e098aa7865fd95.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <title>GitHub - xmartlabs/Eureka: Elegant iOS form builder in Swift</title> <meta name="route-pattern" content="/:user_id/:repository" data-turbo-transient> <meta name="route-controller" content="files" data-turbo-transient> <meta name="route-action" content="disambiguate" data-turbo-transient> <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb"> <meta name="request-id" content="C8A0:1407C1:156D62:1898FB:67E1448C" data-pjax-transient="true"/><meta name="html-safe-nonce" content="75c05da2c84232e153a7550c1a2ad4925a01c7d6506045df9ea47b3dff45ab62" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDOEEwOjE0MDdDMToxNTZENjI6MTg5OEZCOjY3RTE0NDhDIiwidmlzaXRvcl9pZCI6IjkxMjg5NDkzMjE0ODg3NDU2MTIiLCJyZWdpb25fZWRnZSI6InNvdXRoZWFzdGFzaWEiLCJyZWdpb25fcmVuZGVyIjoic291dGhlYXN0YXNpYSJ9" data-pjax-transient="true"/><meta name="visitor-hmac" content="f836d075124af6f2dd75f92cbc0fc572d3b1023a1eaaebc641a955a4f68575ab" data-pjax-transient="true"/> <meta name="hovercard-subject-tag" content="repository:43330374" data-turbo-transient> <meta name="github-keyboard-shortcuts" content="repository,copilot" data-turbo-transient="true" /> <meta name="selected-link" value="repo_source" data-turbo-transient> <link rel="assets" href="https://github.githubassets.com/"> <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I"> <meta name="octolytics-url" content="https://collector.github.com/github/collect" /> <meta name="analytics-location" content="/<user-name>/<repo-name>" data-turbo-transient="true" /> <meta name="user-login" content=""> <meta name="viewport" content="width=device-width"> <meta name="description" content="Elegant iOS form builder in Swift. Contribute to xmartlabs/Eureka development by creating an account on GitHub."> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub"> <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub"> <meta property="fb:app_id" content="1401488693436528"> <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/xmartlabs/Eureka" /> <meta name="twitter:image" content="https://opengraph.githubassets.com/ec27d667b42c686fc4fc3b011ea4b77e86a3c9696e05767d66a3be1749815b94/xmartlabs/Eureka" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="GitHub - xmartlabs/Eureka: Elegant iOS form builder in Swift" /><meta name="twitter:description" content="Elegant iOS form builder in Swift. Contribute to xmartlabs/Eureka development by creating an account on GitHub." /> <meta property="og:image" content="https://opengraph.githubassets.com/ec27d667b42c686fc4fc3b011ea4b77e86a3c9696e05767d66a3be1749815b94/xmartlabs/Eureka" /><meta property="og:image:alt" content="Elegant iOS form builder in Swift. Contribute to xmartlabs/Eureka development by creating an account on GitHub." /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="GitHub - xmartlabs/Eureka: Elegant iOS form builder in Swift" /><meta property="og:url" content="https://github.com/xmartlabs/Eureka" /><meta property="og:description" content="Elegant iOS form builder in Swift. Contribute to xmartlabs/Eureka development by creating an account on GitHub." /> <meta name="hostname" content="github.com"> <meta name="expected-hostname" content="github.com"> <meta http-equiv="x-pjax-version" content="3f558f0602919c5dad74b6ea6e75c4237d41722a65346024826c6cdc107723ae" data-turbo-track="reload"> <meta http-equiv="x-pjax-csp-version" content="77190eb53eb47fc30bd2fcc17a7eefa2dfd8505869fee9299ba911be3a40a9eb" data-turbo-track="reload"> <meta http-equiv="x-pjax-css-version" content="3c046d4b918199cbb4d255cca63226853d0617dbae6529663229394aa9b0742a" data-turbo-track="reload"> <meta http-equiv="x-pjax-js-version" content="14a9c6d9ae5a449d127afe6af812d851775eb63ed6c83c94b185f85e9cd14b3a" data-turbo-track="reload"> <meta name="turbo-cache-control" content="no-preview" data-turbo-transient=""> <meta data-hydrostats="publish"> <meta name="go-import" content="github.com/xmartlabs/Eureka git https://github.com/xmartlabs/Eureka.git"> <meta name="octolytics-dimension-user_id" content="2227731" /><meta name="octolytics-dimension-user_login" content="xmartlabs" /><meta name="octolytics-dimension-repository_id" content="43330374" /><meta name="octolytics-dimension-repository_nwo" content="xmartlabs/Eureka" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="43330374" /><meta name="octolytics-dimension-repository_network_root_nwo" content="xmartlabs/Eureka" /> <link rel="canonical" href="https://github.com/xmartlabs/Eureka" data-turbo-transient> <meta name="turbo-body-classes" content="logged-out env-production page-responsive"> <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats"> <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors"> <meta name="release" content="0f8bedc9f7e2a534acc995efd4bfad497fdea468"> <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000"> <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png"> <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon"> <meta name="theme-color" content="#1e2327"> <meta name="color-scheme" content="light dark" /> <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials"> </head> <body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div class="position-relative header-wrapper js-header-wrapper "> <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a> <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full"> <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span> </span> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ui-commands_ui-commands_ts-8c874fb594e9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-33dfb803e078.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.f9eaf3e098aa7865fd95.module.css" /> <react-partial partial-name="keyboard-shortcuts-dialog" data-ssr="false" data-attempted-ssr="false" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script> <div data-target="react-partial.reactRoot"></div> </react-partial> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-94fd67-4898d1bf4b51.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/sessions-730dca81d0a2.js"></script> <header class="HeaderMktg header-logged-out js-details-container js-header Details f4 py-3" role="banner" data-is-top="true" data-color-mode=light data-light-theme=light data-dark-theme=dark> <h2 class="sr-only">Navigation Menu</h2> <button type="button" class="HeaderMktg-backdrop d-lg-none border-0 position-fixed top-0 left-0 width-full height-full js-details-target" aria-label="Toggle navigation"> <span class="d-none">Toggle navigation</span> </button> <div class="d-flex flex-column flex-lg-row flex-items-center px-3 px-md-4 px-lg-5 height-full position-relative z-1"> <div class="d-flex flex-justify-between flex-items-center width-full width-lg-auto"> <div class="flex-1"> <button aria-label="Toggle navigation" aria-expanded="false" type="button" data-view-component="true" class="js-details-target js-nav-padding-recalculate js-header-menu-toggle Button--link Button--medium Button d-lg-none color-fg-inherit p-1"> <span class="Button-content"> <span class="Button-label"><div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div></span> </span> </button> </div> <a class="mr-lg-3 color-fg-inherit flex-order-2 js-prevent-focus-on-mobile-nav" href="/" aria-label="Homepage" data-analytics-event="{"category":"Marketing nav","action":"click to go to homepage","label":"ref_page:Marketing;ref_cta:Logomark;ref_loc:Header"}"> <svg height="32" aria-hidden="true" viewBox="0 0 24 24" version="1.1" width="32" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12 1C5.9225 1 1 5.9225 1 12C1 16.8675 4.14875 20.9787 8.52125 22.4362C9.07125 22.5325 9.2775 22.2025 9.2775 21.9137C9.2775 21.6525 9.26375 20.7862 9.26375 19.865C6.5 20.3737 5.785 19.1912 5.565 18.5725C5.44125 18.2562 4.905 17.28 4.4375 17.0187C4.0525 16.8125 3.5025 16.3037 4.42375 16.29C5.29 16.2762 5.90875 17.0875 6.115 17.4175C7.105 19.0812 8.68625 18.6137 9.31875 18.325C9.415 17.61 9.70375 17.1287 10.02 16.8537C7.5725 16.5787 5.015 15.63 5.015 11.4225C5.015 10.2262 5.44125 9.23625 6.1425 8.46625C6.0325 8.19125 5.6475 7.06375 6.2525 5.55125C6.2525 5.55125 7.17375 5.2625 9.2775 6.67875C10.1575 6.43125 11.0925 6.3075 12.0275 6.3075C12.9625 6.3075 13.8975 6.43125 14.7775 6.67875C16.8813 5.24875 17.8025 5.55125 17.8025 5.55125C18.4075 7.06375 18.0225 8.19125 17.9125 8.46625C18.6138 9.23625 19.04 10.2125 19.04 11.4225C19.04 15.6437 16.4688 16.5787 14.0213 16.8537C14.42 17.1975 14.7638 17.8575 14.7638 18.8887C14.7638 20.36 14.75 21.5425 14.75 21.9137C14.75 22.2025 14.9563 22.5462 15.5063 22.4362C19.8513 20.9787 23 16.8537 23 12C23 5.9225 18.0775 1 12 1Z"></path> </svg> </a> <div class="flex-1 flex-order-2 text-right"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2Fxmartlabs%2FEureka" class="HeaderMenu-link HeaderMenu-button d-inline-flex d-lg-none flex-order-1 f5 no-underline border color-border-default rounded-2 px-2 py-1 color-fg-inherit js-prevent-focus-on-mobile-nav" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/xmartlabs/Eureka","user_id":null}}" data-hydro-click-hmac="643b2143fe22bc4efd473dc1a9827055fb8dae34e62fe3a106c9d88bdcd34ec1" data-analytics-event="{"category":"Marketing nav","action":"click to Sign in","label":"ref_page:Marketing;ref_cta:Sign in;ref_loc:Header"}" > Sign in </a> </div> </div> <div class="HeaderMenu js-header-menu height-fit position-lg-relative d-lg-flex flex-column flex-auto top-0"> <div class="HeaderMenu-wrapper d-flex flex-column flex-self-start flex-lg-row flex-auto rounded rounded-lg-0"> <nav class="HeaderMenu-nav" aria-label="Global"> <ul class="d-lg-flex list-style-none"> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Product <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"github_copilot","context":"product","tag":"link","label":"github_copilot_link_product_navbar"}" href="https://github.com/features/copilot"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Copilot</div> Write better code with AI </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"security","context":"product","tag":"link","label":"security_link_product_navbar"}" href="https://github.com/features/security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Security</div> Find and fix vulnerabilities </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"actions","context":"product","tag":"link","label":"actions_link_product_navbar"}" href="https://github.com/features/actions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-workflow color-fg-subtle mr-3"> <path d="M1 3a2 2 0 0 1 2-2h6.5a2 2 0 0 1 2 2v6.5a2 2 0 0 1-2 2H7v4.063C7 16.355 7.644 17 8.438 17H12.5v-2.5a2 2 0 0 1 2-2H21a2 2 0 0 1 2 2V21a2 2 0 0 1-2 2h-6.5a2 2 0 0 1-2-2v-2.5H8.437A2.939 2.939 0 0 1 5.5 15.562V11.5H3a2 2 0 0 1-2-2Zm2-.5a.5.5 0 0 0-.5.5v6.5a.5.5 0 0 0 .5.5h6.5a.5.5 0 0 0 .5-.5V3a.5.5 0 0 0-.5-.5ZM14.5 14a.5.5 0 0 0-.5.5V21a.5.5 0 0 0 .5.5H21a.5.5 0 0 0 .5-.5v-6.5a.5.5 0 0 0-.5-.5Z"></path> </svg> <div> <div class="color-fg-default h4">Actions</div> Automate any workflow </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"codespaces","context":"product","tag":"link","label":"codespaces_link_product_navbar"}" href="https://github.com/features/codespaces"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-codespaces color-fg-subtle mr-3"> <path d="M3.5 3.75C3.5 2.784 4.284 2 5.25 2h13.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 18.75 13H5.25a1.75 1.75 0 0 1-1.75-1.75Zm-2 12c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v4a1.75 1.75 0 0 1-1.75 1.75H3.25a1.75 1.75 0 0 1-1.75-1.75ZM5.25 3.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h13.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Zm-2 12a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h17.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25Z"></path><path d="M10 17.75a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> <div> <div class="color-fg-default h4">Codespaces</div> Instant dev environments </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"issues","context":"product","tag":"link","label":"issues_link_product_navbar"}" href="https://github.com/features/issues"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-issue-opened color-fg-subtle mr-3"> <path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1ZM2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5 9.5 9.5 0 0 0 2.5 12Zm9.5 2a2 2 0 1 1-.001-3.999A2 2 0 0 1 12 14Z"></path> </svg> <div> <div class="color-fg-default h4">Issues</div> Plan and track work </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"code_review","context":"product","tag":"link","label":"code_review_link_product_navbar"}" href="https://github.com/features/code-review"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-review color-fg-subtle mr-3"> <path d="M10.3 6.74a.75.75 0 0 1-.04 1.06l-2.908 2.7 2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M1.5 4.25c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v12.5a1.75 1.75 0 0 1-1.75 1.75h-9.69l-3.573 3.573A1.458 1.458 0 0 1 5 21.043V18.5H3.25a1.75 1.75 0 0 1-1.75-1.75ZM3.25 4a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h2.5a.75.75 0 0 1 .75.75v3.19l3.72-3.72a.749.749 0 0 1 .53-.22h10a.25.25 0 0 0 .25-.25V4.25a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Review</div> Manage code changes </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"discussions","context":"product","tag":"link","label":"discussions_link_product_navbar"}" href="https://github.com/features/discussions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Discussions</div> Collaborate outside of code </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"code_search","context":"product","tag":"link","label":"code_search_link_product_navbar"}" href="https://github.com/features/code-search"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-square color-fg-subtle mr-3"> <path d="M10.3 8.24a.75.75 0 0 1-.04 1.06L7.352 12l2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M2 3.75C2 2.784 2.784 2 3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25Zm1.75-.25a.25.25 0 0 0-.25.25v16.5c0 .138.112.25.25.25h16.5a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Search</div> Find more, search less </div> </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="product-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="product-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"all_features","context":"product","tag":"link","label":"all_features_link_product_navbar"}" href="https://github.com/features"> All features </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"documentation","context":"product","tag":"link","label":"documentation_link_product_navbar"}" href="https://docs.github.com"> Documentation <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"github_skills","context":"product","tag":"link","label":"github_skills_link_product_navbar"}" href="https://skills.github.com"> GitHub Skills <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"blog","context":"product","tag":"link","label":"blog_link_product_navbar"}" href="https://github.blog"> Blog <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Solutions <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 pb-lg-3 mb-3 mb-lg-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-company-size-heading">By company size</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-company-size-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"enterprises","context":"solutions","tag":"link","label":"enterprises_link_solutions_navbar"}" href="https://github.com/enterprise"> Enterprises </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"small_and_medium_teams","context":"solutions","tag":"link","label":"small_and_medium_teams_link_solutions_navbar"}" href="https://github.com/team"> Small and medium teams </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"startups","context":"solutions","tag":"link","label":"startups_link_solutions_navbar"}" href="https://github.com/enterprise/startups"> Startups </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"nonprofits","context":"solutions","tag":"link","label":"nonprofits_link_solutions_navbar"}" href="/solutions/industry/nonprofits"> Nonprofits </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-use-case-heading">By use case</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-use-case-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devsecops","context":"solutions","tag":"link","label":"devsecops_link_solutions_navbar"}" href="/solutions/use-case/devsecops"> DevSecOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devops","context":"solutions","tag":"link","label":"devops_link_solutions_navbar"}" href="/solutions/use-case/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ci_cd","context":"solutions","tag":"link","label":"ci_cd_link_solutions_navbar"}" href="/solutions/use-case/ci-cd"> CI/CD </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all_use_cases","context":"solutions","tag":"link","label":"view_all_use_cases_link_solutions_navbar"}" href="/solutions/use-case"> View all use cases </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-industry-heading">By industry</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-industry-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"healthcare","context":"solutions","tag":"link","label":"healthcare_link_solutions_navbar"}" href="/solutions/industry/healthcare"> Healthcare </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"financial_services","context":"solutions","tag":"link","label":"financial_services_link_solutions_navbar"}" href="/solutions/industry/financial-services"> Financial services </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"manufacturing","context":"solutions","tag":"link","label":"manufacturing_link_solutions_navbar"}" href="/solutions/industry/manufacturing"> Manufacturing </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"government","context":"solutions","tag":"link","label":"government_link_solutions_navbar"}" href="/solutions/industry/government"> Government </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all_industries","context":"solutions","tag":"link","label":"view_all_industries_link_solutions_navbar"}" href="/solutions/industry"> View all industries </a></li> </ul> </div> </div> <div class="HeaderMenu-trailing-link rounded-bottom-2 flex-shrink-0 mt-lg-4 px-lg-4 py-4 py-lg-3 f5 text-semibold"> <a href="/solutions"> View all solutions <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-right HeaderMenu-trailing-link-icon"> <path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path> </svg> </a> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Resources <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-topics-heading">Topics</span> <ul class="list-style-none f5" aria-labelledby="resources-topics-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ai","context":"resources","tag":"link","label":"ai_link_resources_navbar"}" href="/resources/articles/ai"> AI </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devops","context":"resources","tag":"link","label":"devops_link_resources_navbar"}" href="/resources/articles/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"security","context":"resources","tag":"link","label":"security_link_resources_navbar"}" href="/resources/articles/security"> Security </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"software_development","context":"resources","tag":"link","label":"software_development_link_resources_navbar"}" href="/resources/articles/software-development"> Software Development </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all","context":"resources","tag":"link","label":"view_all_link_resources_navbar"}" href="/resources/articles"> View all </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="resources-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"learning_pathways","context":"resources","tag":"link","label":"learning_pathways_link_resources_navbar"}" href="https://resources.github.com/learn/pathways"> Learning Pathways <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"events_amp_webinars","context":"resources","tag":"link","label":"events_amp_webinars_link_resources_navbar"}" href="https://resources.github.com"> Events & Webinars <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ebooks_amp_whitepapers","context":"resources","tag":"link","label":"ebooks_amp_whitepapers_link_resources_navbar"}" href="https://github.com/resources/whitepapers"> Ebooks & Whitepapers </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"customer_stories","context":"resources","tag":"link","label":"customer_stories_link_resources_navbar"}" href="https://github.com/customer-stories"> Customer Stories </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"partners","context":"resources","tag":"link","label":"partners_link_resources_navbar"}" href="https://partner.github.com"> Partners <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"executive_insights","context":"resources","tag":"link","label":"executive_insights_link_resources_navbar"}" href="https://github.com/solutions/executive-insights"> Executive Insights </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Open Source <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"github_sponsors","context":"open_source","tag":"link","label":"github_sponsors_link_open_source_navbar"}" href="/sponsors"> <div> <div class="color-fg-default h4">GitHub Sponsors</div> Fund open source developers </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"the_readme_project","context":"open_source","tag":"link","label":"the_readme_project_link_open_source_navbar"}" href="https://github.com/readme"> <div> <div class="color-fg-default h4">The ReadME Project</div> GitHub community articles </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="open-source-repositories-heading">Repositories</span> <ul class="list-style-none f5" aria-labelledby="open-source-repositories-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"topics","context":"open_source","tag":"link","label":"topics_link_open_source_navbar"}" href="https://github.com/topics"> Topics </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"trending","context":"open_source","tag":"link","label":"trending_link_open_source_navbar"}" href="https://github.com/trending"> Trending </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"collections","context":"open_source","tag":"link","label":"collections_link_open_source_navbar"}" href="https://github.com/collections"> Collections </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Enterprise <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"enterprise_platform","context":"enterprise","tag":"link","label":"enterprise_platform_link_enterprise_navbar"}" href="/enterprise"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-stack color-fg-subtle mr-3"> <path d="M11.063 1.456a1.749 1.749 0 0 1 1.874 0l8.383 5.316a1.751 1.751 0 0 1 0 2.956l-8.383 5.316a1.749 1.749 0 0 1-1.874 0L2.68 9.728a1.751 1.751 0 0 1 0-2.956Zm1.071 1.267a.25.25 0 0 0-.268 0L3.483 8.039a.25.25 0 0 0 0 .422l8.383 5.316a.25.25 0 0 0 .268 0l8.383-5.316a.25.25 0 0 0 0-.422Z"></path><path d="M1.867 12.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path><path d="M1.867 16.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path> </svg> <div> <div class="color-fg-default h4">Enterprise platform</div> AI-powered developer platform </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="enterprise-available-add-ons-heading">Available add-ons</span> <ul class="list-style-none f5" aria-labelledby="enterprise-available-add-ons-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"advanced_security","context":"enterprise","tag":"link","label":"advanced_security_link_enterprise_navbar"}" href="https://github.com/enterprise/advanced-security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Advanced Security</div> Enterprise-grade security features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"copilot_for_business","context":"enterprise","tag":"link","label":"copilot_for_business_link_enterprise_navbar"}" href="/features/copilot/copilot-business"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">Copilot for business</div> Enterprise-grade AI features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"premium_support","context":"enterprise","tag":"link","label":"premium_support_link_enterprise_navbar"}" href="/premium-support"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Premium Support</div> Enterprise-grade 24/7 support </div> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <a class="HeaderMenu-link no-underline px-0 px-lg-2 py-3 py-lg-2 d-block d-lg-inline-block" data-analytics-event="{"location":"navbar","action":"pricing","context":"global","tag":"link","label":"pricing_link_global_navbar"}" href="https://github.com/pricing">Pricing</a> </li> </ul> </nav> <div class="d-flex flex-column flex-lg-row width-full flex-justify-end flex-lg-items-center text-center mt-3 mt-lg-0 text-lg-left ml-lg-3"> <qbsearch-input class="search-input" data-scope="repo:xmartlabs/Eureka" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="YOpC_v96X_89-s-ZgxPLucn5Irl3IaFq0k304NlTSwUvfdQbBMOFNzllYLBlK7nzUftI9kwlLq4cA5zfiaOxjw" data-max-custom-scopes="10" data-header-redesign-enabled="false" data-initial-value="" data-blackbird-suggestions-path="/search/suggestions" data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations" data-current-repository="xmartlabs/Eureka" data-current-org="xmartlabs" data-current-owner="" data-logged-in="false" data-copilot-chat-enabled="false" data-nl-search-enabled="false" data-retain-scroll-position="true"> <div class="search-input-container search-with-dialog position-relative d-flex flex-row flex-items-center mr-4 rounded" data-action="click:qbsearch-input#searchInputContainerClicked" > <button type="button" class="header-search-button placeholder input-button form-control d-flex flex-1 flex-self-stretch flex-items-center no-wrap width-full py-0 pl-2 pr-0 text-left border-0 box-shadow-none" data-target="qbsearch-input.inputButton" aria-label="Search or jump to…" aria-haspopup="dialog" placeholder="Search or jump to..." data-hotkey=s,/ autocapitalize="off" data-analytics-event="{"location":"navbar","action":"searchbar","context":"global","tag":"input","label":"searchbar_input_global_navbar"}" data-action="click:qbsearch-input#handleExpand" > <div class="mr-2 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </div> <span class="flex-1" data-target="qbsearch-input.inputButtonText">Search or jump to...</span> <div class="d-flex" data-target="qbsearch-input.hotkeyIndicator"> <svg xmlns="http://www.w3.org/2000/svg" width="22" height="20" aria-hidden="true" class="mr-1"><path fill="none" stroke="#979A9C" opacity=".4" d="M3.5.5h12c1.7 0 3 1.3 3 3v13c0 1.7-1.3 3-3 3h-12c-1.7 0-3-1.3-3-3v-13c0-1.7 1.3-3 3-3z"></path><path fill="#979A9C" d="M11.8 6L8 15.1h-.9L10.8 6h1z"></path></svg> </div> </button> <input type="hidden" name="type" class="js-site-search-type-field"> <div class="Overlay--hidden " data-modal-dialog-overlay> <modal-dialog data-action="close:qbsearch-input#handleClose cancel:qbsearch-input#handleClose" data-target="qbsearch-input.searchSuggestionsDialog" role="dialog" id="search-suggestions-dialog" aria-modal="true" aria-labelledby="search-suggestions-dialog-header" data-view-component="true" class="Overlay Overlay--width-large Overlay--height-auto"> <h1 id="search-suggestions-dialog-header" class="sr-only">Search code, repositories, users, issues, pull requests...</h1> <div class="Overlay-body Overlay-body--paddingNone"> <div data-view-component="true"> <div class="search-suggestions position-fixed width-full color-shadow-large border color-fg-default color-bg-default overflow-hidden d-flex flex-column query-builder-container" style="border-radius: 12px;" data-target="qbsearch-input.queryBuilderContainer" hidden > <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="query-builder-test-form" action="" accept-charset="UTF-8" method="get"> <query-builder data-target="qbsearch-input.queryBuilder" id="query-builder-query-builder-test" data-filter-key=":" data-view-component="true" class="QueryBuilder search-query-builder"> <div class="FormControl FormControl--fullWidth"> <label id="query-builder-test-label" for="query-builder-test" class="FormControl-label sr-only"> Search </label> <div class="QueryBuilder-StyledInput width-fit " data-target="query-builder.styledInput" > <span id="query-builder-test-leadingvisual-wrap" class="FormControl-input-leadingVisualWrap QueryBuilder-leadingVisualWrap"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search FormControl-input-leadingVisual"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </span> <div data-target="query-builder.styledInputContainer" class="QueryBuilder-StyledInputContainer"> <div aria-hidden="true" class="QueryBuilder-StyledInputContent" data-target="query-builder.styledInputContent" ></div> <div class="QueryBuilder-InputWrapper"> <div aria-hidden="true" class="QueryBuilder-Sizer" data-target="query-builder.sizer"></div> <input id="query-builder-test" name="query-builder-test" value="" autocomplete="off" type="text" role="combobox" spellcheck="false" aria-expanded="false" aria-describedby="validation-a309f368-c4d7-44fa-b861-54f9be73baf9" data-target="query-builder.input" data-action=" input:query-builder#inputChange blur:query-builder#inputBlur keydown:query-builder#inputKeydown focus:query-builder#inputFocus " data-view-component="true" class="FormControl-input QueryBuilder-Input FormControl-medium" /> </div> </div> <span class="sr-only" id="query-builder-test-clear">Clear</span> <button role="button" id="query-builder-test-clear-button" aria-labelledby="query-builder-test-clear query-builder-test-label" data-target="query-builder.clearButton" data-action=" click:query-builder#clear focus:query-builder#clearButtonFocus blur:query-builder#clearButtonBlur " variant="small" hidden="hidden" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium mr-1 px-2 py-0 d-flex flex-items-center rounded-1 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x-circle-fill Button-visual"> <path d="M2.343 13.657A8 8 0 1 1 13.658 2.343 8 8 0 0 1 2.343 13.657ZM6.03 4.97a.751.751 0 0 0-1.042.018.751.751 0 0 0-.018 1.042L6.94 8 4.97 9.97a.749.749 0 0 0 .326 1.275.749.749 0 0 0 .734-.215L8 9.06l1.97 1.97a.749.749 0 0 0 1.275-.326.749.749 0 0 0-.215-.734L9.06 8l1.97-1.97a.749.749 0 0 0-.326-1.275.749.749 0 0 0-.734.215L8 6.94Z"></path> </svg> </button> </div> <template id="search-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </template> <template id="code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="file-code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file-code"> <path d="M4 1.75C4 .784 4.784 0 5.75 0h5.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 14.25 15h-9a.75.75 0 0 1 0-1.5h9a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 10 4.25V1.5H5.75a.25.25 0 0 0-.25.25v2.5a.75.75 0 0 1-1.5 0Zm1.72 4.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l1.47-1.47-1.47-1.47a.75.75 0 0 1 0-1.06ZM3.28 7.78 1.81 9.25l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Zm8.22-6.218V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path> </svg> </template> <template id="history-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-history"> <path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path> </svg> </template> <template id="repo-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> </template> <template id="bookmark-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bookmark"> <path d="M3 2.75C3 1.784 3.784 1 4.75 1h6.5c.966 0 1.75.784 1.75 1.75v11.5a.75.75 0 0 1-1.227.579L8 11.722l-3.773 3.107A.751.751 0 0 1 3 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.91l3.023-2.489a.75.75 0 0 1 .954 0l3.023 2.49V2.75a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="plus-circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-plus-circle"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm7.25-3.25v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> </template> <template id="trash-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-trash"> <path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"></path> </svg> </template> <template id="team-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-people"> <path d="M2 5.5a3.5 3.5 0 1 1 5.898 2.549 5.508 5.508 0 0 1 3.034 4.084.75.75 0 1 1-1.482.235 4 4 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.102 8.05 3.493 3.493 0 0 1 2 5.5ZM11 4a3.001 3.001 0 0 1 2.22 5.018 5.01 5.01 0 0 1 2.56 3.012.749.749 0 0 1-.885.954.752.752 0 0 1-.549-.514 3.507 3.507 0 0 0-2.522-2.372.75.75 0 0 1-.574-.73v-.352a.75.75 0 0 1 .416-.672A1.5 1.5 0 0 0 11 5.5.75.75 0 0 1 11 4Zm-5.5-.5a2 2 0 1 0-.001 3.999A2 2 0 0 0 5.5 3.5Z"></path> </svg> </template> <template id="project-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-project"> <path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25ZM11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3Z"></path> </svg> </template> <template id="pencil-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pencil"> <path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path> </svg> </template> <template id="copilot-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot"> <path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="copilot-error-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot-error"> <path d="M16 11.24c0 .112-.072.274-.21.467L13 9.688V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-.198 0-.388-.009-.571-.029L6.833 5.226a4.01 4.01 0 0 0 .17-.782c.117-.935-.037-1.395-.241-1.614-.193-.206-.637-.413-1.682-.297-.683.076-1.115.231-1.395.415l-1.257-.91c.579-.564 1.413-.877 2.485-.996 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095Zm-5.083-8.707c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Zm2.511 11.074c-1.393.776-3.272 1.428-5.43 1.428-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.18-.455-.241-.963-.252-1.475L.31 4.107A.747.747 0 0 1 0 3.509V3.49a.748.748 0 0 1 .625-.73c.156-.026.306.047.435.139l14.667 10.578a.592.592 0 0 1 .227.264.752.752 0 0 1 .046.249v.022a.75.75 0 0 1-1.19.596Zm-1.367-.991L5.635 7.964a5.128 5.128 0 0 1-.889.073c-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433 1.539 0 3.089-.505 4.063-.934Z"></path> </svg> </template> <template id="workflow-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-workflow"> <path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="book-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> </template> <template id="code-review-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-review"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 13H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25v-8.5C0 1.784.784 1 1.75 1ZM1.5 2.75v8.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm5.28 1.72a.75.75 0 0 1 0 1.06L5.31 7l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.75.75 0 0 1 1.06 0Zm2.44 0a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L10.69 7 9.22 5.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="codespaces-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-codespaces"> <path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> </template> <template id="comment-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment"> <path d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="comment-discussion-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion"> <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path> </svg> </template> <template id="organization-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-organization"> <path d="M1.75 16A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0h8.5C11.216 0 12 .784 12 1.75v12.5c0 .085-.006.168-.018.25h2.268a.25.25 0 0 0 .25-.25V8.285a.25.25 0 0 0-.111-.208l-1.055-.703a.749.749 0 1 1 .832-1.248l1.055.703c.487.325.779.871.779 1.456v5.965A1.75 1.75 0 0 1 14.25 16h-3.5a.766.766 0 0 1-.197-.026c-.099.017-.2.026-.303.026h-3a.75.75 0 0 1-.75-.75V14h-1v1.25a.75.75 0 0 1-.75.75Zm-.25-1.75c0 .138.112.25.25.25H4v-1.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 .75.75v1.25h2.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM3.75 6h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 3.75A.75.75 0 0 1 3.75 3h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 3.75Zm4 3A.75.75 0 0 1 7.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 7 6.75ZM7.75 3h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 9.75A.75.75 0 0 1 3.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 9.75ZM7.75 9h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="rocket-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-rocket"> <path d="M14.064 0h.186C15.216 0 16 .784 16 1.75v.186a8.752 8.752 0 0 1-2.564 6.186l-.458.459c-.314.314-.641.616-.979.904v3.207c0 .608-.315 1.172-.833 1.49l-2.774 1.707a.749.749 0 0 1-1.11-.418l-.954-3.102a1.214 1.214 0 0 1-.145-.125L3.754 9.816a1.218 1.218 0 0 1-.124-.145L.528 8.717a.749.749 0 0 1-.418-1.11l1.71-2.774A1.748 1.748 0 0 1 3.31 4h3.204c.288-.338.59-.665.904-.979l.459-.458A8.749 8.749 0 0 1 14.064 0ZM8.938 3.623h-.002l-.458.458c-.76.76-1.437 1.598-2.02 2.5l-1.5 2.317 2.143 2.143 2.317-1.5c.902-.583 1.74-1.26 2.499-2.02l.459-.458a7.25 7.25 0 0 0 2.123-5.127V1.75a.25.25 0 0 0-.25-.25h-.186a7.249 7.249 0 0 0-5.125 2.123ZM3.56 14.56c-.732.732-2.334 1.045-3.005 1.148a.234.234 0 0 1-.201-.064.234.234 0 0 1-.064-.201c.103-.671.416-2.273 1.15-3.003a1.502 1.502 0 1 1 2.12 2.12Zm6.94-3.935c-.088.06-.177.118-.266.175l-2.35 1.521.548 1.783 1.949-1.2a.25.25 0 0 0 .119-.213ZM3.678 8.116 5.2 5.766c.058-.09.117-.178.176-.266H3.309a.25.25 0 0 0-.213.119l-1.2 1.95ZM12 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </template> <template id="shield-check-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield-check"> <path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="heart-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-heart"> <path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path> </svg> </template> <template id="server-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-server"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v4c0 .372-.116.717-.314 1 .198.283.314.628.314 1v4a1.75 1.75 0 0 1-1.75 1.75H1.75A1.75 1.75 0 0 1 0 12.75v-4c0-.358.109-.707.314-1a1.739 1.739 0 0 1-.314-1v-4C0 1.784.784 1 1.75 1ZM1.5 2.75v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm.25 5.75a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25ZM7 4.75A.75.75 0 0 1 7.75 4h4.5a.75.75 0 0 1 0 1.5h-4.5A.75.75 0 0 1 7 4.75ZM7.75 10h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM3 4.75A.75.75 0 0 1 3.75 4h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 4.75ZM3.75 10h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="globe-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-globe"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"></path> </svg> </template> <template id="issue-opened-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </template> <template id="device-mobile-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-mobile"> <path d="M3.75 0h8.5C13.216 0 14 .784 14 1.75v12.5A1.75 1.75 0 0 1 12.25 16h-8.5A1.75 1.75 0 0 1 2 14.25V1.75C2 .784 2.784 0 3.75 0ZM3.5 1.75v12.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM8 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path> </svg> </template> <template id="package-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-package"> <path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"></path> </svg> </template> <template id="credit-card-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-credit-card"> <path d="M10.75 9a.75.75 0 0 0 0 1.5h1.5a.75.75 0 0 0 0-1.5h-1.5Z"></path><path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25ZM14.5 6.5h-13v5.75c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm0-2.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25V5h13Z"></path> </svg> </template> <template id="play-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </template> <template id="gift-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-gift"> <path d="M2 2.75A2.75 2.75 0 0 1 4.75 0c.983 0 1.873.42 2.57 1.232.268.318.497.668.68 1.042.183-.375.411-.725.68-1.044C9.376.42 10.266 0 11.25 0a2.75 2.75 0 0 1 2.45 4h.55c.966 0 1.75.784 1.75 1.75v2c0 .698-.409 1.301-1 1.582v4.918A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25V9.332C.409 9.05 0 8.448 0 7.75v-2C0 4.784.784 4 1.75 4h.55c-.192-.375-.3-.8-.3-1.25ZM7.25 9.5H2.5v4.75c0 .138.112.25.25.25h4.5Zm1.5 0v5h4.5a.25.25 0 0 0 .25-.25V9.5Zm0-4V8h5.5a.25.25 0 0 0 .25-.25v-2a.25.25 0 0 0-.25-.25Zm-7 0a.25.25 0 0 0-.25.25v2c0 .138.112.25.25.25h5.5V5.5h-5.5Zm3-4a1.25 1.25 0 0 0 0 2.5h2.309c-.233-.818-.542-1.401-.878-1.793-.43-.502-.915-.707-1.431-.707ZM8.941 4h2.309a1.25 1.25 0 0 0 0-2.5c-.516 0-1 .205-1.43.707-.337.392-.646.975-.879 1.793Z"></path> </svg> </template> <template id="code-square-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="device-desktop-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-desktop"> <path d="M14.25 1c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 14.25 12h-3.727c.099 1.041.52 1.872 1.292 2.757A.752.752 0 0 1 11.25 16h-6.5a.75.75 0 0 1-.565-1.243c.772-.885 1.192-1.716 1.292-2.757H1.75A1.75 1.75 0 0 1 0 10.25v-7.5C0 1.784.784 1 1.75 1ZM1.75 2.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25ZM9.018 12H6.982a5.72 5.72 0 0 1-.765 2.5h3.566a5.72 5.72 0 0 1-.765-2.5Z"></path> </svg> </template> <div class="position-relative"> <ul role="listbox" class="ActionListWrap QueryBuilder-ListWrap" aria-label="Suggestions" data-action=" combobox-commit:query-builder#comboboxCommit mousedown:query-builder#resultsMousedown " data-target="query-builder.resultsList" data-persist-list=false id="query-builder-test-results" ></ul> </div> <div class="FormControl-inlineValidation" id="validation-a309f368-c4d7-44fa-b861-54f9be73baf9" hidden="hidden"> <span class="FormControl-inlineValidation--visual"> <svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill"> <path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path> </svg> </span> <span></span> </div> </div> <div data-target="query-builder.screenReaderFeedback" aria-live="polite" aria-atomic="true" class="sr-only"></div> </query-builder></form> <div class="d-flex flex-row color-fg-muted px-3 text-small color-bg-default search-feedback-prompt"> <a target="_blank" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax" data-view-component="true" class="Link color-fg-accent text-normal ml-2">Search syntax tips</a> <div class="d-flex flex-1"></div> </div> </div> </div> </div> </modal-dialog></div> </div> <div data-action="click:qbsearch-input#retract" class="dark-backdrop position-fixed" hidden data-target="qbsearch-input.darkBackdrop"></div> <div class="color-fg-default"> <dialog-helper> <dialog data-target="qbsearch-input.feedbackDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="feedback-dialog" aria-modal="true" aria-labelledby="feedback-dialog-title" aria-describedby="feedback-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="feedback-dialog-title"> Provide feedback </h1> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="feedback-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="feedback-dialog-title"> <div data-view-component="true" class="Overlay-body"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="code-search-feedback-form" data-turbo="false" action="/search/feedback" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="Iz+8edWUqeQ53+ixM7EOEoOmr6+ofQNAyty0CXWYp4ThjYFAGSpM//YxAWGszsDGQ+XhW86aQM6KBEZkhqFI5A==" /> <p>We read every piece of feedback, and take your input very seriously.</p> <textarea name="feedback" class="form-control width-full mb-2" style="height: 120px" id="feedback"></textarea> <input name="include_email" id="include_email" aria-label="Include my email address so I can be contacted" class="form-control mr-2" type="checkbox"> <label for="include_email" style="font-weight: normal">Include my email address so I can be contacted</label> </form></div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd"> <button data-close-dialog-id="feedback-dialog" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="code-search-feedback-form" data-action="click:qbsearch-input#submitFeedback" type="submit" data-view-component="true" class="btn-primary btn"> Submit feedback </button> </div> </dialog></dialog-helper> <custom-scopes data-target="qbsearch-input.customScopesManager"> <dialog-helper> <dialog data-target="custom-scopes.customScopesModalDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="custom-scopes-dialog" aria-modal="true" aria-labelledby="custom-scopes-dialog-title" aria-describedby="custom-scopes-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header Overlay-header--divided"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="custom-scopes-dialog-title"> Saved searches </h1> <h2 id="custom-scopes-dialog-description" class="Overlay-description">Use saved searches to filter your results more quickly</h2> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="custom-scopes-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="custom-scopes-dialog-title"> <div data-view-component="true" class="Overlay-body"> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <div hidden class="create-custom-scope-form" data-target="custom-scopes.createCustomScopeForm"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="custom-scopes-dialog-form" data-turbo="false" action="/search/custom_scopes" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="rYh3SemVUBVWF9ucLVWTirGEd95Y6RAzPooC1gvxIzAyjBWgyTgMWzG4zwn1hJCbyC3EbR2LuW/TcW18Luj8aA==" /> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField"> <div class="form-group"> <label for="custom_scope_name">Name</label> <auto-check src="/search/custom_scopes/check_name" required only-validate-on-blur="false"> <input type="text" name="custom_scope_name" id="custom_scope_name" data-target="custom-scopes.customScopesNameField" class="form-control" autocomplete="off" placeholder="github-ruby" required maxlength="50"> <input type="hidden" data-csrf="true" value="qc2uHNVO2hdk91LMJT8a8P7Zr9iFTZwOjlAimOljVwiv1oMfmdsXUJyXvYVlUPDFmzus/U8N5mHHeFL2RENb3w==" /> </auto-check> </div> <div class="form-group"> <label for="custom_scope_query">Query</label> <input type="text" name="custom_scope_query" id="custom_scope_query" data-target="custom-scopes.customScopesQueryField" class="form-control" autocomplete="off" placeholder="(repo:mona/a OR repo:mona/b) AND lang:python" required maxlength="500"> </div> <p class="text-small color-fg-muted"> To see all available qualifiers, see our <a class="Link--inTextBlock" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax">documentation</a>. </p> </form> </div> <div data-target="custom-scopes.manageCustomScopesForm"> <div data-target="custom-scopes.list"></div> </div> </div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd Overlay-footer--divided"> <button data-action="click:custom-scopes#customScopesCancel" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="custom-scopes-dialog-form" data-action="click:custom-scopes#customScopesSubmit" data-target="custom-scopes.customScopesSubmitButton" type="submit" data-view-component="true" class="btn-primary btn"> Create saved search </button> </div> </dialog></dialog-helper> </custom-scopes> </div> </qbsearch-input> <div class="position-relative HeaderMenu-link-wrap d-lg-inline-block"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2Fxmartlabs%2FEureka" class="HeaderMenu-link HeaderMenu-link--sign-in HeaderMenu-button flex-shrink-0 no-underline d-none d-lg-inline-flex border border-lg-0 rounded rounded-lg-0 px-2 py-1" style="margin-left: 12px;" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/xmartlabs/Eureka","user_id":null}}" data-hydro-click-hmac="643b2143fe22bc4efd473dc1a9827055fb8dae34e62fe3a106c9d88bdcd34ec1" data-analytics-event="{"category":"Marketing nav","action":"click to go to homepage","label":"ref_page:Marketing;ref_cta:Sign in;ref_loc:Header"}" > Sign in </a> </div> <a href="/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E&source=header-repo&source_repo=xmartlabs%2FEureka" class="HeaderMenu-link HeaderMenu-link--sign-up HeaderMenu-button flex-shrink-0 d-flex d-lg-inline-flex no-underline border color-border-default rounded px-2 py-1" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/xmartlabs/Eureka","user_id":null}}" data-hydro-click-hmac="643b2143fe22bc4efd473dc1a9827055fb8dae34e62fe3a106c9d88bdcd34ec1" data-analytics-event="{"category":"Sign up","action":"click to sign up for account","label":"ref_page:/<user-name>/<repo-name>;ref_cta:Sign up;ref_loc:header logged out"}" > Sign up </a> <button type="button" class="sr-only js-header-menu-focus-trap d-block d-lg-none">Reseting focus</button> </div> </div> </div> </div> </header> <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <button id="icon-button-341f50c0-8a0b-4efb-9ad2-be225ce89237" aria-labelledby="tooltip-210ab0da-4efe-40c9-8b8e-2cedd7bc82ac" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button><tool-tip id="tooltip-210ab0da-4efe-40c9-8b8e-2cedd7bc82ac" for="icon-button-341f50c0-8a0b-4efb-9ad2-be225ce89237" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip> </div> </div> <div id="start-of-content" class="show-on-focus"></div> <div id="js-flash-container" class="flash-container" data-turbo-replace> <template class="js-flash-template"> <div class="flash flash-full {{ className }}"> <div > <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div aria-atomic="true" role="alert" class="js-flash-alert"> <div>{{ message }}</div> </div> </div> </div> </template> </div> <div class="application-main " data-commit-hovercards-enabled data-discussion-hovercards-enabled data-issue-and-pr-hovercards-enabled data-project-hovercards-enabled > <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class=""> <main id="js-repo-pjax-container" > <div id="repository-container-header" class="pt-3 hide-full-screen" style="background-color: var(--page-header-bgColor, var(--color-page-header-bg));" data-turbo-replace> <div class="d-flex flex-nowrap flex-justify-end mb-3 px-3 px-lg-5" style="gap: 1rem;"> <div class="flex-auto min-width-0 width-fit"> <div class=" d-flex flex-wrap flex-items-center wb-break-word f3 text-normal"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo color-fg-muted mr-2"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> <span class="author flex-self-stretch" itemprop="author"> <a class="url fn" rel="author" data-hovercard-type="organization" data-hovercard-url="/orgs/xmartlabs/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/xmartlabs"> xmartlabs </a> </span> <span class="mx-1 flex-self-stretch color-fg-muted">/</span> <strong itemprop="name" class="mr-2 flex-self-stretch"> <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/xmartlabs/Eureka">Eureka</a> </strong> <span></span><span class="Label Label--secondary v-align-middle mr-1">Public</span> </div> </div> <div id="repository-details-container" class="flex-shrink-0" data-turbo-replace style="max-width: 70%;"> <ul class="pagehead-actions flex-shrink-0 d-none d-md-inline" style="padding: 2px 0;"> <li> <include-fragment src="/xmartlabs/Eureka/sponsor_button"></include-fragment> </li> <li> <a href="/login?return_to=%2Fxmartlabs%2FEureka" rel="nofollow" id="repository-details-watch-button" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://github.com/xmartlabs/Eureka","user_id":null}}" data-hydro-click-hmac="f83a8a19fa15d15a43610703e5e2e04d069aae164a8868bc6f4cb9053e632776" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-05ec218c-4d57-4cb7-a509-4e068fefeb1c" for="repository-details-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </li> <li> <a icon="repo-forked" id="fork-button" href="/login?return_to=%2Fxmartlabs%2FEureka" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"repo details fork button","repository_id":43330374,"auth_type":"LOG_IN","originating_url":"https://github.com/xmartlabs/Eureka","user_id":null}}" data-hydro-click-hmac="0c41acf0cf119afee346971b39b90451aa074bd029112923d904bcd813e93391" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg>Fork <span id="repo-network-counter" data-pjax-replace="true" data-turbo-replace="true" title="1,323" data-view-component="true" class="Counter">1.3k</span> </a> </li> <li> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2Fxmartlabs%2FEureka" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"star button","repository_id":43330374,"auth_type":"LOG_IN","originating_url":"https://github.com/xmartlabs/Eureka","user_id":null}}" data-hydro-click-hmac="fb91499c1573519d58e3cde5f1bd2259d59da02f2027f06b621d47d7f709d12b" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> <span id="repo-stars-counter-star" aria-label="11825 users starred this repository" data-singular-suffix="user starred this repository" data-plural-suffix="users starred this repository" data-turbo-replace="true" title="11,825" data-view-component="true" class="Counter js-social-count">11.8k</span> </a></div> </li> </ul> </div> </div> <div id="responsive-meta-container" data-turbo-replace> <div class="d-block d-md-none mb-2 px-3 px-md-4 px-lg-5"> <p class="f4 mb-3 "> Elegant iOS form builder in Swift </p> <div class="mb-2 d-flex flex-items-center Link--secondary"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link flex-shrink-0 mr-2"> <path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path> </svg> <span class="flex-auto min-width-0 css-truncate css-truncate-target width-fit"> <a title="https://eurekacommunity.github.io" role="link" target="_blank" class="text-bold" rel="noopener noreferrer" href="https://eurekacommunity.github.io">eurekacommunity.github.io</a> </span> </div> <h3 class="sr-only">License</h3> <div class="mb-2"> <a href="/xmartlabs/Eureka/blob/master/LICENSE" class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:license"}" > <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-law mr-2"> <path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path> </svg> MIT license </a> </div> <div class="mb-3"> <a class="Link--secondary no-underline mr-3" href="/xmartlabs/Eureka/stargazers"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star mr-1"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg> <span class="text-bold">11.8k</span> stars </a> <a class="Link--secondary no-underline mr-3" href="/xmartlabs/Eureka/forks"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-1"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg> <span class="text-bold">1.3k</span> forks </a> <a class="Link--secondary no-underline mr-3 d-inline-block" href="/xmartlabs/Eureka/branches"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-branch mr-1"> <path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path> </svg> <span>Branches</span> </a> <a class="Link--secondary no-underline d-inline-block" href="/xmartlabs/Eureka/tags"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-tag mr-1"> <path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path> </svg> <span>Tags</span> </a> <a class="Link--secondary no-underline d-inline-block" href="/xmartlabs/Eureka/activity"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pulse mr-1"> <path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"></path> </svg> <span>Activity</span> </a> </div> <div class="d-flex flex-wrap gap-2"> <div class="flex-1"> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2Fxmartlabs%2FEureka" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"star button","repository_id":43330374,"auth_type":"LOG_IN","originating_url":"https://github.com/xmartlabs/Eureka","user_id":null}}" data-hydro-click-hmac="fb91499c1573519d58e3cde5f1bd2259d59da02f2027f06b621d47d7f709d12b" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> </a></div> </div> <div class="flex-1"> <a href="/login?return_to=%2Fxmartlabs%2FEureka" rel="nofollow" id="files-overview-watch-button" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://github.com/xmartlabs/Eureka","user_id":null}}" data-hydro-click-hmac="f83a8a19fa15d15a43610703e5e2e04d069aae164a8868bc6f4cb9053e632776" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-149742cb-e75f-42f7-b3f4-b86ef906ef36" for="files-overview-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </div> <span> </span> </div> </div> </div> <nav data-pjax="#js-repo-pjax-container" aria-label="Repository" data-view-component="true" class="js-repo-nav js-sidenav-container-pjax js-responsive-underlinenav overflow-hidden UnderlineNav px-3 px-md-4 px-lg-5"> <ul data-view-component="true" class="UnderlineNav-body list-style-none"> <li data-view-component="true" class="d-inline-flex"> <a id="code-tab" href="/xmartlabs/Eureka" data-tab-item="i0code-tab" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages repo_deployments repo_attestations /xmartlabs/Eureka" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g c" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Code","target":"UNDERLINE_NAV.TAB"}" aria-current="page" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item selected"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon d-none d-sm-inline"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> <span data-content="Code">Code</span> <span id="code-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="issues-tab" href="/xmartlabs/Eureka/issues" data-tab-item="i1issues-tab" data-selected-links="repo_issues repo_labels repo_milestones /xmartlabs/Eureka/issues" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g i" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Issues","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> <span data-content="Issues">Issues</span> <span id="issues-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="162" data-view-component="true" class="Counter">162</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="pull-requests-tab" href="/xmartlabs/Eureka/pulls" data-tab-item="i2pull-requests-tab" data-selected-links="repo_pulls checks /xmartlabs/Eureka/pulls" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g p" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Pull requests","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> <span data-content="Pull requests">Pull requests</span> <span id="pull-requests-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="15" data-view-component="true" class="Counter">15</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="discussions-tab" href="/xmartlabs/Eureka/discussions" data-tab-item="i3discussions-tab" data-selected-links="repo_discussions /xmartlabs/Eureka/discussions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g g" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Discussions","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path> </svg> <span data-content="Discussions">Discussions</span> <span id="discussions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="actions-tab" href="/xmartlabs/Eureka/actions" data-tab-item="i4actions-tab" data-selected-links="repo_actions /xmartlabs/Eureka/actions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g a" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Actions","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> <span data-content="Actions">Actions</span> <span id="actions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="projects-tab" href="/xmartlabs/Eureka/projects" data-tab-item="i5projects-tab" data-selected-links="repo_projects new_repo_project repo_project /xmartlabs/Eureka/projects" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g b" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Projects","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table UnderlineNav-octicon d-none d-sm-inline"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path> </svg> <span data-content="Projects">Projects</span> <span id="projects-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="wiki-tab" href="/xmartlabs/Eureka/wiki" data-tab-item="i6wiki-tab" data-selected-links="repo_wiki /xmartlabs/Eureka/wiki" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g w" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Wiki","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book UnderlineNav-octicon d-none d-sm-inline"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> <span data-content="Wiki">Wiki</span> <span id="wiki-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="security-tab" href="/xmartlabs/Eureka/security" data-tab-item="i7security-tab" data-selected-links="security overview alerts policy token_scanning code_scanning /xmartlabs/Eureka/security" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g s" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Security","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield UnderlineNav-octicon d-none d-sm-inline"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span data-content="Security">Security</span> <include-fragment src="/xmartlabs/Eureka/security/overall-count" accept="text/fragment+html"></include-fragment> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="insights-tab" href="/xmartlabs/Eureka/pulse" data-tab-item="i8insights-tab" data-selected-links="repo_graphs repo_contributors dependency_graph dependabot_updates pulse people community /xmartlabs/Eureka/pulse" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Insights","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> <span data-content="Insights">Insights</span> <span id="insights-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> </ul> <div style="visibility:hidden;" data-view-component="true" class="UnderlineNav-actions js-responsive-underlinenav-overflow position-absolute pr-3 pr-md-4 pr-lg-5 right-0"> <action-menu data-select-variant="none" data-view-component="true"> <focus-group direction="vertical" mnemonics retain> <button id="action-menu-984490a6-340a-4e70-9a7a-5ba1d51ccedf-button" popovertarget="action-menu-984490a6-340a-4e70-9a7a-5ba1d51ccedf-overlay" aria-controls="action-menu-984490a6-340a-4e70-9a7a-5ba1d51ccedf-list" aria-haspopup="true" aria-labelledby="tooltip-e9aafefe-394f-440e-92aa-ef6b36fcd823" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--medium UnderlineNav-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal Button-visual"> <path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path> </svg> </button><tool-tip id="tooltip-e9aafefe-394f-440e-92aa-ef6b36fcd823" for="action-menu-984490a6-340a-4e70-9a7a-5ba1d51ccedf-button" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Additional navigation options</tool-tip> <anchored-position data-target="action-menu.overlay" id="action-menu-984490a6-340a-4e70-9a7a-5ba1d51ccedf-overlay" anchor="action-menu-984490a6-340a-4e70-9a7a-5ba1d51ccedf-button" align="start" side="outside-bottom" anchor-offset="normal" popover="auto" data-view-component="true"> <div data-view-component="true" class="Overlay Overlay--size-auto"> <div data-view-component="true" class="Overlay-body Overlay-body--paddingNone"> <action-list> <div data-view-component="true"> <ul aria-labelledby="action-menu-984490a6-340a-4e70-9a7a-5ba1d51ccedf-button" id="action-menu-984490a6-340a-4e70-9a7a-5ba1d51ccedf-list" role="menu" data-view-component="true" class="ActionListWrap--inset ActionListWrap"> <li hidden="hidden" data-menu-item="i0code-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-6feb3884-e565-450b-8ddf-27b5fffb90a2" href="/xmartlabs/Eureka" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Code </span> </a> </li> <li hidden="hidden" data-menu-item="i1issues-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-fccf1892-cfce-4598-ade3-891ebfe858fa" href="/xmartlabs/Eureka/issues" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Issues </span> </a> </li> <li hidden="hidden" data-menu-item="i2pull-requests-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-4799a428-dde6-4149-914b-dfe580b605a0" href="/xmartlabs/Eureka/pulls" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Pull requests </span> </a> </li> <li hidden="hidden" data-menu-item="i3discussions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-7971bc03-f55f-4e3f-bada-7ce92fdb7c10" href="/xmartlabs/Eureka/discussions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion"> <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Discussions </span> </a> </li> <li hidden="hidden" data-menu-item="i4actions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-796eb6d2-67cd-48cc-8b37-4cff4f927dbd" href="/xmartlabs/Eureka/actions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Actions </span> </a> </li> <li hidden="hidden" data-menu-item="i5projects-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-cc36f581-b5f0-4c46-a0b6-162f77dcaa50" href="/xmartlabs/Eureka/projects" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Projects </span> </a> </li> <li hidden="hidden" data-menu-item="i6wiki-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-88c7a206-f6d2-4d16-8010-8b06685bcaca" href="/xmartlabs/Eureka/wiki" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Wiki </span> </a> </li> <li hidden="hidden" data-menu-item="i7security-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-1163f871-38de-48ac-8401-73ef069a8d56" href="/xmartlabs/Eureka/security" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Security </span> </a> </li> <li hidden="hidden" data-menu-item="i8insights-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-de0744d2-c1c5-4ede-9bbd-6e244e778ced" href="/xmartlabs/Eureka/pulse" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Insights </span> </a> </li> </ul> </div></action-list> </div> </div></anchored-position> </focus-group> </action-menu></div> </nav> </div> <turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class=""> <div id="repo-content-pjax-container" class="repository-content " > <h1 class='sr-only'>xmartlabs/Eureka</h1> <div class="clearfix container-xl px-md-4 px-lg-5 px-3"> <div> <div style="max-width: 100%" data-view-component="true" class="Layout Layout--flowRow-until-md react-repos-overview-margin Layout--sidebarPosition-end Layout--sidebarPosition-flowRow-end"> <div data-view-component="true" class="Layout-main"> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_dompurify_dist_purify_es_mjs-dd1d3ea6a436.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryObserver_js-node_modules_tanstack_-defd52-843b41414e0e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_aria-live_aria-live_ts-ui_packages_promise-with-resolvers-polyfill_promise-with-r-17c672-34345cb18aac.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_paths_index_ts-e019c54eb886.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ref-selector_RefSelector_tsx-7496afc3784d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_commit-attribution_index_ts-ui_packages_commit-checks-status_index_ts-ui_packages-7094d4-15017f02e61c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_hooks_shortcuts_ts-ui_packages_code-view-shared_utilities_styles-0dc246-f8753c5db08d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_hooks_use-canonical-object_ts-ui_packages_code-view-shared_hooks-a83ec0-5ee2b562b57f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repos-overview-ca785c0ab4fa.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.f9eaf3e098aa7865fd95.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repos-overview.0ee7cac3ab511a65d9f9.module.css" /> <react-partial partial-name="repos-overview" data-ssr="true" data-attempted-ssr="true" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"initialPayload":{"allShortcutsEnabled":false,"path":"/","repo":{"id":43330374,"defaultBranch":"master","name":"Eureka","ownerLogin":"xmartlabs","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2015-09-28T22:20:53.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/2227731?v=4","public":true,"private":false,"isOrgOwned":true},"currentUser":null,"refInfo":{"name":"master","listCacheKey":"v0:1726160643.0","canEdit":false,"refType":"branch","currentOid":"028ef8e3191a256b8f6b8bb6b9496efcb0762dbc"},"tree":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"Documentation","path":"Documentation","contentType":"directory"},{"name":"Eureka.playground","path":"Eureka.playground","contentType":"directory"},{"name":"Eureka.xcodeproj","path":"Eureka.xcodeproj","contentType":"directory"},{"name":"Eureka.xcworkspace","path":"Eureka.xcworkspace","contentType":"directory"},{"name":"Example.xcodeproj","path":"Example.xcodeproj","contentType":"directory"},{"name":"Example","path":"Example","contentType":"directory"},{"name":"Source","path":"Source","contentType":"directory"},{"name":"Tests","path":"Tests","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"CHANGELOG.md","path":"CHANGELOG.md","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"Eureka.png","path":"Eureka.png","contentType":"file"},{"name":"Eureka.podspec","path":"Eureka.podspec","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"Package.swift","path":"Package.swift","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"donate.png","path":"donate.png","contentType":"file"}],"templateDirectorySuggestionUrl":null,"readme":null,"totalCount":18,"showBranchInfobar":false},"fileTree":null,"fileTreeProcessingTime":null,"foldersToFetch":[],"treeExpanded":false,"symbolsExpanded":false,"isOverview":true,"overview":{"banners":{"shouldRecommendReadme":false,"isPersonalRepo":false,"showUseActionBanner":false,"actionSlug":null,"actionId":null,"showProtectBranchBanner":false,"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_repo","releasePath":"/xmartlabs/Eureka/releases/new?marketplace=true","showPublishActionBanner":false},"interactionLimitBanner":null,"showInvitationBanner":false,"inviterName":null,"actionsMigrationBannerInfo":{"releaseTags":[],"showImmutableActionsMigrationBanner":false,"initialMigrationStatus":null}},"codeButton":{"contactPath":"/contact","isEnterprise":false,"local":{"protocolInfo":{"httpAvailable":true,"sshAvailable":null,"httpUrl":"https://github.com/xmartlabs/Eureka.git","showCloneWarning":null,"sshUrl":null,"sshCertificatesRequired":null,"sshCertificatesAvailable":null,"ghCliUrl":"gh repo clone xmartlabs/Eureka","defaultProtocol":"http","newSshKeyUrl":"/settings/ssh/new","setProtocolPath":"/users/set_protocol"},"platformInfo":{"cloneUrl":"https://desktop.github.com","showVisualStudioCloneButton":false,"visualStudioCloneUrl":"https://windows.github.com","showXcodeCloneButton":false,"xcodeCloneUrl":"xcode://clone?repo=https%3A%2F%2Fgithub.com%2Fxmartlabs%2FEureka","zipballUrl":"/xmartlabs/Eureka/archive/refs/heads/master.zip"}},"newCodespacePath":"/codespaces/new?hide_repo_select=true\u0026repo=43330374"},"popovers":{"rename":null,"renamedParentRepo":null},"commitCount":"918","overviewFiles":[{"displayName":"README.md","repoName":"Eureka","refName":"master","path":"README.md","preferredFileType":"readme","tabName":"README","richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Eureka.png\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Eureka.png\" alt=\"Eureka: Elegant form builder in Swift\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n\u003ca href=\"https://travis-ci.org/xmartlabs/Eureka\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/0eb322fd379e0e25c9d7302849b654e6e659acdf7c975229cbf4987c1da54ea4/68747470733a2f2f7472617669732d63692e6f72672f786d6172746c6162732f457572656b612e7376673f6272616e63683d6d6173746572\" alt=\"Build status\" data-canonical-src=\"https://travis-ci.org/xmartlabs/Eureka.svg?branch=master\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/655f5ca0fa2783d9237997730cad4d0bbd935f0e66580583e7d2a0c41d768ce0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d694f532d626c75652e7376673f7374796c653d666c6174\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/655f5ca0fa2783d9237997730cad4d0bbd935f0e66580583e7d2a0c41d768ce0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d694f532d626c75652e7376673f7374796c653d666c6174\" alt=\"Platform iOS\" data-canonical-src=\"https://img.shields.io/badge/platform-iOS-blue.svg?style=flat\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://developer.apple.com/swift\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/7db9d3740915bb60719b25d791b2aa35d2700396655644f7cfc36724ec9d515a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7377696674352d636f6d70617469626c652d3442433531442e7376673f7374796c653d666c6174\" alt=\"Swift 5 compatible\" data-canonical-src=\"https://img.shields.io/badge/swift5-compatible-4BC51D.svg?style=flat\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Carthage/Carthage\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/5cb89494518efc818a124fd801726287be9482423d1a161a6dec2066aa0f30db/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f43617274686167652d636f6d70617469626c652d3442433531442e7376673f7374796c653d666c6174\" alt=\"Carthage compatible\" data-canonical-src=\"https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://cocoapods.org/pods/Eureka\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/f266a4687695a4f0d1b7359950cd52dc01299aeb2bdc1a7a646941af268ce304/68747470733a2f2f696d672e736869656c64732e696f2f636f636f61706f64732f762f457572656b612e737667\" alt=\"CocoaPods compatible\" data-canonical-src=\"https://img.shields.io/cocoapods/v/Eureka.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://raw.githubusercontent.com/xmartlabs/Eureka/master/LICENSE\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/95c10fa6088c05deb9bdfe215245185f6f8262c17e68b55188cfcf7c3ce03c52/687474703a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e7376673f7374796c653d666c6174\" alt=\"License: MIT\" data-canonical-src=\"http://img.shields.io/badge/license-MIT-blue.svg?style=flat\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://codebeat.co/projects/github-com-xmartlabs-eureka\" rel=\"nofollow\"\u003e\u003cimg alt=\"codebeat badge\" src=\"https://camo.githubusercontent.com/6ee41ba9346b816db6e6cb52c3b6b1bd76312efa336aed43603511ba2b0f5002/68747470733a2f2f636f6465626561742e636f2f6261646765732f31366632396166622d663037322d343633332d393439372d333333633665623731323633\" data-canonical-src=\"https://codebeat.co/badges/16f29afb-f072-4633-9497-333c6eb71263\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eMade with ❤️ by \u003ca href=\"http://xmartlabs.com\" rel=\"nofollow\"\u003eXMARTLABS\u003c/a\u003e. This is the re-creation of \u003ca href=\"https://github.com/xmartlabs/XLForm\"\u003eXLForm\u003c/a\u003e in Swift.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"/xmartlabs/Eureka/blob/master/Documentation/README_CN.md\"\u003e简体中文\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOverview\u003c/h2\u003e\u003ca id=\"user-content-overview\" class=\"anchor\" aria-label=\"Permalink: Overview\" href=\"#overview\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n \u003ctbody\u003e\u003ctr\u003e\n \u003cth\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/EurekaExample1.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/EurekaExample1.gif\" width=\"220\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003c/th\u003e\n \u003cth\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/EurekaExample2.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/EurekaExample2.gif\" width=\"220\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003c/th\u003e\n \u003cth\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/EurekaExample3.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/EurekaExample3.gif\" width=\"220\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003c/th\u003e\n \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContents\u003c/h2\u003e\u003ca id=\"user-content-contents\" class=\"anchor\" aria-label=\"Permalink: Contents\" href=\"#contents\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#requirements\"\u003eRequirements\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#how-to-create-a-form\"\u003eHow to create a Form\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#getting-row-values\"\u003eGetting row values\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#operators\"\u003eOperators\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#using-the-callbacks\"\u003eUsing the callbacks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#section-header-and-footer\"\u003eSection Header and Footer\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hide-show-rows\"\u003eDynamically hide and show rows (or sections)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#list-sections\"\u003eList sections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#multivalued-sections\"\u003eMultivalued sections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#validations\"\u003eValidations\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#swipe-actions\"\u003eSwipe Actions\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#custom-rows\"\u003eCustom rows\u003c/a\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"#basic-custom-rows\"\u003eBasic custom rows\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#custom-inline-rows\"\u003eCustom inline rows\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#custom-presenter-rows\"\u003eCustom presenter rows\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#row-catalog\"\u003eRow catalog\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#faq\"\u003eFAQ\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eFor more information look at \u003ca href=\"http://blog.xmartlabs.com/2015/09/29/Introducing-Eureka-iOS-form-library-written-in-pure-Swift/\" rel=\"nofollow\"\u003eour blog post\u003c/a\u003e that introduces \u003cem\u003eEureka\u003c/em\u003e.\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRequirements (for latest release)\u003c/h2\u003e\u003ca id=\"user-content-requirements-for-latest-release\" class=\"anchor\" aria-label=\"Permalink: Requirements (for latest release)\" href=\"#requirements-for-latest-release\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eXcode 11+\u003c/li\u003e\n\u003cli\u003eSwift 5.0+\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eExample project\u003c/h3\u003e\u003ca id=\"user-content-example-project\" class=\"anchor\" aria-label=\"Permalink: Example project\" href=\"#example-project\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can clone and run the Example project to see examples of most of Eureka's features.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n \u003ctbody\u003e\u003ctr\u003e\n \u003cth\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/EurekaNavigation.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/EurekaNavigation.gif\" width=\"200\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003c/th\u003e\n \u003cth\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/EurekaRows.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/EurekaRows.gif\" width=\"200\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003c/th\u003e\n \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUsage\u003c/h2\u003e\u003ca id=\"user-content-usage\" class=\"anchor\" aria-label=\"Permalink: Usage\" href=\"#usage\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow to create a form\u003c/h3\u003e\u003ca id=\"user-content-how-to-create-a-form\" class=\"anchor\" aria-label=\"Permalink: How to create a form\" href=\"#how-to-create-a-form\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBy extending \u003ccode\u003eFormViewController\u003c/code\u003e you can then simply add sections and rows to the \u003ccode\u003eform\u003c/code\u003e variable.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"import Eureka\n\nclass MyFormViewController: FormViewController {\n\n override func viewDidLoad() {\n super.viewDidLoad()\n form +++ Section(\u0026quot;Section1\u0026quot;)\n \u0026lt;\u0026lt;\u0026lt; TextRow(){ row in\n row.title = \u0026quot;Text Row\u0026quot;\n row.placeholder = \u0026quot;Enter text here\u0026quot;\n }\n \u0026lt;\u0026lt;\u0026lt; PhoneRow(){\n $0.title = \u0026quot;Phone Row\u0026quot;\n $0.placeholder = \u0026quot;And numbers here\u0026quot;\n }\n +++ Section(\u0026quot;Section2\u0026quot;)\n \u0026lt;\u0026lt;\u0026lt; DateRow(){\n $0.title = \u0026quot;Date Row\u0026quot;\n $0.value = Date(timeIntervalSinceReferenceDate: 0)\n }\n }\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eimport\u003c/span\u003e Eureka\n\n\u003cspan class=\"pl-k\"\u003eclass\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eMyFormViewController\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eFormViewController\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003eoverride\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e viewDidLoad\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n super\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eviewDidLoad\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n form \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eSection1\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eTextRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e row \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n row\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eText Row\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n row\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eplaceholder \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eEnter text here\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003ePhoneRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ePhone Row\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eplaceholder \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eAnd numbers here\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eSection2\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eDateRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eDate Row\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalue \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eDate\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etimeIntervalSinceReferenceDate\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIn the example we create two sections with standard rows, the result is this:\u003c/p\u003e\n\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/EurekaHowTo.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/EurekaHowTo.gif\" width=\"200\" alt=\"Screenshot of Custom Cells\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\n\u003cp dir=\"auto\"\u003eYou could create a form by just setting up the \u003ccode\u003eform\u003c/code\u003e property by yourself without extending from \u003ccode\u003eFormViewController\u003c/code\u003e but this method is typically more convenient.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eConfiguring the keyboard navigation accesory\u003c/h4\u003e\u003ca id=\"user-content-configuring-the-keyboard-navigation-accesory\" class=\"anchor\" aria-label=\"Permalink: Configuring the keyboard navigation accesory\" href=\"#configuring-the-keyboard-navigation-accesory\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo change the behaviour of this you should set the navigation options of your controller. The \u003ccode\u003eFormViewController\u003c/code\u003e has a \u003ccode\u003enavigationOptions\u003c/code\u003e variable which is an enum and can have one or more of the following values:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003edisabled\u003c/strong\u003e: no view at all\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eenabled\u003c/strong\u003e: enable view at the bottom\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003estopDisabledRow\u003c/strong\u003e: if the navigation should stop when the next row is disabled\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eskipCanNotBecomeFirstResponderRow\u003c/strong\u003e: if the navigation should skip the rows that return false to \u003ccode\u003ecanBecomeFirstResponder()\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe default value is \u003ccode\u003eenabled \u0026amp; skipCanNotBecomeFirstResponderRow\u003c/code\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo enable smooth scrolling to off-screen rows, enable it via the \u003ccode\u003eanimateScroll\u003c/code\u003e property. By default, the \u003ccode\u003eFormViewController\u003c/code\u003e jumps immediately between rows when the user hits the next or previous buttons in the keyboard navigation accesory, including when the next row is off screen.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo set the amount of space between the keyboard and the highlighted row following a navigation event, set the \u003ccode\u003erowKeyboardSpacing\u003c/code\u003e property. By default, when the form scrolls to an offscreen view no space will be left between the top of the keyboard and the bottom of the row.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"class MyFormViewController: FormViewController {\n\n override func viewDidLoad() {\n super.viewDidLoad()\n form = ...\n\n\t// Enables the navigation accessory and stops navigation when a disabled row is encountered\n\tnavigationOptions = RowNavigationOptions.Enabled.union(.StopDisabledRow)\n\t// Enables smooth scrolling on navigation to off-screen rows\n\tanimateScroll = true\n\t// Leaves 20pt of space between the keyboard and the highlighted row after scrolling to an off screen row\n\trowKeyboardSpacing = 20\n }\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eclass\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eMyFormViewController\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eFormViewController\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003eoverride\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e viewDidLoad\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n super\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eviewDidLoad\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n form \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e...\u003c/span\u003e\n\n\t// Enables the navigation accessory and stops navigation when a disabled row is encountered\n\tnavigationOptions \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRowNavigationOptions\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eEnabled\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eunion\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eStopDisabledRow\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\t// Enables smooth scrolling on navigation to off-screen rows\n\tanimateScroll \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e\n\t// Leaves 20pt of space between the keyboard and the highlighted row after scrolling to an off screen row\n\trowKeyboardSpacing \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e20\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you want to change the whole navigation accessory view, you will have to override the \u003ccode\u003enavigationAccessoryView\u003c/code\u003e variable in your subclass of \u003ccode\u003eFormViewController\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eGetting row values\u003c/h3\u003e\u003ca id=\"user-content-getting-row-values\" class=\"anchor\" aria-label=\"Permalink: Getting row values\" href=\"#getting-row-values\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003eRow\u003c/code\u003e object holds a \u003cem\u003e\u003cstrong\u003evalue\u003c/strong\u003e\u003c/em\u003e of a specific type.\nFor example, a \u003ccode\u003eSwitchRow\u003c/code\u003e holds a \u003ccode\u003eBool\u003c/code\u003e value, while a \u003ccode\u003eTextRow\u003c/code\u003e holds a \u003ccode\u003eString\u003c/code\u003e value.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Get the value of a single row\nlet row: TextRow? = form.rowBy(tag: \u0026quot;MyRowTag\u0026quot;)\nlet value = row.value\n\n// Get the value of all rows which have a Tag assigned\n// The dictionary contains the 'rowTag':value pairs.\nlet valuesDictionary = form.values()\"\u003e\u003cpre\u003e// Get the value of a single row\n\u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eTextRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e form\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003erowBy\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eMyRowTag\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evalue\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e row\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalue\n\n// Get the value of all rows which have a Tag assigned\n// The dictionary contains the 'rowTag':value pairs.\n\u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003evaluesDictionary\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e form\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003evalues\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOperators\u003c/h3\u003e\u003ca id=\"user-content-operators\" class=\"anchor\" aria-label=\"Permalink: Operators\" href=\"#operators\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eEureka includes custom operators to make form creation easy:\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e+++ Add a section\u003c/h4\u003e\u003ca id=\"user-content--add-a-section\" class=\"anchor\" aria-label=\"Permalink: +++ Add a section\" href=\"#-add-a-section\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"form +++ Section()\n\n// Chain it to add multiple Sections\nform +++ Section(\u0026quot;First Section\u0026quot;) +++ Section(\u0026quot;Another Section\u0026quot;)\n\n// Or use it with rows and get a blank section for free\nform +++ TextRow()\n +++ TextRow() // Each row will be on a separate section\"\u003e\u003cpre\u003eform \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n// Chain it to add multiple Sections\nform \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eFirst Section\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eAnother Section\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n// Or use it with rows and get a blank section for free\nform \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eTextRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eTextRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e // Each row will be on a separate section\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u0026lt;\u0026lt;\u0026lt; Insert a row\u003c/h4\u003e\u003ca id=\"user-content--insert-a-row\" class=\"anchor\" aria-label=\"Permalink: \u0026lt;\u0026lt;\u0026lt; Insert a row\" href=\"#-insert-a-row\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"form +++ Section()\n \u0026lt;\u0026lt;\u0026lt; TextRow()\n \u0026lt;\u0026lt;\u0026lt; DateRow()\n\n// Or implicitly create the Section\nform +++ TextRow()\n \u0026lt;\u0026lt;\u0026lt; DateRow()\"\u003e\u003cpre\u003eform \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eTextRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eDateRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n// Or implicitly create the Section\nform \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eTextRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eDateRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e+= Append an array\u003c/h4\u003e\u003ca id=\"user-content---append-an-array\" class=\"anchor\" aria-label=\"Permalink: += Append an array\" href=\"#--append-an-array\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Append Sections into a Form\nform += [Section(\u0026quot;A\u0026quot;), Section(\u0026quot;B\u0026quot;), Section(\u0026quot;C\u0026quot;)]\n\n// Append Rows into a Section\nsection += [TextRow(), DateRow()]\"\u003e\u003cpre\u003e// Append Sections into a Form\nform \u003cspan class=\"pl-c1\"\u003e+=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eA\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eB\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eC\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\n\n// Append Rows into a Section\nsection \u003cspan class=\"pl-c1\"\u003e+=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eTextRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eDateRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eResult builders\u003c/h3\u003e\u003ca id=\"user-content-result-builders\" class=\"anchor\" aria-label=\"Permalink: Result builders\" href=\"#result-builders\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eEureka includes result builders to make form creation easy:\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e@SectionBuilder\u003c/h4\u003e\u003ca id=\"user-content-sectionbuilder\" class=\"anchor\" aria-label=\"Permalink: @SectionBuilder\" href=\"#sectionbuilder\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Section + Section\nform = (Section(\u0026quot;A\u0026quot;) +++ {\n URLRow(\u0026quot;UrlRow_f1\u0026quot;) { $0.title = \u0026quot;Url\u0026quot; }\n if something {\n TwitterRow(\u0026quot;TwitterRow_f2\u0026quot;) { $0.title = \u0026quot;Twitter\u0026quot; }\n } else {\n TwitterRow(\u0026quot;TwitterRow_f1\u0026quot;) { $0.title = \u0026quot;Twitter\u0026quot; }\n }\n AccountRow(\u0026quot;AccountRow_f1\u0026quot;) { $0.title = \u0026quot;Account\u0026quot; }\n})\n\n// Form + Section\nform +++ {\n if something {\n PhoneRow(\u0026quot;PhoneRow_f1\u0026quot;) { $0.title = \u0026quot;Phone\u0026quot; }\n } else {\n PhoneRow(\u0026quot;PhoneRow_f2\u0026quot;) { $0.title = \u0026quot;Phone\u0026quot; }\n }\n PasswordRow(\u0026quot;PasswordRow_f1\u0026quot;) { $0.title = \u0026quot;Password\u0026quot; }\n}\"\u003e\u003cpre\u003e// Section + Section\nform \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eA\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003eURLRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eUrlRow_f1\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eUrl\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e something \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003eTwitterRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eTwitterRow_f2\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eTwitter\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eelse\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003eTwitterRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eTwitterRow_f1\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eTwitter\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003eAccountRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eAccountRow_f1\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eAccount\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n// Form + Section\nform \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e something \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003ePhoneRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ePhoneRow_f1\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ePhone\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eelse\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003ePhoneRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ePhoneRow_f2\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ePhone\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003ePasswordRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ePasswordRow_f1\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ePassword\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e@FormBuilder\u003c/h4\u003e\u003ca id=\"user-content-formbuilder\" class=\"anchor\" aria-label=\"Permalink: @FormBuilder\" href=\"#formbuilder\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"@FormBuilder\nvar form: Form {\n Section(\u0026quot;Section A\u0026quot;) { section in\n section.tag = \u0026quot;Section_A\u0026quot;\n }\n if true {\n Section(\u0026quot;Section B\u0026quot;) { section in\n section.tag = \u0026quot;Section_B\u0026quot;\n }\n }\n NameRow(\u0026quot;NameRow_f1\u0026quot;) { $0.title = \u0026quot;Name\u0026quot; }\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-s1\"\u003e@\u003cspan class=\"pl-smi\"\u003eFormBuilder\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eform\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eForm\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eSection A\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e section \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n section\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etag \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eSection_A\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eSection B\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e section \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n section\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etag \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eSection_B\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003eNameRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eNameRow_f1\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eName\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUsing the callbacks\u003c/h3\u003e\u003ca id=\"user-content-using-the-callbacks\" class=\"anchor\" aria-label=\"Permalink: Using the callbacks\" href=\"#using-the-callbacks\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eEureka includes callbacks to change the appearance and behavior of a row.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUnderstanding Row and Cell\u003c/h4\u003e\u003ca id=\"user-content-understanding-row-and-cell\" class=\"anchor\" aria-label=\"Permalink: Understanding Row and Cell\" href=\"#understanding-row-and-cell\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eA \u003ccode\u003eRow\u003c/code\u003e is an abstraction Eureka uses which holds a \u003cstrong\u003evalue\u003c/strong\u003e and contains the view \u003ccode\u003eCell\u003c/code\u003e. The \u003ccode\u003eCell\u003c/code\u003e manages the view and subclasses \u003ccode\u003eUITableViewCell\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eHere is an example:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"let row = SwitchRow(\u0026quot;SwitchRow\u0026quot;) { row in // initializer\n row.title = \u0026quot;The title\u0026quot;\n }.onChange { row in\n row.title = (row.value ?? false) ? \u0026quot;The title expands when on\u0026quot; : \u0026quot;The title\u0026quot;\n row.updateCell()\n }.cellSetup { cell, row in\n cell.backgroundColor = .lightGray\n }.cellUpdate { cell, row in\n cell.textLabel?.font = .italicSystemFont(ofSize: 18.0)\n }\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erow\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSwitchRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eSwitchRow\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e row \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e // initializer\n row\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eThe title\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eonChange\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e row \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n row\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003erow\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalue \u003cspan class=\"pl-c1\"\u003e??\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003efalse\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eThe title expands when on\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eThe title\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n row\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eupdateCell\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003ecellSetup\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e cell\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e row \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n cell\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ebackgroundColor \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003elightGray\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003ecellUpdate\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e cell\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e row \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n cell\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etextLabel\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003efont \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eitalicSystemFont\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eofSize\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e18.0\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/EurekaOnChange.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/EurekaOnChange.gif\" width=\"300\" alt=\"Screenshot of Disabled Row\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCallbacks list\u003c/h4\u003e\u003ca id=\"user-content-callbacks-list\" class=\"anchor\" aria-label=\"Permalink: Callbacks list\" href=\"#callbacks-list\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eonChange()\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCalled when the value of a row changes. You might be interested in adjusting some parameters here or even make some other rows appear or disappear.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eonCellSelection()\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCalled each time the user taps on the row and it gets selected. Note that this will also get called for disabled rows so you should start your code inside this callback with something like \u003ccode\u003eguard !row.isDisabled else { return }\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003ecellSetup()\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCalled only once when the cell is first configured. Set permanent settings here.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003ecellUpdate()\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCalled each time the cell appears on screen. You can change the appearance here using variables that may not be present on cellSetup().\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eonCellHighlightChanged()\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCalled whenever the cell or any subview become or resign the first responder.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eonRowValidationChanged()\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCalled whenever the the validation errors associated with a row changes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eonExpandInlineRow()\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCalled before expanding the inline row. Applies to rows conforming \u003ccode\u003eInlineRowType\u003c/code\u003e protocol.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eonCollapseInlineRow()\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCalled before collapsing the inline row. Applies to rows conforming \u003ccode\u003eInlineRowType\u003c/code\u003e protocol.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eonPresent()\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCalled by a row just before presenting another view controller. Applies to rows conforming \u003ccode\u003ePresenterRowType\u003c/code\u003e protocol. Use it to set up the presented controller.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSection Header and Footer\u003c/h3\u003e\u003ca id=\"user-content-section-header-and-footer\" class=\"anchor\" aria-label=\"Permalink: Section Header and Footer\" href=\"#section-header-and-footer\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can set a title \u003ccode\u003eString\u003c/code\u003e or a custom \u003ccode\u003eView\u003c/code\u003e as the header or footer of a \u003ccode\u003eSection\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eString title\u003c/h4\u003e\u003ca id=\"user-content-string-title\" class=\"anchor\" aria-label=\"Permalink: String title\" href=\"#string-title\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"Section(\u0026quot;Title\u0026quot;)\n\nSection(header: \u0026quot;Title\u0026quot;, footer: \u0026quot;Footer Title\u0026quot;)\n\nSection(footer: \u0026quot;Footer Title\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eTitle\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eheader\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eTitle\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e footer\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eFooter Title\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003efooter\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eFooter Title\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCustom view\u003c/h4\u003e\u003ca id=\"user-content-custom-view\" class=\"anchor\" aria-label=\"Permalink: Custom view\" href=\"#custom-view\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can use a Custom View from a \u003ccode\u003e.xib\u003c/code\u003e file:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"Section() { section in\n var header = HeaderFooterView\u0026lt;MyHeaderNibFile\u0026gt;(.nibFile(name: \u0026quot;MyHeaderNibFile\u0026quot;, bundle: nil))\n\n // Will be called every time the header appears on screen\n header.onSetupView = { view, _ in\n // Commonly used to setup texts inside the view\n // Don't change the view hierarchy or size here!\n }\n section.header = header\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e section \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eheader\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eHeaderFooterView\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eMyHeaderNibFile\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003enibFile\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003ename\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eMyHeaderNibFile\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e bundle\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003enil\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n // Will be called every time the header appears on screen\n header\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eonSetupView \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e view\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e _ \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n // Commonly used to setup texts inside the view\n // Don't change the view hierarchy or size here!\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n section\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eheader \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e header\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOr a custom \u003ccode\u003eUIView\u003c/code\u003e created programmatically\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"Section(){ section in\n var header = HeaderFooterView\u0026lt;MyCustomUIView\u0026gt;(.class)\n header.height = {100}\n header.onSetupView = { view, _ in\n view.backgroundColor = .red\n }\n section.header = header\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e section \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eheader\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eHeaderFooterView\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eMyCustomUIView\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eclass\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n header\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eheight \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e100\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n header\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eonSetupView \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e view\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e _ \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n view\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ebackgroundColor \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ered\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n section\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eheader \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e header\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOr just build the view with a Callback\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"Section(){ section in\n section.header = {\n var header = HeaderFooterView\u0026lt;UIView\u0026gt;(.callback({\n let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))\n view.backgroundColor = .red\n return view\n }))\n header.height = { 100 }\n return header\n }()\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e section \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n section\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eheader \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eheader\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eHeaderFooterView\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eUIView\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ecallback\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eview\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eUIView\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eframe\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eCGRect\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003ex\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e y\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e width\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e100\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e height\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e100\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n view\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ebackgroundColor \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ered\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e view\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n header\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eheight \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e100\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e header\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDynamically hide and show rows (or sections) \u003ca name=\"user-content-hide-show-rows\"\u003e\u003c/a\u003e\u003c/h3\u003e\u003ca id=\"user-content-dynamically-hide-and-show-rows-or-sections--\" class=\"anchor\" aria-label=\"Permalink: Dynamically hide and show rows (or sections) \" href=\"#dynamically-hide-and-show-rows-or-sections--\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/EurekaSwitchSections.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/EurekaSwitchSections.gif\" width=\"300\" alt=\"Screenshot of Hidden Rows\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIn this case we are hiding and showing whole sections.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo accomplish this each row has a \u003ccode\u003ehidden\u003c/code\u003e variable of optional type \u003ccode\u003eCondition\u003c/code\u003e which can be set using a function or \u003ccode\u003eNSPredicate\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHiding using a function condition\u003c/h4\u003e\u003ca id=\"user-content-hiding-using-a-function-condition\" class=\"anchor\" aria-label=\"Permalink: Hiding using a function condition\" href=\"#hiding-using-a-function-condition\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUsing the \u003ccode\u003efunction\u003c/code\u003e case of \u003ccode\u003eCondition\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"Condition.function([String], (Form)-\u0026gt;Bool)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-smi\"\u003eCondition\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003efunction\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003eString\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eForm\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003eBool\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe array of \u003ccode\u003eString\u003c/code\u003e to pass should contain the tags of the rows this row depends on. Each time the value of any of those rows changes the function is reevaluated.\nThe function then takes the \u003ccode\u003eForm\u003c/code\u003e and returns a \u003ccode\u003eBool\u003c/code\u003e indicating whether the row should be hidden or not. This the most powerful way of setting up the \u003ccode\u003ehidden\u003c/code\u003e property as it has no explicit limitations of what can be done.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"form +++ Section()\n \u0026lt;\u0026lt;\u0026lt; SwitchRow(\u0026quot;switchRowTag\u0026quot;){\n $0.title = \u0026quot;Show message\u0026quot;\n }\n \u0026lt;\u0026lt;\u0026lt; LabelRow(){\n\n $0.hidden = Condition.function([\u0026quot;switchRowTag\u0026quot;], { form in\n return !((form.rowBy(tag: \u0026quot;switchRowTag\u0026quot;) as? SwitchRow)?.value ?? false)\n })\n $0.title = \u0026quot;Switch is on!\u0026quot;\n }\"\u003e\u003cpre\u003eform \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSwitchRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eswitchRowTag\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eShow message\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eLabelRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ehidden \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCondition\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003efunction\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eswitchRowTag\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e form \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e !\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eform\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003erowBy\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eswitchRowTag\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eas?\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSwitchRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalue \u003cspan class=\"pl-c1\"\u003e??\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003efalse\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eSwitch is on!\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/EurekaHidden.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/EurekaHidden.gif\" width=\"300\" alt=\"Screenshot of Hidden Rows\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"public enum Condition {\n case function([String], (Form)-\u0026gt;Bool)\n case predicate(NSPredicate)\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eenum\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCondition\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ecase\u003c/span\u003e function\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eForm\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eBool\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ecase\u003c/span\u003e predicate\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eNSPredicate\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHiding using an NSPredicate\u003c/h4\u003e\u003ca id=\"user-content-hiding-using-an-nspredicate\" class=\"anchor\" aria-label=\"Permalink: Hiding using an NSPredicate\" href=\"#hiding-using-an-nspredicate\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003ehidden\u003c/code\u003e variable can also be set with a NSPredicate. In the predicate string you can reference values of other rows by their tags to determine if a row should be hidden or visible.\nThis will only work if the values of the rows the predicate has to check are NSObjects (String and Int will work as they are bridged to their ObjC counterparts, but enums won't work).\nWhy could it then be useful to use predicates when they are more limited? Well, they can be much simpler, shorter and readable than functions. Look at this example:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$0.hidden = Condition.predicate(NSPredicate(format: \u0026quot;$switchTag == false\u0026quot;))\"\u003e\u003cpre\u003e$0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ehidden \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCondition\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003epredicate\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eNSPredicate\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eformat\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e$switchTag == false\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAnd we can write it even shorter since \u003ccode\u003eCondition\u003c/code\u003e conforms to \u003ccode\u003eExpressibleByStringLiteral\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$0.hidden = \u0026quot;$switchTag == false\u0026quot;\"\u003e\u003cpre\u003e$0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ehidden \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e$switchTag == false\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003eNote: we will substitute the value of the row whose tag is 'switchTag' instead of '$switchTag'\u003c/em\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor all of this to work, \u003cstrong\u003eall of the implicated rows must have a tag\u003c/strong\u003e as the tag will identify them.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWe can also hide a row by doing:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$0.hidden = true\"\u003e\u003cpre\u003e$0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ehidden \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eas \u003ccode\u003eCondition\u003c/code\u003e conforms to \u003ccode\u003eExpressibleByBooleanLiteral\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNot setting the \u003ccode\u003ehidden\u003c/code\u003e variable will leave the row always visible.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf you manually set the hidden (or disabled) condition after the form has been displayed you may have to call \u003ccode\u003erow.evaluateHidden()\u003c/code\u003e to force Eureka to reevaluate the new condition.\nSee \u003ca href=\"https://github.com/xmartlabs/Eureka#row-does-not-update-after-changing-hidden-or-disabled-condition\"\u003ethis FAQ section\u003c/a\u003e for more info.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSections\u003c/h5\u003e\u003ca id=\"user-content-sections\" class=\"anchor\" aria-label=\"Permalink: Sections\" href=\"#sections\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor sections this works just the same. That means we can set up section \u003ccode\u003ehidden\u003c/code\u003e property to show/hide it dynamically.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDisabling rows\u003c/h5\u003e\u003ca id=\"user-content-disabling-rows\" class=\"anchor\" aria-label=\"Permalink: Disabling rows\" href=\"#disabling-rows\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo disable rows, each row has an \u003ccode\u003edisabled\u003c/code\u003e variable which is also an optional \u003ccode\u003eCondition\u003c/code\u003e type property. This variable also works the same as the \u003ccode\u003ehidden\u003c/code\u003e variable so that it requires the rows to have a tag.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNote that if you want to disable a row permanently you can also set \u003ccode\u003edisabled\u003c/code\u003e variable to \u003ccode\u003etrue\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eList Sections\u003c/h3\u003e\u003ca id=\"user-content-list-sections\" class=\"anchor\" aria-label=\"Permalink: List Sections\" href=\"#list-sections\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo display a list of options, Eureka includes a special section called \u003ccode\u003eSelectableSection\u003c/code\u003e.\nWhen creating one you need to pass the type of row to use in the options and the \u003ccode\u003eselectionType\u003c/code\u003e.\nThe \u003ccode\u003eselectionType\u003c/code\u003e is an enum which can be either \u003ccode\u003emultipleSelection\u003c/code\u003e or \u003ccode\u003esingleSelection(enableDeselection: Bool)\u003c/code\u003e where the \u003ccode\u003eenableDeselection\u003c/code\u003e parameter determines if the selected rows can be deselected or not.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"form +++ SelectableSection\u0026lt;ListCheckRow\u0026lt;String\u0026gt;\u0026gt;(\u0026quot;Where do you live\u0026quot;, selectionType: .singleSelection(enableDeselection: true))\n\nlet continents = [\u0026quot;Africa\u0026quot;, \u0026quot;Antarctica\u0026quot;, \u0026quot;Asia\u0026quot;, \u0026quot;Australia\u0026quot;, \u0026quot;Europe\u0026quot;, \u0026quot;North America\u0026quot;, \u0026quot;South America\u0026quot;]\nfor option in continents {\n form.last! \u0026lt;\u0026lt;\u0026lt; ListCheckRow\u0026lt;String\u0026gt;(option){ listRow in\n listRow.title = option\n listRow.selectableValue = option\n listRow.value = nil\n }\n}\"\u003e\u003cpre\u003eform \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSelectableSection\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eListCheckRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eWhere do you live\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e selectionType\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003esingleSelection\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eenableDeselection\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003econtinents\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eAfrica\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eAntarctica\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eAsia\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eAustralia\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eEurope\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eNorth America\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eSouth America\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003efor\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eoption\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e continents \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n form\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003elast! \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eListCheckRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eoption\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e listRow \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n listRow\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e option\n listRow\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eselectableValue \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e option\n listRow\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalue \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003enil\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWhat kind of rows can be used?\u003c/h5\u003e\u003ca id=\"user-content-what-kind-of-rows-can-be-used\" class=\"anchor\" aria-label=\"Permalink: What kind of rows can be used?\" href=\"#what-kind-of-rows-can-be-used\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo create such a section you have to create a row that conforms the \u003ccode\u003eSelectableRowType\u003c/code\u003e protocol.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"public protocol SelectableRowType : RowType {\n var selectableValue : Value? { get set }\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eprotocol\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSelectableRowType\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRowType\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-s1\"\u003e\u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eselectableValue\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eValue\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eget\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eset\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis \u003ccode\u003eselectableValue\u003c/code\u003e is where the value of the row will be permanently stored. The \u003ccode\u003evalue\u003c/code\u003e variable will be used to determine if the row is selected or not, being 'selectableValue' if selected or nil otherwise.\nEureka includes the \u003ccode\u003eListCheckRow\u003c/code\u003e which is used for example. In the custom rows of the Examples project you can also find the \u003ccode\u003eImageCheckRow\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eGetting the selected rows\u003c/h5\u003e\u003ca id=\"user-content-getting-the-selected-rows\" class=\"anchor\" aria-label=\"Permalink: Getting the selected rows\" href=\"#getting-the-selected-rows\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo easily get the selected row/s of a \u003ccode\u003eSelectableSection\u003c/code\u003e there are two methods: \u003ccode\u003eselectedRow()\u003c/code\u003e and \u003ccode\u003eselectedRows()\u003c/code\u003e which can be called to get the selected row in case it is a \u003ccode\u003eSingleSelection\u003c/code\u003e section or all the selected rows if it is a \u003ccode\u003eMultipleSelection\u003c/code\u003e section.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eGrouping options in sections\u003c/h5\u003e\u003ca id=\"user-content-grouping-options-in-sections\" class=\"anchor\" aria-label=\"Permalink: Grouping options in sections\" href=\"#grouping-options-in-sections\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAdditionally you can setup list of options to be grouped by sections using following properties of \u003ccode\u003eSelectorViewController\u003c/code\u003e:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003esectionKeyForValue\u003c/code\u003e - a closure that should return key for particular row value. This key is later used to break options by sections.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003esectionHeaderTitleForKey\u003c/code\u003e - a closure that returns header title for a section for particular key. By default returns the key itself.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003esectionFooterTitleForKey\u003c/code\u003e - a closure that returns footer title for a section for particular key.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMultivalued Sections\u003c/h3\u003e\u003ca id=\"user-content-multivalued-sections\" class=\"anchor\" aria-label=\"Permalink: Multivalued Sections\" href=\"#multivalued-sections\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eEureka supports multiple values for a certain field (such as telephone numbers in a contact) by using Multivalued sections. It allows us to easily create insertable, deletable and reorderable sections.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/EurekaMultivalued.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/EurekaMultivalued.gif\" width=\"300\" alt=\"Screenshot of Multivalued Section\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow to create a multivalued section\u003c/h4\u003e\u003ca id=\"user-content-how-to-create-a-multivalued-section\" class=\"anchor\" aria-label=\"Permalink: How to create a multivalued section\" href=\"#how-to-create-a-multivalued-section\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIn order to create a multivalued section we have to use \u003ccode\u003eMultivaluedSection\u003c/code\u003e type instead of the regular \u003ccode\u003eSection\u003c/code\u003e type. \u003ccode\u003eMultivaluedSection\u003c/code\u003e extends \u003ccode\u003eSection\u003c/code\u003e and has some additional properties to configure multivalued section behavior.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003elet's dive into a code example...\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"form +++\n MultivaluedSection(multivaluedOptions: [.Reorder, .Insert, .Delete],\n header: \u0026quot;Multivalued TextField\u0026quot;,\n footer: \u0026quot;.Insert adds a 'Add Item' (Add New Tag) button row as last cell.\u0026quot;) {\n $0.addButtonProvider = { section in\n return ButtonRow(){\n $0.title = \u0026quot;Add New Tag\u0026quot;\n }\n }\n $0.multivaluedRowToInsertAt = { index in\n return NameRow() {\n $0.placeholder = \u0026quot;Tag Name\u0026quot;\n }\n }\n $0 \u0026lt;\u0026lt;\u0026lt; NameRow() {\n $0.placeholder = \u0026quot;Tag Name\u0026quot;\n }\n }\"\u003e\u003cpre\u003eform \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003eMultivaluedSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003emultivaluedOptions\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eReorder\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eInsert\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eDelete\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n header\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eMultivalued TextField\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n footer\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e.Insert adds a 'Add Item' (Add New Tag) button row as last cell.\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eaddButtonProvider \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e section \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eButtonRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eAdd New Tag\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003emultivaluedRowToInsertAt \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e index \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eNameRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eplaceholder \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eTag Name\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n $0 \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eNameRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eplaceholder \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eTag Name\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ePrevious code snippet shows how to create a multivalued section. In this case we want to insert, delete and reorder rows as multivaluedOptions argument indicates.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eaddButtonProvider\u003c/code\u003e allows us to customize the button row which inserts a new row when tapped and \u003ccode\u003emultivaluedOptions\u003c/code\u003e contains \u003ccode\u003e.Insert\u003c/code\u003e value.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003emultivaluedRowToInsertAt\u003c/code\u003e closure property is called by Eureka each time a new row needs to be inserted. In order to provide the row to add into multivalued section we should set this property. Eureka passes the index as closure parameter. Notice that we can return any kind of row, even custom rows, even though in most cases multivalued section rows are of the same type.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eEureka automatically adds a button row when we create a insertable multivalued section. We can customize how the this button row looks like as we explained before. \u003ccode\u003eshowInsertIconInAddButton\u003c/code\u003e property indicates if plus button (insert style) should appear in the left of the button, true by default.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThere are some considerations we need to have in mind when creating insertable sections. Any row added to the insertable multivalued section should be placed above the row that Eureka automatically adds to insert new rows. This can be easily achieved by adding these additional rows to the section from inside the section's initializer closure (last parameter of section initializer) so then Eureka adds the adds insert button at the end of the section.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eEditing mode\u003c/h4\u003e\u003ca id=\"user-content-editing-mode\" class=\"anchor\" aria-label=\"Permalink: Editing mode\" href=\"#editing-mode\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBy default Eureka will set the tableView's \u003ccode\u003eisEditing\u003c/code\u003e to true only if there is a MultivaluedSection in the form. This will be done in \u003ccode\u003eviewWillAppear\u003c/code\u003e the first time a form is presented.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor more information on how to use multivalued sections please take a look at Eureka example project which contains several usage examples.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCustom add button\u003c/h4\u003e\u003ca id=\"user-content-custom-add-button\" class=\"anchor\" aria-label=\"Permalink: Custom add button\" href=\"#custom-add-button\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you want to use an add button which is not a \u003ccode\u003eButtonRow\u003c/code\u003e then you can use \u003ccode\u003eGenericMultivaluedSection\u0026lt;AddButtonType\u0026gt;\u003c/code\u003e, where \u003ccode\u003eAddButtonType\u003c/code\u003e is the type of the row you want to use as add button. This is useful if you want to use a custom row to change the UI of the button.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eExample:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"GenericMultivaluedSection\u0026lt;LabelRow\u0026gt;(multivaluedOptions: [.Reorder, .Insert, .Delete], {\n $0.addButtonProvider = { section in\n return LabelRow(){\n $0.title = \u0026quot;A Label row as add button\u0026quot;\n }\n }\n // ...\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-smi\"\u003eGenericMultivaluedSection\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eLabelRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003emultivaluedOptions\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eReorder\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eInsert\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eDelete\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eaddButtonProvider \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e section \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eLabelRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eA Label row as add button\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n // ...\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eValidations\u003c/h3\u003e\u003ca id=\"user-content-validations\" class=\"anchor\" aria-label=\"Permalink: Validations\" href=\"#validations\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eEureka 2.0.0 introduces the much requested built-in validations feature.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eA row has a collection of \u003ccode\u003eRules\u003c/code\u003e and a specific configuration that determines when validation rules should be evaluated.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThere are some rules provided by default, but you can also create new ones on your own.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe provided rules are:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eRuleRequired\u003c/li\u003e\n\u003cli\u003eRuleEmail\u003c/li\u003e\n\u003cli\u003eRuleURL\u003c/li\u003e\n\u003cli\u003eRuleGreaterThan, RuleGreaterOrEqualThan, RuleSmallerThan, RuleSmallerOrEqualThan\u003c/li\u003e\n\u003cli\u003eRuleMinLength, RuleMaxLength\u003c/li\u003e\n\u003cli\u003eRuleClosure\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eLet's see how to set up the validation rules.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\noverride func viewDidLoad() {\n super.viewDidLoad()\n form\n +++ Section(header: \u0026quot;Required Rule\u0026quot;, footer: \u0026quot;Options: Validates on change\u0026quot;)\n\n \u0026lt;\u0026lt;\u0026lt; TextRow() {\n $0.title = \u0026quot;Required Rule\u0026quot;\n $0.add(rule: RuleRequired())\n\n\t\t// This could also have been achieved using a closure that returns nil if valid, or a ValidationError otherwise.\n\t\t/*\n\t\tlet ruleRequiredViaClosure = RuleClosure\u0026lt;String\u0026gt; { rowValue in\n\t\treturn (rowValue == nil || rowValue!.isEmpty) ? ValidationError(msg: \u0026quot;Field required!\u0026quot;) : nil\n\t\t}\n\t\t$0.add(rule: ruleRequiredViaClosure)\n\t\t*/\n\n $0.validationOptions = .validatesOnChange\n }\n .cellUpdate { cell, row in\n if !row.isValid {\n cell.titleLabel?.textColor = .systemRed\n }\n }\n\n +++ Section(header: \u0026quot;Email Rule, Required Rule\u0026quot;, footer: \u0026quot;Options: Validates on change after blurred\u0026quot;)\n\n \u0026lt;\u0026lt;\u0026lt; TextRow() {\n $0.title = \u0026quot;Email Rule\u0026quot;\n $0.add(rule: RuleRequired())\n $0.add(rule: RuleEmail())\n $0.validationOptions = .validatesOnChangeAfterBlurred\n }\n .cellUpdate { cell, row in\n if !row.isValid {\n cell.titleLabel?.textColor = .systemRed\n }\n }\n\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003eoverride\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e viewDidLoad\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n super\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eviewDidLoad\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n form\n \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eheader\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eRequired Rule\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e footer\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eOptions: Validates on change\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eTextRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eRequired Rule\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eadd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003erule\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eRuleRequired\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n\t\t// This could also have been achieved using a closure that returns nil if valid, or a ValidationError otherwise.\n\t\t/*\n\t\tlet ruleRequiredViaClosure = RuleClosure\u0026lt;String\u0026gt; { rowValue in\n\t\treturn (rowValue == nil || rowValue!.isEmpty) ? ValidationError(msg: \"Field required!\") : nil\n\t\t}\n\t\t$0.add(rule: ruleRequiredViaClosure)\n\t\t*/\n\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalidationOptions \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalidatesOnChange\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003ecellUpdate\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e cell\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e row \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e !row\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eisValid \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n cell\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitleLabel\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etextColor \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003esystemRed\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eheader\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eEmail Rule, Required Rule\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e footer\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eOptions: Validates on change after blurred\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eTextRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eEmail Rule\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eadd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003erule\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eRuleRequired\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eadd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003erule\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eRuleEmail\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalidationOptions \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalidatesOnChangeAfterBlurred\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003ecellUpdate\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e cell\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e row \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e !row\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eisValid \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n cell\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitleLabel\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etextColor \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003esystemRed\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAs you can see in the previous code snippet we can set up as many rules as we want in a row by invoking row's \u003ccode\u003eadd(rule:)\u003c/code\u003e function.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eRow also provides \u003ccode\u003efunc remove(ruleWithIdentifier identifier: String)\u003c/code\u003e to remove a rule. In order to use it we must assign an id to the rule after creating it.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSometimes the collection of rules we want to use on a row is the same we want to use on many other rows. In this case we can set up all validation rules using a \u003ccode\u003eRuleSet\u003c/code\u003e which is a collection of validation rules.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"var rules = RuleSet\u0026lt;String\u0026gt;()\nrules.add(rule: RuleRequired())\nrules.add(rule: RuleEmail())\n\nlet row = TextRow() {\n $0.title = \u0026quot;Email Rule\u0026quot;\n $0.add(ruleSet: rules)\n $0.validationOptions = .validatesOnChangeAfterBlurred\n }\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erules\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRuleSet\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\nrules\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eadd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003erule\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eRuleRequired\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\nrules\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eadd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003erule\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eRuleEmail\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erow\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eTextRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eEmail Rule\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eadd\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eruleSet\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e rules\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalidationOptions \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalidatesOnChangeAfterBlurred\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eEureka allows us to specify when validation rules should be evaluated. We can do it by setting up \u003ccode\u003evalidationOptions\u003c/code\u003e row's property, which can have the following values:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003e.validatesOnChange\u003c/code\u003e - Validates whenever a row value changes.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.validatesOnBlur\u003c/code\u003e - (Default value) validates right after the cell resigns first responder. Not applicable for all rows.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.validatesOnChangeAfterBlurred\u003c/code\u003e - Validates whenever the row value changes after it resigns first responder for the first time.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e.validatesOnDemand\u003c/code\u003e - We should manually validate the row or form by invoking \u003ccode\u003evalidate()\u003c/code\u003e method.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eIf you want to validate the entire form (all the rows) you can manually invoke Form \u003ccode\u003evalidate()\u003c/code\u003e method.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow to get validation errors\u003c/h4\u003e\u003ca id=\"user-content-how-to-get-validation-errors\" class=\"anchor\" aria-label=\"Permalink: How to get validation errors\" href=\"#how-to-get-validation-errors\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eEach row has the \u003ccode\u003evalidationErrors\u003c/code\u003e property that can be used to retrieve all validation errors. This property just holds the validation error list of the latest row validation execution, which means it doesn't evaluate the validation rules of the row.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNote on types\u003c/h4\u003e\u003ca id=\"user-content-note-on-types\" class=\"anchor\" aria-label=\"Permalink: Note on types\" href=\"#note-on-types\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAs expected, the Rules must use the same types as the Row object. Be extra careful to check the row type used. You might see a compiler error (\"Incorrect arugment label in call (have 'rule:' expected 'ruleSet:')\" that is not pointing to the problem when mixing types.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSwipe Actions\u003c/h3\u003e\u003ca id=\"user-content-swipe-actions\" class=\"anchor\" aria-label=\"Permalink: Swipe Actions\" href=\"#swipe-actions\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBy using swipe actions we can define multiple \u003ccode\u003eleadingSwipe\u003c/code\u003e and \u003ccode\u003etrailingSwipe\u003c/code\u003e actions per row. As swipe actions depend on iOS system features, \u003ccode\u003eleadingSwipe\u003c/code\u003e is available on iOS 11.0+ only.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eLet's see how to define swipe actions.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"let row = TextRow() {\n let deleteAction = SwipeAction(\n style: .destructive,\n title: \u0026quot;Delete\u0026quot;,\n handler: { (action, row, completionHandler) in\n //add your code here.\n //make sure you call the completionHandler once done.\n completionHandler?(true)\n })\n deleteAction.image = UIImage(named: \u0026quot;icon-trash\u0026quot;)\n\n $0.trailingSwipe.actions = [deleteAction]\n $0.trailingSwipe.performsFirstActionWithFullSwipe = true\n\n //please be aware: `leadingSwipe` is only available on iOS 11+ only\n let infoAction = SwipeAction(\n style: .normal,\n title: \u0026quot;Info\u0026quot;,\n handler: { (action, row, completionHandler) in\n //add your code here.\n //make sure you call the completionHandler once done.\n completionHandler?(true)\n })\n infoAction.actionBackgroundColor = .blue\n infoAction.image = UIImage(named: \u0026quot;icon-info\u0026quot;)\n\n $0.leadingSwipe.actions = [infoAction]\n $0.leadingSwipe.performsFirstActionWithFullSwipe = true\n }\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erow\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eTextRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003edeleteAction\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSwipeAction\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\n style\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003edestructive\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n title\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eDelete\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n handler\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eaction\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e row\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e completionHandler\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n //add your code here.\n //make sure you call the completionHandler once done.\n \u003cspan class=\"pl-en\"\u003ecompletionHandler\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n deleteAction\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eimage \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eUIImage\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003enamed\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eicon-trash\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etrailingSwipe\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eactions \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003edeleteAction\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etrailingSwipe\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eperformsFirstActionWithFullSwipe \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e\n\n //please be aware: `leadingSwipe` is only available on iOS 11+ only\n \u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003einfoAction\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eSwipeAction\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\n style\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003enormal\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n title\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eInfo\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\n handler\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eaction\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e row\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e completionHandler\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n //add your code here.\n //make sure you call the completionHandler once done.\n \u003cspan class=\"pl-en\"\u003ecompletionHandler\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n infoAction\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eactionBackgroundColor \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eblue\n infoAction\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eimage \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eUIImage\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003enamed\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eicon-info\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eleadingSwipe\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eactions \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003einfoAction\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eleadingSwipe\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eperformsFirstActionWithFullSwipe \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSwipe Actions need \u003ccode\u003etableView.isEditing\u003c/code\u003e be set to \u003ccode\u003efalse\u003c/code\u003e. Eureka will set this to \u003ccode\u003etrue\u003c/code\u003e if there is a MultivaluedSection in the form (in the \u003ccode\u003eviewWillAppear\u003c/code\u003e).\nIf you have both MultivaluedSections and swipe actions in the same form you should set \u003ccode\u003eisEditing\u003c/code\u003e according to your needs.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCustom rows\u003c/h2\u003e\u003ca id=\"user-content-custom-rows\" class=\"anchor\" aria-label=\"Permalink: Custom rows\" href=\"#custom-rows\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIt is very common that you need a row that is different from those included in Eureka. If this is the case you will have to create your own row but this should not be difficult. You can read \u003ca href=\"https://blog.xmartlabs.com/2016/09/06/Eureka-custom-row-tutorial/\" rel=\"nofollow\"\u003ethis tutorial on how to create custom rows\u003c/a\u003e to get started. You might also want to have a look at \u003ca href=\"https://github.com/EurekaCommunity\"\u003eEurekaCommunity\u003c/a\u003e which includes some extra rows ready to be added to Eureka.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBasic custom rows\u003c/h3\u003e\u003ca id=\"user-content-basic-custom-rows\" class=\"anchor\" aria-label=\"Permalink: Basic custom rows\" href=\"#basic-custom-rows\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo create a row with custom behaviour and appearance you'll probably want to create subclasses of \u003ccode\u003eRow\u003c/code\u003e and \u003ccode\u003eCell\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eRemember that \u003ccode\u003eRow\u003c/code\u003e is the abstraction Eureka uses, while the \u003ccode\u003eCell\u003c/code\u003e is the actual \u003ccode\u003eUITableViewCell\u003c/code\u003e in charge of the view.\nAs the \u003ccode\u003eRow\u003c/code\u003e contains the \u003ccode\u003eCell\u003c/code\u003e, both \u003ccode\u003eRow\u003c/code\u003e and \u003ccode\u003eCell\u003c/code\u003e must be defined for the same \u003cstrong\u003evalue\u003c/strong\u003e type.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Custom Cell with value type: Bool\n// The cell is defined using a .xib, so we can set outlets :)\npublic class CustomCell: Cell\u0026lt;Bool\u0026gt;, CellType {\n @IBOutlet weak var switchControl: UISwitch!\n @IBOutlet weak var label: UILabel!\n\n public override func setup() {\n super.setup()\n switchControl.addTarget(self, action: #selector(CustomCell.switchValueChanged), for: .valueChanged)\n }\n\n func switchValueChanged(){\n row.value = switchControl.on\n row.updateCell() // Re-draws the cell which calls 'update' bellow\n }\n\n public override func update() {\n super.update()\n backgroundColor = (row.value ?? false) ? .white : .black\n }\n}\n\n// The custom Row also has the cell: CustomCell and its correspond value\npublic final class CustomRow: Row\u0026lt;CustomCell\u0026gt;, RowType {\n required public init(tag: String?) {\n super.init(tag: tag)\n // We set the cellProvider to load the .xib corresponding to our cell\n cellProvider = CellProvider\u0026lt;CustomCell\u0026gt;(nibName: \u0026quot;CustomCell\u0026quot;)\n }\n}\"\u003e\u003cpre\u003e// Custom Cell with value type: Bool\n// The cell is defined using a .xib, so we can set outlets :)\n\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eclass\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCustomCell\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCell\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eBool\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCellType\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-s1\"\u003e@\u003cspan class=\"pl-smi\"\u003eIBOutlet\u003c/span\u003e\u003c/span\u003e weak \u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003e\u003cspan class=\"pl-c1\"\u003eswitchControl\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eUISwitch\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e!\u003c/span\u003e\n \u003cspan class=\"pl-s1\"\u003e@\u003cspan class=\"pl-smi\"\u003eIBOutlet\u003c/span\u003e\u003c/span\u003e weak \u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003e\u003cspan class=\"pl-c1\"\u003elabel\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eUILabel\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e!\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003eoverride\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e setup\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n super\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003esetup\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n switchControl\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eaddTarget\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eself\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e action\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e #selector\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eCustomCell\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eswitchValueChanged\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e for\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalueChanged\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e switchValueChanged\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n row\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalue \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e switchControl\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eon\n row\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eupdateCell\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e // Re-draws the cell which calls 'update' bellow\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003eoverride\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e update\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n super\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eupdate\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n backgroundColor \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003erow\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalue \u003cspan class=\"pl-c1\"\u003e??\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003efalse\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ewhite \u003cspan class=\"pl-k\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eblack\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n// The custom Row also has the cell: CustomCell and its correspond value\n\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003efinal\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eclass\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCustomRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eCustomCell\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRowType\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003erequired\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-v\"\u003einit\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n super\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003einit\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e tag\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n // We set the cellProvider to load the .xib corresponding to our cell\n cellProvider \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCellProvider\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eCustomCell\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003enibName\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eCustomCell\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe result: \u003cbr\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/EurekaCustomRow.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/EurekaCustomRow.gif\" alt=\"Screenshot of Disabled Row\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cbr\u003e\nCustom rows need to subclass `Row` and conform to `RowType` protocol.\nCustom cells need to subclass `Cell` and conform to `CellType` protocol.\n\u003cp dir=\"auto\"\u003eJust like the callbacks cellSetup and CellUpdate, the \u003ccode\u003eCell\u003c/code\u003e has the setup and update methods where you can customize it.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCustom inline rows\u003c/h3\u003e\u003ca id=\"user-content-custom-inline-rows\" class=\"anchor\" aria-label=\"Permalink: Custom inline rows\" href=\"#custom-inline-rows\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAn inline row is a specific type of row that shows dynamically a row below it, normally an inline row changes between an expanded and collapsed mode whenever the row is tapped.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSo to create an inline row we need 2 rows, the row that is \"always\" visible and the row that will expand/collapse.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAnother requirement is that the value type of these 2 rows must be the same. This means if one row holds a \u003ccode\u003eString\u003c/code\u003e value then the other must have a \u003ccode\u003eString\u003c/code\u003e value too.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOnce we have these 2 rows, we should make the top row type conform to \u003ccode\u003eInlineRowType\u003c/code\u003e.\nThis protocol requires you to define an \u003ccode\u003eInlineRow\u003c/code\u003e typealias and a \u003ccode\u003esetupInlineRow\u003c/code\u003e function.\nThe \u003ccode\u003eInlineRow\u003c/code\u003e type will be the type of the row that will expand/collapse.\nTake this as an example:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"class PickerInlineRow\u0026lt;T\u0026gt; : Row\u0026lt;PickerInlineCell\u0026lt;T\u0026gt;\u0026gt; where T: Equatable {\n\n public typealias InlineRow = PickerRow\u0026lt;T\u0026gt;\n open var options = [T]()\n\n required public init(tag: String?) {\n super.init(tag: tag)\n }\n\n public func setupInlineRow(_ inlineRow: InlineRow) {\n inlineRow.options = self.options\n inlineRow.displayValueFor = self.displayValueFor\n inlineRow.cell.height = { UITableViewAutomaticDimension }\n }\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eclass\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003ePickerInlineRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003eT\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003ePickerInlineCell\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ewhere\u003c/span\u003e T\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eEquatable\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003etypealias\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eInlineRow\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003ePickerRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eopen\u003c/span\u003e \u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003e\u003cspan class=\"pl-c1\"\u003eoptions\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003eT\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003erequired\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-v\"\u003einit\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n super\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003einit\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e tag\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e setupInlineRow\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e_ inlineRow\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eInlineRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n inlineRow\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eoptions \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eself\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eoptions\n inlineRow\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003edisplayValueFor \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eself\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003edisplayValueFor\n inlineRow\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ecell\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eheight \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e UITableViewAutomaticDimension \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003eInlineRowType\u003c/code\u003e will also add some methods to your inline row:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"func expandInlineRow()\nfunc collapseInlineRow()\nfunc toggleInlineRow()\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e expandInlineRow\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e collapseInlineRow\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e toggleInlineRow\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThese methods should work fine but should you want to override them keep in mind that it is \u003ccode\u003etoggleInlineRow\u003c/code\u003e that has to call \u003ccode\u003eexpandInlineRow\u003c/code\u003e and \u003ccode\u003ecollapseInlineRow\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFinally you must invoke \u003ccode\u003etoggleInlineRow()\u003c/code\u003e when the row is selected, for example overriding \u003ccode\u003ecustomDidSelect\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"public override func customDidSelect() {\n super.customDidSelect()\n if !isDisabled {\n toggleInlineRow()\n }\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003eoverride\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e customDidSelect\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n super\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003ecustomDidSelect\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e !isDisabled \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003etoggleInlineRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCustom Presenter rows\u003c/h3\u003e\u003ca id=\"user-content-custom-presenter-rows\" class=\"anchor\" aria-label=\"Permalink: Custom Presenter rows\" href=\"#custom-presenter-rows\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eNote:\u003c/strong\u003e \u003cem\u003eA Presenter row is a row that presents a new UIViewController.\u003c/em\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo create a custom Presenter row you must create a class that conforms the \u003ccode\u003ePresenterRowType\u003c/code\u003e protocol. It is highly recommended to subclass \u003ccode\u003eSelectorRow\u003c/code\u003e as it does conform to that protocol and adds other useful functionality.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe PresenterRowType protocol is defined as follows:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"public protocol PresenterRowType: TypedRowType {\n\n associatedtype PresentedControllerType : UIViewController, TypedRowControllerType\n\n /// Defines how the view controller will be presented, pushed, etc.\n var presentationMode: PresentationMode\u0026lt;PresentedControllerType\u0026gt;? { get set }\n\n /// Will be called before the presentation occurs.\n var onPresentCallback: ((FormViewController, PresentedControllerType) -\u0026gt; Void)? { get set }\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eprotocol\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003ePresenterRowType\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eTypedRowType\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003eassociatedtype\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003ePresentedControllerType\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eUIViewController\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e TypedRowControllerType\n\n /// Defines how the view controller will be presented, pushed, etc.\n \u003cspan class=\"pl-s1\"\u003e\u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003epresentationMode\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003ePresentationMode\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003ePresentedControllerType\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eget\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eset\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n /// Will be called before the presentation occurs.\n \u003cspan class=\"pl-s1\"\u003e\u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eonPresentCallback\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eFormViewController\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003ePresentedControllerType\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eVoid\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eget\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eset\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe onPresentCallback will be called when the row is about to present another view controller. This is done in the \u003ccode\u003eSelectorRow\u003c/code\u003e so if you do not subclass it you will have to call it yourself.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003epresentationMode\u003c/code\u003e is what defines how the controller is presented and which controller is presented. This presentation can be using a Segue identifier, a segue class, presenting a controller modally or pushing to a specific view controller. For example a CustomPushRow can be defined like this:\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eLet's see an example..\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\n/// Generic row type where a user must select a value among several options.\nopen class SelectorRow\u0026lt;Cell: CellType\u0026gt;: OptionsRow\u0026lt;Cell\u0026gt;, PresenterRowType where Cell: BaseCell {\n\n\n /// Defines how the view controller will be presented, pushed, etc.\n open var presentationMode: PresentationMode\u0026lt;SelectorViewController\u0026lt;SelectorRow\u0026lt;Cell\u0026gt;\u0026gt;\u0026gt;?\n\n /// Will be called before the presentation occurs.\n open var onPresentCallback: ((FormViewController, SelectorViewController\u0026lt;SelectorRow\u0026lt;Cell\u0026gt;\u0026gt;) -\u0026gt; Void)?\n\n required public init(tag: String?) {\n super.init(tag: tag)\n }\n\n /**\n Extends `didSelect` method\n */\n open override func customDidSelect() {\n super.customDidSelect()\n guard let presentationMode = presentationMode, !isDisabled else { return }\n if let controller = presentationMode.makeController() {\n controller.row = self\n controller.title = selectorTitle ?? controller.title\n onPresentCallback?(cell.formViewController()!, controller)\n presentationMode.present(controller, row: self, presentingController: self.cell.formViewController()!)\n } else {\n presentationMode.present(nil, row: self, presentingController: self.cell.formViewController()!)\n }\n }\n\n /**\n Prepares the pushed row setting its title and completion callback.\n */\n open override func prepare(for segue: UIStoryboardSegue) {\n super.prepare(for: segue)\n guard let rowVC = segue.destination as Any as? SelectorViewController\u0026lt;SelectorRow\u0026lt;Cell\u0026gt;\u0026gt; else { return }\n rowVC.title = selectorTitle ?? rowVC.title\n rowVC.onDismissCallback = presentationMode?.onDismissCallback ?? rowVC.onDismissCallback\n onPresentCallback?(cell.formViewController()!, rowVC)\n rowVC.row = self\n }\n}\n\n\n// SelectorRow conforms to PresenterRowType\npublic final class CustomPushRow\u0026lt;T: Equatable\u0026gt;: SelectorRow\u0026lt;PushSelectorCell\u0026lt;T\u0026gt;\u0026gt;, RowType {\n\n public required init(tag: String?) {\n super.init(tag: tag)\n presentationMode = .show(controllerProvider: ControllerProvider.callback {\n return SelectorViewController\u0026lt;T\u0026gt;(){ _ in }\n }, onDismiss: { vc in\n _ = vc.navigationController?.popViewController(animated: true)\n })\n }\n}\"\u003e\u003cpre\u003e/// Generic row type where a user must select a value among several options.\n\u003cspan class=\"pl-k\"\u003eopen\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eclass\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSelectorRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003eCell\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCellType\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eOptionsRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eCell\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003ePresenterRowType\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ewhere\u003c/span\u003e Cell\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eBaseCell\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n\n /// Defines how the view controller will be presented, pushed, etc.\n \u003cspan class=\"pl-k\"\u003eopen\u003c/span\u003e \u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003e\u003cspan class=\"pl-c1\"\u003epresentationMode\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003ePresentationMode\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eSelectorViewController\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eSelectorRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eCell\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\n\n /// Will be called before the presentation occurs.\n \u003cspan class=\"pl-k\"\u003eopen\u003c/span\u003e \u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003e\u003cspan class=\"pl-c1\"\u003eonPresentCallback\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eFormViewController\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSelectorViewController\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eSelectorRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eCell\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eVoid\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003erequired\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-v\"\u003einit\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n super\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003einit\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e tag\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n /**\n Extends `didSelect` method\n */\n \u003cspan class=\"pl-k\"\u003eopen\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003eoverride\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e customDidSelect\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n super\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003ecustomDidSelect\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eguard\u003c/span\u003e \u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e presentationMode \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e presentationMode\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e !isDisabled \u003cspan class=\"pl-k\"\u003eelse\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e controller \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e presentationMode\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003emakeController\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n controller\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003erow \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eself\u003c/span\u003e\n controller\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e selectorTitle \u003cspan class=\"pl-c1\"\u003e??\u003c/span\u003e controller\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle\n \u003cspan class=\"pl-en\"\u003eonPresentCallback\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003ecell\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eformViewController\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e!\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e controller\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n presentationMode\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003epresent\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003econtroller\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e row\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eself\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e presentingController\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eself\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ecell\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eformViewController\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e!\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eelse\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n presentationMode\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003epresent\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003enil\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e row\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eself\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e presentingController\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eself\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ecell\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eformViewController\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e!\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n /**\n Prepares the pushed row setting its title and completion callback.\n */\n \u003cspan class=\"pl-k\"\u003eopen\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003eoverride\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e prepare\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003efor segue\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eUIStoryboardSegue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n super\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eprepare\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003efor\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e segue\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eguard\u003c/span\u003e \u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e rowVC \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e segue\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003edestination \u003cspan class=\"pl-k\"\u003eas\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eAny\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eas?\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSelectorViewController\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eSelectorRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eCell\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eelse\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n rowVC\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e selectorTitle \u003cspan class=\"pl-c1\"\u003e??\u003c/span\u003e rowVC\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle\n rowVC\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eonDismissCallback \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e presentationMode\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eonDismissCallback \u003cspan class=\"pl-c1\"\u003e??\u003c/span\u003e rowVC\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eonDismissCallback\n \u003cspan class=\"pl-en\"\u003eonPresentCallback\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003ecell\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eformViewController\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e!\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e rowVC\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n rowVC\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003erow \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eself\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n\n// SelectorRow conforms to PresenterRowType\n\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003efinal\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eclass\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCustomPushRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003eT\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eEquatable\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSelectorRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003ePushSelectorCell\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRowType\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n\n \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u003cspan class=\"pl-k\"\u003erequired\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-v\"\u003einit\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n super\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003einit\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e tag\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n presentationMode \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eshow\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003econtrollerProvider\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eControllerProvider\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003ecallback\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSelectorViewController\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e _ \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e onDismiss\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e vc \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n _ \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e vc\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003enavigationController\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003epopViewController\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eanimated\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSubclassing cells using the same row\u003c/h3\u003e\u003ca id=\"user-content-subclassing-cells-using-the-same-row\" class=\"anchor\" aria-label=\"Permalink: Subclassing cells using the same row\" href=\"#subclassing-cells-using-the-same-row\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSometimes we want to change the UI look of one of our rows but without changing the row type and all the logic associated to one row.\nThere is currently one way to do this \u003cstrong\u003eif you are using cells that are instantiated from nib files\u003c/strong\u003e. Currently, none of Eureka's core rows are instantiated from nib files but some of the custom rows in \u003ca href=\"https://github.com/EurekaCommunity\"\u003eEurekaCommunity\u003c/a\u003e are, in particular the \u003ca href=\"https://github.com/EurekaCommunity/PostalAddressRow\"\u003ePostalAddressRow\u003c/a\u003e which was moved there.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWhat you have to do is:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eCreate a nib file containing the cell you want to create.\u003c/li\u003e\n\u003cli\u003eThen set the class of the cell to be the existing cell you want to modify (if you want to change something more apart from pure UI then you should subclass that cell). Make sure the module of that class is correctly set\u003c/li\u003e\n\u003cli\u003eConnect the outlets to your class\u003c/li\u003e\n\u003cli\u003eTell your row to use the new nib file. This is done by setting the \u003ccode\u003ecellProvider\u003c/code\u003e variable to use this nib. You should do this in the initialiser, either in each concrete instantiation or using the \u003ccode\u003edefaultRowInitializer\u003c/code\u003e. For example:\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026lt;\u0026lt;\u0026lt; PostalAddressRow() {\n $0.cellProvider = CellProvider\u0026lt;PostalAddressCell\u0026gt;(nibName: \u0026quot;CustomNib\u0026quot;, bundle: Bundle.main)\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e PostalAddressRow\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ecellProvider \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCellProvider\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003ePostalAddressCell\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003enibName\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eCustomNib\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e bundle\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eBundle\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003emain\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou could also create a new row for this. In that case try to inherit from the same superclass as the row you want to change to inherit its logic.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThere are some things to consider when you do this:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eIf you want to see an example have a look at the \u003ca href=\"https://github.com/EurekaCommunity/PostalAddressRow\"\u003ePostalAddressRow\u003c/a\u003e or the \u003ca href=\"https://github.com/EurekaCommunity/CreditCardRow\"\u003eCreditCardRow\u003c/a\u003e which have use a custom nib file in their examples.\u003c/li\u003e\n\u003cli\u003eIf you get an error saying \u003ccode\u003eUnknown class \u0026lt;YOUR_CLASS_NAME\u0026gt; in Interface Builder file\u003c/code\u003e, it might be that you have to instantiate that new type somewhere in your code to load it in the runtime. Calling \u003ccode\u003elet t = YourClass.self\u003c/code\u003e helped in my case.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRow catalog\u003c/h2\u003e\u003ca id=\"user-content-row-catalog\" class=\"anchor\" aria-label=\"Permalink: Row catalog\" href=\"#row-catalog\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eControls Rows\u003c/h3\u003e\u003ca id=\"user-content-controls-rows\" class=\"anchor\" aria-label=\"Permalink: Controls Rows\" href=\"#controls-rows\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n \u003ctbody\u003e\u003ctr\u003e\n \u003ctd\u003e\u003cb\u003eLabel Row\u003c/b\u003e\u003cbr\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/LabelRow.png\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/LabelRow.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003cbr\u003e\u003cbr\u003e\n \u003c/td\u003e\n \u003ctd\u003e\u003cb\u003eButton Row\u003c/b\u003e\u003cbr\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/ButtonRow.png\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/ButtonRow.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003cbr\u003e\u003cbr\u003e\n \u003c/td\u003e\n \u003ctd\u003e\u003cb\u003eCheck Row\u003c/b\u003e\u003cbr\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/CheckRow.png\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/CheckRow.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003cbr\u003e\u003cbr\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003cb\u003eSwitch Row\u003c/b\u003e\u003cbr\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/SwitchRow.png\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/SwitchRow.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003cbr\u003e\u003cbr\u003e\n \u003c/td\u003e\n \u003ctd\u003e\u003cb\u003eSlider Row\u003c/b\u003e\u003cbr\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/SliderRow.png\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/SliderRow.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003cbr\u003e\u003cbr\u003e\n \u003c/td\u003e\n \u003ctd\u003e\u003cb\u003eStepper Row\u003c/b\u003e\u003cbr\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/StepperRow.png\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/StepperRow.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003cbr\u003e\u003cbr\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003cb\u003eText Area Row\u003c/b\u003e\u003cbr\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/TextAreaRow.png\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/TextAreaRow.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003cbr\u003e\u003cbr\u003e\n \u003c/td\u003e\n \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eField Rows\u003c/h3\u003e\u003ca id=\"user-content-field-rows\" class=\"anchor\" aria-label=\"Permalink: Field Rows\" href=\"#field-rows\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThese rows have a textfield on the right side of the cell. The difference between each one of them consists in a different capitalization, autocorrection and keyboard type configuration.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n \u003ctd\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/CatalogFieldRows.jpg\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/CatalogFieldRows.jpg\" width=\"300\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003c/td\u003e\n \u003ctd\u003e\n TextRow\u003cbr\u003e\u003cbr\u003e\n NameRow\u003cbr\u003e\u003cbr\u003e\n URLRow\u003cbr\u003e\u003cbr\u003e\n IntRow\u003cbr\u003e\u003cbr\u003e\n PhoneRow\u003cbr\u003e\u003cbr\u003e\n PasswordRow\u003cbr\u003e\u003cbr\u003e\n EmailRow\u003cbr\u003e\u003cbr\u003e\n DecimalRow\u003cbr\u003e\u003cbr\u003e\n TwitterRow\u003cbr\u003e\u003cbr\u003e\n AccountRow\u003cbr\u003e\u003cbr\u003e\n ZipCodeRow\n \u003c/td\u003e\n\u003c/tr\u003e\u003ctr\u003e\n\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eAll of the \u003ccode\u003eFieldRow\u003c/code\u003e subtypes above have a \u003ccode\u003eformatter\u003c/code\u003e property of type \u003ca href=\"https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFormatter_Class/\" rel=\"nofollow\"\u003e\u003ccode\u003eNSFormatter\u003c/code\u003e\u003c/a\u003e which can be set to determine how that row's value should be displayed. A custom formatter for numbers with two digits after the decimal mark is included with Eureka (\u003ccode\u003eDecimalFormatter\u003c/code\u003e). The Example project also contains a \u003ccode\u003eCurrencyFormatter\u003c/code\u003e which displays a number as currency according to the user's locale.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBy default, setting a row's \u003ccode\u003eformatter\u003c/code\u003e only affects how a value is displayed when it is not being edited. To also format the value while the row is being edited, set \u003ccode\u003euseFormatterDuringInput\u003c/code\u003e to \u003ccode\u003etrue\u003c/code\u003e when initializing the row. Formatting the value as it is being edited may require updating the cursor position and Eureka provides the following protocol that your formatter should conform to in order to handle cursor position:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"public protocol FormatterProtocol {\n func getNewPosition(forPosition forPosition: UITextPosition, inTextInput textInput: UITextInput, oldValue: String?, newValue: String?) -\u0026gt; UITextPosition\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eprotocol\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eFormatterProtocol\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e getNewPosition\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eforPosition forPosition\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eUITextPosition\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e inTextInput textInput\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eUITextInput\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e oldValue\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e newValue\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eUITextPosition\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAdditionally, \u003ccode\u003eFieldRow\u003c/code\u003e subtypes have a \u003ccode\u003euseFormatterOnDidBeginEditing\u003c/code\u003e property. When using a \u003ccode\u003eDecimalRow\u003c/code\u003e with a formatter that allows decimal values and conforms to the user's locale (e.g. \u003ccode\u003eDecimalFormatter\u003c/code\u003e), if \u003ccode\u003euseFormatterDuringInput\u003c/code\u003e is \u003ccode\u003efalse\u003c/code\u003e, \u003ccode\u003euseFormatterOnDidBeginEditing\u003c/code\u003e must be set to \u003ccode\u003etrue\u003c/code\u003e so that the decimal mark in the value being edited matches the decimal mark on the keyboard.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDate Rows\u003c/h3\u003e\u003ca id=\"user-content-date-rows\" class=\"anchor\" aria-label=\"Permalink: Date Rows\" href=\"#date-rows\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eDate Rows hold a Date and allow us to set up a new value through UIDatePicker control. The mode of the UIDatePicker and the way how the date picker view is shown is what changes between them.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\n\u003cb\u003eDate Row\u003c/b\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowGifs/EurekaDateRow.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowGifs/EurekaDateRow.gif\" height=\"220\" width=\"230\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003cbr\u003e\nPicker shown in the keyboard.\n\n\u003c/td\u003e\n\u003ctd\u003e\n\u003cb\u003eDate Row (Inline)\u003c/b\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowGifs/EurekaDateInlineRow.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowGifs/EurekaDateInlineRow.gif\" height=\"220\" width=\"210\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003cbr\u003e\nThe row expands.\n\n\u003c/td\u003e\n\u003ctd\u003e\n\u003cb\u003eDate Row (Picker)\u003c/b\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowGifs/EurekaDatePickerRow.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowGifs/EurekaDatePickerRow.gif\" height=\"220\" width=\"210\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003cbr\u003e\nThe picker is always visible.\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eWith those 3 styles (Normal, Inline \u0026amp; Picker), Eureka includes:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eDateRow\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTimeRow\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDateTimeRow\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCountDownRow\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOption Rows\u003c/h3\u003e\u003ca id=\"user-content-option-rows\" class=\"anchor\" aria-label=\"Permalink: Option Rows\" href=\"#option-rows\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThese are rows with a list of options associated from which the user must choose.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\u0026lt;\u0026lt;\u0026lt; ActionSheetRow\u0026lt;String\u0026gt;() {\n $0.title = \u0026quot;ActionSheetRow\u0026quot;\n $0.selectorTitle = \u0026quot;Pick a number\u0026quot;\n $0.options = [\u0026quot;One\u0026quot;,\u0026quot;Two\u0026quot;,\u0026quot;Three\u0026quot;]\n $0.value = \u0026quot;Two\u0026quot; // initially selected\n }\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u0026lt;\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eActionSheetRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eActionSheetRow\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eselectorTitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ePick a number\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eoptions \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eOne\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eTwo\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eThree\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalue \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eTwo\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e // initially selected\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd width=\"25%\"\u003e\n\u003cb\u003eAlert Row\u003c/b\u003e\u003cbr\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/AlertRow.jpeg\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/AlertRow.jpeg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003cbr\u003e\nWill show an alert with the options to choose from.\n\n\u003c/td\u003e\n\u003ctd width=\"25%\"\u003e\n\u003cb\u003eActionSheet Row\u003c/b\u003e\u003cbr\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/ActionSheetRow.jpeg\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/ActionSheetRow.jpeg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003cbr\u003e\nWill show an action sheet with the options to choose from.\n\n\u003c/td\u003e\n\u003ctd width=\"25%\"\u003e\n\u003cb\u003ePush Row\u003c/b\u003e\u003cbr\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/PushRow.jpeg\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/PushRow.jpeg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003cbr\u003e\nWill push to a new controller from where to choose options listed using Check rows.\n\n\u003c/td\u003e\n\u003ctd width=\"25%\"\u003e\n\u003cb\u003eMultiple Selector Row\u003c/b\u003e\u003cbr\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/MultipleSelectorRow.jpeg\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/MultipleSelectorRow.jpeg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003cbr\u003e\nLike PushRow but allows the selection of multiple options.\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n \u003ctbody\u003e\u003ctr\u003e\n \u003ctd\u003e\u003cb\u003eSegmented Row\u003c/b\u003e\u003cbr\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/SegmentedRow.png\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/SegmentedRow.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \n \u003c/td\u003e\n \u003ctd\u003e\u003cb\u003eSegmented Row (w/Title)\u003c/b\u003e\u003cbr\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/SegmentedRowWithTitle.png\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/SegmentedRowWithTitle.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \n \u003c/td\u003e\n \u003ctd\u003e\u003cb\u003ePicker Row\u003c/b\u003e\u003cbr\u003e\n \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/PickerRow.png\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/PickerRow.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n \u003cbr\u003ePresents options of a generic type through a picker view\n \u003cbr\u003e\u003cb\u003e(There is also Picker Inline Row)\u003c/b\u003e\n \n \u003c/td\u003e\n \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBuilt your own custom row?\u003c/h3\u003e\u003ca id=\"user-content-built-your-own-custom-row\" class=\"anchor\" aria-label=\"Permalink: Built your own custom row?\" href=\"#built-your-own-custom-row\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eLet us know about it, we would be glad to mention it here. :)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eLocationRow\u003c/strong\u003e (Included as custom row in the example project)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/xmartlabs/Eureka/blob/master/Example/Media/EurekaLocationRow.gif\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/Example/Media/EurekaLocationRow.gif\" width=\"300\" alt=\"Screenshot of Location Row\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInstallation\u003c/h2\u003e\u003ca id=\"user-content-installation\" class=\"anchor\" aria-label=\"Permalink: Installation\" href=\"#installation\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCocoaPods\u003c/h4\u003e\u003ca id=\"user-content-cocoapods\" class=\"anchor\" aria-label=\"Permalink: CocoaPods\" href=\"#cocoapods\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://cocoapods.org/\" rel=\"nofollow\"\u003eCocoaPods\u003c/a\u003e is a dependency manager for Cocoa projects.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSpecify Eureka into your project's \u003ccode\u003ePodfile\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-ruby notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"source 'https://github.com/CocoaPods/Specs.git'\nplatform :ios, '9.0'\nuse_frameworks!\n\npod 'Eureka'\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003esource\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'https://github.com/CocoaPods/Specs.git'\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003eplatform\u003c/span\u003e \u003cspan class=\"pl-pds\"\u003e:ios\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'9.0'\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003euse_frameworks!\u003c/span\u003e\n\n\u003cspan class=\"pl-en\"\u003epod\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e'Eureka'\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThen run the following command:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ pod install\"\u003e\u003cpre\u003e$ pod install\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSwift Package Manager\u003c/h4\u003e\u003ca id=\"user-content-swift-package-manager\" class=\"anchor\" aria-label=\"Permalink: Swift Package Manager\" href=\"#swift-package-manager\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://swift.org/package-manager/\" rel=\"nofollow\"\u003eSwift Package Manager\u003c/a\u003e is a tool for managing the distribution of Swift code.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAfter you set up your \u003ccode\u003ePackage.swift\u003c/code\u003e manifest file, you can add Eureka as a dependency by adding it to the dependencies value of your \u003ccode\u003ePackage.swift\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003edependencies: [\n.package(url: \"\u003ca href=\"https://github.com/xmartlabs/Eureka.git\"\u003ehttps://github.com/xmartlabs/Eureka.git\u003c/a\u003e\", from: \"5.5.0\")\n]\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCarthage\u003c/h4\u003e\u003ca id=\"user-content-carthage\" class=\"anchor\" aria-label=\"Permalink: Carthage\" href=\"#carthage\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/Carthage/Carthage\"\u003eCarthage\u003c/a\u003e is a simple, decentralized dependency manager for Cocoa.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSpecify Eureka into your project's \u003ccode\u003eCartfile\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"github \u0026quot;xmartlabs/Eureka\u0026quot; ~\u0026gt; 5.5\"\u003e\u003cpre lang=\"ogdl\" class=\"notranslate\"\u003e\u003ccode\u003egithub \"xmartlabs/Eureka\" ~\u0026gt; 5.5\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eManually as Embedded Framework\u003c/h4\u003e\u003ca id=\"user-content-manually-as-embedded-framework\" class=\"anchor\" aria-label=\"Permalink: Manually as Embedded Framework\" href=\"#manually-as-embedded-framework\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eClone Eureka as a git \u003ca href=\"http://git-scm.com/docs/git-submodule\" rel=\"nofollow\"\u003esubmodule\u003c/a\u003e by running the following command from your project root git folder.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ git submodule add https://github.com/xmartlabs/Eureka.git\"\u003e\u003cpre\u003e$ git submodule add https://github.com/xmartlabs/Eureka.git\u003c/pre\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eOpen Eureka folder that was created by the previous git submodule command and drag the Eureka.xcodeproj into the Project Navigator of your application's Xcode project.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eSelect the Eureka.xcodeproj in the Project Navigator and verify the deployment target matches with your application deployment target.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eSelect your project in the Xcode Navigation and then select your application target from the sidebar. Next select the \"General\" tab and click on the + button under the \"Embedded Binaries\" section.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eSelect \u003ccode\u003eEureka.framework\u003c/code\u003e and we are done!\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eGetting involved\u003c/h2\u003e\u003ca id=\"user-content-getting-involved\" class=\"anchor\" aria-label=\"Permalink: Getting involved\" href=\"#getting-involved\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eIf you \u003cstrong\u003ewant to contribute\u003c/strong\u003e please feel free to \u003cstrong\u003esubmit pull requests\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eIf you \u003cstrong\u003ehave a feature request\u003c/strong\u003e please \u003cstrong\u003eopen an issue\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eIf you \u003cstrong\u003efound a bug\u003c/strong\u003e check older issues before submitting an issue.\u003c/li\u003e\n\u003cli\u003eIf you \u003cstrong\u003eneed help\u003c/strong\u003e or would like to \u003cstrong\u003eask general question\u003c/strong\u003e, use \u003ca href=\"http://stackoverflow.com/questions/tagged/eureka-forms\" rel=\"nofollow\"\u003eStackOverflow\u003c/a\u003e. (Tag \u003ccode\u003eeureka-forms\u003c/code\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eBefore contribute check the \u003ca href=\"/xmartlabs/Eureka/blob/master/CONTRIBUTING.md\"\u003eCONTRIBUTING\u003c/a\u003e file for more info.\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf you use \u003cstrong\u003eEureka\u003c/strong\u003e in your app We would love to hear about it! Drop us a line on \u003ca href=\"https://twitter.com/xmartlabs\" rel=\"nofollow\"\u003etwitter\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAuthors\u003c/h2\u003e\u003ca id=\"user-content-authors\" class=\"anchor\" aria-label=\"Permalink: Authors\" href=\"#authors\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mtnBarreto\"\u003eMartin Barreto\u003c/a\u003e (\u003ca href=\"https://twitter.com/mtnBarreto\" rel=\"nofollow\"\u003e@mtnBarreto\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mats-claassen\"\u003eMathias Claassen\u003c/a\u003e (\u003ca href=\"https://twitter.com/mClaassen26\" rel=\"nofollow\"\u003e@mClaassen26\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFAQ\u003c/h2\u003e\u003ca id=\"user-content-faq\" class=\"anchor\" aria-label=\"Permalink: FAQ\" href=\"#faq\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow to change the text representation of the row value shown in the cell.\u003c/h4\u003e\u003ca id=\"user-content-how-to-change-the-text-representation-of-the-row-value-shown-in-the--cell\" class=\"anchor\" aria-label=\"Permalink: How to change the text representation of the row value shown in the cell.\" href=\"#how-to-change-the-text-representation-of-the-row-value-shown-in-the--cell\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eEvery row has the following property:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"/// Block variable used to get the String that should be displayed for the value of this row.\npublic var displayValueFor: ((T?) -\u0026gt; String?)? = {\n return $0.map { String(describing: $0) }\n}\"\u003e\u003cpre\u003e/// Block variable used to get the String that should be displayed for the value of this row.\n\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003edisplayValueFor\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003emap\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003edescribing\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e $0\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can set \u003ccode\u003edisplayValueFor\u003c/code\u003e according the string value you want to display.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow to get a Row using its tag value\u003c/h4\u003e\u003ca id=\"user-content-how-to-get-a-row-using-its-tag-value\" class=\"anchor\" aria-label=\"Permalink: How to get a Row using its tag value\" href=\"#how-to-get-a-row-using-its-tag-value\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWe can get a particular row by invoking any of the following functions exposed by the \u003ccode\u003eForm\u003c/code\u003e class:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"public func rowBy\u0026lt;T: Equatable\u0026gt;(tag: String) -\u0026gt; RowOf\u0026lt;T\u0026gt;?\npublic func rowBy\u0026lt;Row: RowType\u0026gt;(tag: String) -\u0026gt; Row?\npublic func rowBy(tag: String) -\u0026gt; BaseRow?\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e rowBy\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003eT\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eEquatable\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRowOf\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eT\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e rowBy\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003eRow\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRowType\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\npublic \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e rowBy\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eString\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eBaseRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor instance:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"let dateRow : DateRow? = form.rowBy(tag: \u0026quot;dateRowTag\u0026quot;)\nlet labelRow: LabelRow? = form.rowBy(tag: \u0026quot;labelRowTag\u0026quot;)\n\nlet dateRow2: Row\u0026lt;DateCell\u0026gt;? = form.rowBy(tag: \u0026quot;dateRowTag\u0026quot;)\n\nlet labelRow2: BaseRow? = form.rowBy(tag: \u0026quot;labelRowTag\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003edateRow\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eDateRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e form\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003erowBy\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003edateRowTag\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003elabelRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eLabelRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e form\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003erowBy\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003elabelRowTag\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003edateRow2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eDateCell\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e form\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003erowBy\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003edateRowTag\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003elabelRow2\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eBaseRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e form\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003erowBy\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003elabelRowTag\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow to get a Section using its tag value\u003c/h4\u003e\u003ca id=\"user-content-how-to-get-a-section-using-its-tag-value\" class=\"anchor\" aria-label=\"Permalink: How to get a Section using its tag value\" href=\"#how-to-get-a-section-using-its-tag-value\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"let section: Section? = form.sectionBy(tag: \u0026quot;sectionTag\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003esection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e form\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003esectionBy\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etag\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003esectionTag\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow to set the form values using a dictionary\u003c/h4\u003e\u003ca id=\"user-content-how-to-set-the-form-values-using-a-dictionary\" class=\"anchor\" aria-label=\"Permalink: How to set the form values using a dictionary\" href=\"#how-to-set-the-form-values-using-a-dictionary\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eInvoking \u003ccode\u003esetValues(values: [String: Any?])\u003c/code\u003e which is exposed by \u003ccode\u003eForm\u003c/code\u003e class.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor example:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"form.setValues([\u0026quot;IntRowTag\u0026quot;: 8, \u0026quot;TextRowTag\u0026quot;: \u0026quot;Hello world!\u0026quot;, \u0026quot;PushRowTag\u0026quot;: Company(name:\u0026quot;Xmartlabs\u0026quot;)])\"\u003e\u003cpre\u003eform\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003esetValues\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eIntRowTag\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e8\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eTextRowTag\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eHello world!\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ePushRowTag\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eCompany\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003ename\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eXmartlabs\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWhere \u003ccode\u003e\"IntRowTag\"\u003c/code\u003e, \u003ccode\u003e\"TextRowTag\"\u003c/code\u003e, \u003ccode\u003e\"PushRowTag\"\u003c/code\u003e are row tags (each one uniquely identifies a row) and \u003ccode\u003e8\u003c/code\u003e, \u003ccode\u003e\"Hello world!\"\u003c/code\u003e, \u003ccode\u003eCompany(name:\"Xmartlabs\")\u003c/code\u003e are the corresponding row value to assign.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe value type of a row must match with the value type of the corresponding dictionary value otherwise nil will be assigned.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf the form was already displayed we have to reload the visible rows either by reloading the table view \u003ccode\u003etableView.reloadData()\u003c/code\u003e or invoking \u003ccode\u003eupdateCell()\u003c/code\u003e to each visible row.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRow does not update after changing hidden or disabled condition\u003c/h4\u003e\u003ca id=\"user-content-row-does-not-update-after-changing-hidden-or-disabled-condition\" class=\"anchor\" aria-label=\"Permalink: Row does not update after changing hidden or disabled condition\" href=\"#row-does-not-update-after-changing-hidden-or-disabled-condition\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAfter setting a condition, this condition is not automatically evaluated. If you want it to do so immediately you can call \u003ccode\u003e.evaluateHidden()\u003c/code\u003e or \u003ccode\u003e.evaluateDisabled()\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis functions are just called when a row is added to the form and when a row it depends on changes. If the condition is changed when the row is being displayed then it must be reevaluated manually.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eonCellUnHighlight doesn't get called unless onCellHighlight is also defined\u003c/h4\u003e\u003ca id=\"user-content-oncellunhighlight-doesnt-get-called-unless-oncellhighlight-is-also-defined\" class=\"anchor\" aria-label=\"Permalink: onCellUnHighlight doesn't get called unless onCellHighlight is also defined\" href=\"#oncellunhighlight-doesnt-get-called-unless-oncellhighlight-is-also-defined\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eLook at this \u003ca href=\"https://github.com/xmartlabs/Eureka/issues/96\" data-hovercard-type=\"issue\" data-hovercard-url=\"/xmartlabs/Eureka/issues/96/hovercard\"\u003eissue\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow to update a Section header/footer\u003c/h4\u003e\u003ca id=\"user-content-how-to-update-a-section-headerfooter\" class=\"anchor\" aria-label=\"Permalink: How to update a Section header/footer\" href=\"#how-to-update-a-section-headerfooter\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eSet up a new header/footer data ....\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"section.header = HeaderFooterView(title: \u0026quot;Header title \\(variable)\u0026quot;) // use String interpolation\n//or\nvar header = HeaderFooterView\u0026lt;UIView\u0026gt;(.class) // most flexible way to set up a header using any view type\nheader.height = { 60 } // height can be calculated\nheader.onSetupView = { view, section in // each time the view is about to be displayed onSetupView is invoked.\n view.backgroundColor = .orange\n}\nsection.header = header\"\u003e\u003cpre\u003esection\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eheader \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eHeaderFooterView\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003etitle\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eHeader title \u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e\\(\u003c/span\u003evariable\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e // use String interpolation\n//or\n\u003cspan class=\"pl-k\"\u003evar\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eheader\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eHeaderFooterView\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eUIView\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eclass\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e // most flexible way to set up a header using any view type\nheader\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eheight \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e60\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e // height can be calculated\nheader\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eonSetupView \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e view\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e section \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e // each time the view is about to be displayed onSetupView is invoked.\n view\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ebackgroundColor \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eorange\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\nsection\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eheader \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e header\u003c/pre\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eReload the Section to perform the changes\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"section.reload()\"\u003e\u003cpre\u003esection\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003ereload\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow to customize Selector and MultipleSelector option cells\u003c/h4\u003e\u003ca id=\"user-content-how-to-customize-selector-and-multipleselector-option-cells\" class=\"anchor\" aria-label=\"Permalink: How to customize Selector and MultipleSelector option cells\" href=\"#how-to-customize-selector-and-multipleselector-option-cells\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eselectableRowSetup\u003c/code\u003e, \u003ccode\u003eselectableRowCellUpdate\u003c/code\u003e and \u003ccode\u003eselectableRowCellSetup\u003c/code\u003e properties are provided to be able to customize SelectorViewController and MultipleSelectorViewController selectable cells.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"let row = PushRow\u0026lt;Emoji\u0026gt;() {\n $0.title = \u0026quot;PushRow\u0026quot;\n $0.options = [💁🏻, 🍐, 👦🏼, 🐗, 🐼, 🐻]\n $0.value = 👦🏼\n $0.selectorTitle = \u0026quot;Choose an Emoji!\u0026quot;\n }.onPresent { from, to in\n to.dismissOnSelection = false\n to.dismissOnChange = false\n to.selectableRowSetup = { row in\n row.cellProvider = CellProvider\u0026lt;ListCheckCell\u0026lt;Emoji\u0026gt;\u0026gt;(nibName: \u0026quot;EmojiCell\u0026quot;, bundle: Bundle.main)\n }\n to.selectableRowCellUpdate = { cell, row in\n cell.textLabel?.text = \u0026quot;Text \u0026quot; + row.selectableValue! // customization\n cell.detailTextLabel?.text = \u0026quot;Detail \u0026quot; + row.selectableValue!\n }\n }\n\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003elet\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003erow\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003ePushRow\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eEmoji\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ePushRow\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eoptions \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e💁🏻\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e 🍐\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e 👦🏼\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e 🐗\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e 🐼\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e 🐻\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003evalue \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e 👦🏼\n $0\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eselectorTitle \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eChoose an Emoji!\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eonPresent\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e from\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e to \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n to\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003edismissOnSelection \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003efalse\u003c/span\u003e\n to\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003edismissOnChange \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003efalse\u003c/span\u003e\n to\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eselectableRowSetup \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e row \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n row\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003ecellProvider \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCellProvider\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eListCheckCell\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eEmoji\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003enibName\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eEmojiCell\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e bundle\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eBundle\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003emain\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n to\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eselectableRowCellUpdate \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e cell\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e row \u003cspan class=\"pl-k\"\u003ein\u003c/span\u003e\n cell\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etextLabel\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etext \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eText \u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e row\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eselectableValue! // customization\n cell\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003edetailTextLabel\u003cspan class=\"pl-c1\"\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003etext \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eDetail \u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\"\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e row\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eselectableValue!\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n \u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDon't want to use Eureka custom operators?\u003c/h4\u003e\u003ca id=\"user-content-dont-want-to-use-eureka-custom-operators\" class=\"anchor\" aria-label=\"Permalink: Don't want to use Eureka custom operators?\" href=\"#dont-want-to-use-eureka-custom-operators\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAs we've said \u003ccode\u003eForm\u003c/code\u003e and \u003ccode\u003eSection\u003c/code\u003e types conform to \u003ccode\u003eMutableCollection\u003c/code\u003e and \u003ccode\u003eRangeReplaceableCollection\u003c/code\u003e. A Form is a collection of Sections and a Section is a collection of Rows.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eRangeReplaceableCollection\u003c/code\u003e protocol extension provides many useful methods to modify collection.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"extension RangeReplaceableCollection {\n public mutating func append(_ newElement: Self.Element)\n public mutating func append\u0026lt;S\u0026gt;(contentsOf newElements: S) where S : Sequence, Self.Element == S.Element\n public mutating func insert(_ newElement: Self.Element, at i: Self.Index)\n public mutating func insert\u0026lt;S\u0026gt;(contentsOf newElements: S, at i: Self.Index) where S : Collection, Self.Element == S.Element\n public mutating func remove(at i: Self.Index) -\u0026gt; Self.Element\n public mutating func removeSubrange(_ bounds: Range\u0026lt;Self.Index\u0026gt;)\n public mutating func removeFirst(_ n: Int)\n public mutating func removeFirst() -\u0026gt; Self.Element\n public mutating func removeAll(keepingCapacity keepCapacity: Bool)\n public mutating func reserveCapacity(_ n: Self.IndexDistance)\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eextension\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRangeReplaceableCollection\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003emutating\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e append\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e_ newElement\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSelf\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eElement\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003emutating\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e append\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003eS\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003econtentsOf newElements\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eS\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ewhere\u003c/span\u003e S \u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSequence\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e Self\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eElement \u003cspan class=\"pl-c1\"\u003e==\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eS\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eElement\u003c/span\u003e\n public \u003cspan class=\"pl-k\"\u003emutating\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e insert\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e_ newElement\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e Self\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eElement\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e at i\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSelf\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eIndex\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003emutating\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e insert\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003eS\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003econtentsOf newElements\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eS\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e at i\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSelf\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eIndex\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ewhere\u003c/span\u003e S \u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCollection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e Self\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eElement \u003cspan class=\"pl-c1\"\u003e==\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eS\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eElement\u003c/span\u003e\n public \u003cspan class=\"pl-k\"\u003emutating\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e remove\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eat i\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e Self\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eIndex\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e Self\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eElement\n \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003emutating\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e removeSubrange\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e_ bounds\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eRange\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eSelf\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eIndex\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003emutating\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e removeFirst\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e_ n\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eInt\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003emutating\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e removeFirst\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSelf\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eElement\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003emutating\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e removeAll\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003ekeepingCapacity keepCapacity\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eBool\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-k\"\u003emutating\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e reserveCapacity\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e_ n\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSelf\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003eIndexDistance\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThese methods are used internally to implement the custom operators as shown bellow:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-swift notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"public func +++(left: Form, right: Section) -\u0026gt; Form {\n left.append(right)\n return left\n}\n\npublic func +=\u0026lt;C : Collection\u0026gt;(inout lhs: Form, rhs: C) where C.Element == Section {\n lhs.append(contentsOf: rhs)\n}\n\npublic func \u0026lt;\u0026lt;\u0026lt;(left: Section, right: BaseRow) -\u0026gt; Section {\n left.append(right)\n return left\n}\n\npublic func +=\u0026lt;C : Collection\u0026gt;(inout lhs: Section, rhs: C) where C.Element == BaseRow {\n lhs.append(contentsOf: rhs)\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+++\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eleft\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eForm\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e right\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eForm\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n left\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eappend\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eright\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e left\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+=\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003eC \u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCollection\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003einout lhs\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eForm\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e rhs\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eC\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ewhere\u003c/span\u003e C\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eElement \u003cspan class=\"pl-c1\"\u003e==\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSection\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n lhs\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eappend\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003econtentsOf\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e rhs\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eleft\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e right\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eBaseRow\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSection\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n left\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eappend\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003eright\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e left\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003epublic\u003c/span\u003e \u003cspan class=\"pl-en\"\u003efunc\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+=\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026lt;\u003c/span\u003eC \u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eCollection\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003einout lhs\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eSection\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e,\u003c/span\u003e rhs\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eC\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ewhere\u003c/span\u003e C\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003eElement \u003cspan class=\"pl-c1\"\u003e==\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003eBaseRow\u003c/span\u003e \u003cspan class=\"pl-kos\"\u003e{\u003c/span\u003e\n lhs\u003cspan class=\"pl-kos\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-en\"\u003eappend\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003econtentsOf\u003cspan class=\"pl-kos\"\u003e:\u003c/span\u003e rhs\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\n\u003cspan class=\"pl-kos\"\u003e}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can see how the rest of custom operators are implemented \u003ca href=\"https://github.com/xmartlabs/Eureka/blob/master/Source/Core/Operators.swift\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIt's up to you to decide if you want to use Eureka custom operators or not.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHow to set up your form from a storyboard\u003c/h4\u003e\u003ca id=\"user-content-how-to-set-up-your-form-from-a-storyboard\" class=\"anchor\" aria-label=\"Permalink: How to set up your form from a storyboard\" href=\"#how-to-set-up-your-form-from-a-storyboard\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe form is always displayed in a \u003ccode\u003eUITableView\u003c/code\u003e. You can set up your view controller in a storyboard and add a UITableView where you want it to be and then connect the outlet to FormViewController's \u003ccode\u003etableView\u003c/code\u003e variable. This allows you to define a custom frame (possibly with constraints) for your form.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAll of this can also be done by programmatically changing frame, margins, etc. of the \u003ccode\u003etableView\u003c/code\u003e of your FormViewController.\u003c/p\u003e\n\n\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDonate to Eureka\u003c/h1\u003e\u003ca id=\"user-content-donate-to-eureka\" class=\"anchor\" aria-label=\"Permalink: Donate to Eureka\" href=\"#donate-to-eureka\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSo we can make Eureka even better!\u003cbr\u003e\u003cbr\u003e\n\u003ca href=\"https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026amp;hosted_button_id=HRMAH7WZ4QQ8E\" rel=\"nofollow\"\u003e\u003cimg src=\"/xmartlabs/Eureka/raw/master/donate.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eChange Log\u003c/h1\u003e\u003ca id=\"user-content-change-log\" class=\"anchor\" aria-label=\"Permalink: Change Log\" href=\"#change-log\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis can be found in the \u003ca href=\"/xmartlabs/Eureka/blob/master/CHANGELOG.md\"\u003eCHANGELOG.md\u003c/a\u003e file.\u003c/p\u003e\n\u003c/article\u003e","loaded":true,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":[{"level":2,"text":"Overview","anchor":"overview","htmlText":"Overview"},{"level":2,"text":"Contents","anchor":"contents","htmlText":"Contents"},{"level":2,"text":"Requirements (for latest release)","anchor":"requirements-for-latest-release","htmlText":"Requirements (for latest release)"},{"level":3,"text":"Example project","anchor":"example-project","htmlText":"Example project"},{"level":2,"text":"Usage","anchor":"usage","htmlText":"Usage"},{"level":3,"text":"How to create a form","anchor":"how-to-create-a-form","htmlText":"How to create a form"},{"level":4,"text":"Configuring the keyboard navigation accesory","anchor":"configuring-the-keyboard-navigation-accesory","htmlText":"Configuring the keyboard navigation accesory"},{"level":3,"text":"Getting row values","anchor":"getting-row-values","htmlText":"Getting row values"},{"level":3,"text":"Operators","anchor":"operators","htmlText":"Operators"},{"level":4,"text":"+++ Add a section","anchor":"-add-a-section","htmlText":"+++ Add a section"},{"level":4,"text":"\u003c\u003c\u003c Insert a row","anchor":"-insert-a-row","htmlText":"\u0026lt;\u0026lt;\u0026lt; Insert a row"},{"level":4,"text":"+= Append an array","anchor":"--append-an-array","htmlText":"+= Append an array"},{"level":3,"text":"Result builders","anchor":"result-builders","htmlText":"Result builders"},{"level":4,"text":"@SectionBuilder","anchor":"sectionbuilder","htmlText":"@SectionBuilder"},{"level":4,"text":"@FormBuilder","anchor":"formbuilder","htmlText":"@FormBuilder"},{"level":3,"text":"Using the callbacks","anchor":"using-the-callbacks","htmlText":"Using the callbacks"},{"level":4,"text":"Understanding Row and Cell","anchor":"understanding-row-and-cell","htmlText":"Understanding Row and Cell"},{"level":4,"text":"Callbacks list","anchor":"callbacks-list","htmlText":"Callbacks list"},{"level":3,"text":"Section Header and Footer","anchor":"section-header-and-footer","htmlText":"Section Header and Footer"},{"level":4,"text":"String title","anchor":"string-title","htmlText":"String title"},{"level":4,"text":"Custom view","anchor":"custom-view","htmlText":"Custom view"},{"level":3,"text":"Dynamically hide and show rows (or sections) ","anchor":"dynamically-hide-and-show-rows-or-sections--","htmlText":"Dynamically hide and show rows (or sections) "},{"level":4,"text":"Hiding using a function condition","anchor":"hiding-using-a-function-condition","htmlText":"Hiding using a function condition"},{"level":4,"text":"Hiding using an NSPredicate","anchor":"hiding-using-an-nspredicate","htmlText":"Hiding using an NSPredicate"},{"level":5,"text":"Sections","anchor":"sections","htmlText":"Sections"},{"level":5,"text":"Disabling rows","anchor":"disabling-rows","htmlText":"Disabling rows"},{"level":3,"text":"List Sections","anchor":"list-sections","htmlText":"List Sections"},{"level":5,"text":"What kind of rows can be used?","anchor":"what-kind-of-rows-can-be-used","htmlText":"What kind of rows can be used?"},{"level":5,"text":"Getting the selected rows","anchor":"getting-the-selected-rows","htmlText":"Getting the selected rows"},{"level":5,"text":"Grouping options in sections","anchor":"grouping-options-in-sections","htmlText":"Grouping options in sections"},{"level":3,"text":"Multivalued Sections","anchor":"multivalued-sections","htmlText":"Multivalued Sections"},{"level":4,"text":"How to create a multivalued section","anchor":"how-to-create-a-multivalued-section","htmlText":"How to create a multivalued section"},{"level":4,"text":"Editing mode","anchor":"editing-mode","htmlText":"Editing mode"},{"level":4,"text":"Custom add button","anchor":"custom-add-button","htmlText":"Custom add button"},{"level":3,"text":"Validations","anchor":"validations","htmlText":"Validations"},{"level":4,"text":"How to get validation errors","anchor":"how-to-get-validation-errors","htmlText":"How to get validation errors"},{"level":4,"text":"Note on types","anchor":"note-on-types","htmlText":"Note on types"},{"level":3,"text":"Swipe Actions","anchor":"swipe-actions","htmlText":"Swipe Actions"},{"level":2,"text":"Custom rows","anchor":"custom-rows","htmlText":"Custom rows"},{"level":3,"text":"Basic custom rows","anchor":"basic-custom-rows","htmlText":"Basic custom rows"},{"level":3,"text":"Custom inline rows","anchor":"custom-inline-rows","htmlText":"Custom inline rows"},{"level":3,"text":"Custom Presenter rows","anchor":"custom-presenter-rows","htmlText":"Custom Presenter rows"},{"level":3,"text":"Subclassing cells using the same row","anchor":"subclassing-cells-using-the-same-row","htmlText":"Subclassing cells using the same row"},{"level":2,"text":"Row catalog","anchor":"row-catalog","htmlText":"Row catalog"},{"level":3,"text":"Controls Rows","anchor":"controls-rows","htmlText":"Controls Rows"},{"level":3,"text":"Field Rows","anchor":"field-rows","htmlText":"Field Rows"},{"level":3,"text":"Date Rows","anchor":"date-rows","htmlText":"Date Rows"},{"level":3,"text":"Option Rows","anchor":"option-rows","htmlText":"Option Rows"},{"level":3,"text":"Built your own custom row?","anchor":"built-your-own-custom-row","htmlText":"Built your own custom row?"},{"level":2,"text":"Installation","anchor":"installation","htmlText":"Installation"},{"level":4,"text":"CocoaPods","anchor":"cocoapods","htmlText":"CocoaPods"},{"level":4,"text":"Swift Package Manager","anchor":"swift-package-manager","htmlText":"Swift Package Manager"},{"level":4,"text":"Carthage","anchor":"carthage","htmlText":"Carthage"},{"level":4,"text":"Manually as Embedded Framework","anchor":"manually-as-embedded-framework","htmlText":"Manually as Embedded Framework"},{"level":2,"text":"Getting involved","anchor":"getting-involved","htmlText":"Getting involved"},{"level":2,"text":"Authors","anchor":"authors","htmlText":"Authors"},{"level":2,"text":"FAQ","anchor":"faq","htmlText":"FAQ"},{"level":4,"text":"How to change the text representation of the row value shown in the cell.","anchor":"how-to-change-the-text-representation-of-the-row-value-shown-in-the--cell","htmlText":"How to change the text representation of the row value shown in the cell."},{"level":4,"text":"How to get a Row using its tag value","anchor":"how-to-get-a-row-using-its-tag-value","htmlText":"How to get a Row using its tag value"},{"level":4,"text":"How to get a Section using its tag value","anchor":"how-to-get-a-section-using-its-tag-value","htmlText":"How to get a Section using its tag value"},{"level":4,"text":"How to set the form values using a dictionary","anchor":"how-to-set-the-form-values-using-a-dictionary","htmlText":"How to set the form values using a dictionary"},{"level":4,"text":"Row does not update after changing hidden or disabled condition","anchor":"row-does-not-update-after-changing-hidden-or-disabled-condition","htmlText":"Row does not update after changing hidden or disabled condition"},{"level":4,"text":"onCellUnHighlight doesn't get called unless onCellHighlight is also defined","anchor":"oncellunhighlight-doesnt-get-called-unless-oncellhighlight-is-also-defined","htmlText":"onCellUnHighlight doesn't get called unless onCellHighlight is also defined"},{"level":4,"text":"How to update a Section header/footer","anchor":"how-to-update-a-section-headerfooter","htmlText":"How to update a Section header/footer"},{"level":4,"text":"How to customize Selector and MultipleSelector option cells","anchor":"how-to-customize-selector-and-multipleselector-option-cells","htmlText":"How to customize Selector and MultipleSelector option cells"},{"level":4,"text":"Don't want to use Eureka custom operators?","anchor":"dont-want-to-use-eureka-custom-operators","htmlText":"Don't want to use Eureka custom operators?"},{"level":4,"text":"How to set up your form from a storyboard","anchor":"how-to-set-up-your-form-from-a-storyboard","htmlText":"How to set up your form from a storyboard"},{"level":1,"text":"Donate to Eureka","anchor":"donate-to-eureka","htmlText":"Donate to Eureka"},{"level":1,"text":"Change Log","anchor":"change-log","htmlText":"Change Log"}],"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fxmartlabs%2FEureka"}},{"displayName":"LICENSE","repoName":"Eureka","refName":"master","path":"LICENSE","preferredFileType":"license","tabName":"License","richText":null,"loaded":false,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":null,"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fxmartlabs%2FEureka"}}],"overviewFilesProcessingTime":0}},"appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-7d7eb7c71814.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-96e76d5fdb2c.js","githubDevUrl":null,"enabled_features":{"copilot_workspace":null,"code_nav_ui_events":false,"overview_shared_code_dropdown_button":false,"react_blob_overlay":false,"accessible_code_button":true,"github_models_repo_integration":false}}}}</script> <div data-target="react-partial.reactRoot"><style data-styled="true" data-styled-version="5.3.11">.iVEunk{margin-top:16px;margin-bottom:16px;}/*!sc*/ .jzuOtQ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/ .bGojzy{margin-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;row-gap:16px;}/*!sc*/ .iNSVHo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding-bottom:16px;padding-top:8px;}/*!sc*/ .bVgnfw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:8px;}/*!sc*/ @media screen and (max-width:320px){.bVgnfw{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/ .CEgMp{position:relative;}/*!sc*/ @media screen and (max-width:380px){.CEgMp .ref-selector-button-text-container{max-width:80px;}}/*!sc*/ @media screen and (max-width:320px){.CEgMp{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}.CEgMp .overview-ref-selector{width:100%;}.CEgMp .overview-ref-selector > span{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;}.CEgMp .overview-ref-selector > span > span[data-component="text"]{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/ .gMOVLe[data-size="medium"]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:0;}/*!sc*/ .gMOVLe[data-size="medium"] svg{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gMOVLe[data-size="medium"] > span{width:inherit;}/*!sc*/ .gUkoLg{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .bZBlpz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;}/*!sc*/ .lhTYNA{margin-right:4px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .ffLUq{font-size:14px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}/*!sc*/ .bmcJak{min-width:0;}/*!sc*/ .fLXEGX{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (max-width:1079px){.fLXEGX{display:none;}}/*!sc*/ .lmSMZJ[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));padding-left:4px;padding-right:4px;}/*!sc*/ .lmSMZJ[data-size="medium"] span[data-component="leadingVisual"]{margin-right:4px !important;}/*!sc*/ .dqfxud{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:1080px){.dqfxud{display:none;}}/*!sc*/ @media screen and (max-width:543px){.dqfxud{display:none;}}/*!sc*/ .fGwBZA[data-size="medium"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .jxTzTd{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:8px;gap:8px;}/*!sc*/ .gqqBXN{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:8px;}/*!sc*/ @media screen and (max-width:543px){.gqqBXN{display:none;}}/*!sc*/ .dzXgxt{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (max-width:1011px){.dzXgxt{display:none;}}/*!sc*/ .iWFGlI{margin-left:8px;margin-right:8px;margin:0;}/*!sc*/ .vcvyP{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:160px;}/*!sc*/ .YUPas{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:1012px){.YUPas{display:none;}}/*!sc*/ .izFOf{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:544px){.izFOf{display:none;}}/*!sc*/ .vIPPs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:16px;}/*!sc*/ .fdROMU{width:100%;border-collapse:separate;border-spacing:0;border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;table-layout:fixed;overflow:unset;}/*!sc*/ .jGKpsv{height:0px;line-height:0px;}/*!sc*/ .jGKpsv tr{height:0px;font-size:0px;}/*!sc*/ .jdgHnn{padding:16px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:12px;text-align:left;height:40px;}/*!sc*/ .jdgHnn th{padding-left:16px;background-color:var(--bgColor-muted,var(--color-canvas-subtle,#f6f8fa));}/*!sc*/ .bQivRW{width:100%;border-top-left-radius:6px;}/*!sc*/ @media screen and (min-width:544px){.bQivRW{display:none;}}/*!sc*/ .ldkMIO{width:40%;border-top-left-radius:6px;}/*!sc*/ @media screen and (max-width:543px){.ldkMIO{display:none;}}/*!sc*/ .jMbWeI{text-align:right;padding-right:16px;width:136px;border-top-right-radius:6px;}/*!sc*/ .gpqjiB{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:12px;height:40px;}/*!sc*/ .dzCJzi{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;min-width:273px;padding:8px;}/*!sc*/ @media screen and (min-width:544px){.dzCJzi{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}/*!sc*/ .eNCcrz{text-align:center;vertical-align:center;height:40px;border-top:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));}/*!sc*/ .bHTcCe{border-top:1px solid var(--borderColor-default,var(--color-border-default));cursor:pointer;}/*!sc*/ .csrIcr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;gap:16px;}/*!sc*/ .bUQNHB{border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}/*!sc*/ @media screen and (max-width:543px){.bUQNHB{margin-left:-16px;margin-right:-16px;max-width:calc(100% + 32px);}}/*!sc*/ @media screen and (min-width:544px){.bUQNHB{max-width:100%;}}/*!sc*/ .jPdcfu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-bottom:1px solid;border-bottom-color:var(--borderColor-default,var(--color-border-default,#d0d7de));-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:8px;position:-webkit-sticky;position:sticky;top:0;background-color:var(--bgColor-default,var(--color-canvas-default,#ffffff));z-index:1;border-top-left-radius:6px;border-top-right-radius:6px;}/*!sc*/ .iphEWz{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;border-bottom:none;max-width:100%;padding-left:8px;padding-right:8px;}/*!sc*/ .hUCRAk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .cwoBXV[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-subtle,#6e7781));padding-left:8px;padding-right:8px;}/*!sc*/ .QkQOb{padding:32px;overflow:auto;}/*!sc*/ data-styled.g1[id="Box-sc-g0xbh4-0"]{content:"iVEunk,jzuOtQ,bGojzy,iNSVHo,bVgnfw,CEgMp,gMOVLe,gUkoLg,bZBlpz,lhTYNA,ffLUq,bmcJak,fLXEGX,lmSMZJ,dqfxud,fGwBZA,jxTzTd,gqqBXN,dzXgxt,iWFGlI,vcvyP,YUPas,izFOf,vIPPs,fdROMU,jGKpsv,jdgHnn,bQivRW,ldkMIO,jMbWeI,gpqjiB,dzCJzi,eNCcrz,bHTcCe,csrIcr,bUQNHB,jPdcfu,iphEWz,hUCRAk,cwoBXV,QkQOb,"}/*!sc*/ .brGdpi{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;-webkit-clip:rect(0,0,0,0);clip:rect(0,0,0,0);white-space:nowrap;border-width:0;}/*!sc*/ data-styled.g6[id="_VisuallyHidden__VisuallyHidden-sc-11jhm7a-0"]{content:"brGdpi,"}/*!sc*/ .hWlpPn{position:relative;display:inline-block;}/*!sc*/ .hWlpPn::after{position:absolute;z-index:1000000;display:none;padding:0.5em 0.75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-font-smoothing:subpixel-antialiased;color:var(--tooltip-fgColor,var(--fgColor-onEmphasis,var(--color-fg-on-emphasis,#ffffff)));text-align:center;-webkit-text-decoration:none;text-decoration:none;text-shadow:none;text-transform:none;-webkit-letter-spacing:normal;-moz-letter-spacing:normal;-ms-letter-spacing:normal;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:var(--tooltip-bgColor,var(--bgColor-emphasis,var(--color-neutral-emphasis-plus,#24292f)));border-radius:6px;opacity:0;}/*!sc*/ @-webkit-keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ @keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ .hWlpPn:hover::after,.hWlpPn:active::after,.hWlpPn:focus::after,.hWlpPn:focus-within::after{display:inline-block;-webkit-text-decoration:none;text-decoration:none;-webkit-animation-name:tooltip-appear;animation-name:tooltip-appear;-webkit-animation-duration:0.1s;animation-duration:0.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-no-delay:hover::after,.hWlpPn.tooltipped-no-delay:active::after,.hWlpPn.tooltipped-no-delay:focus::after,.hWlpPn.tooltipped-no-delay:focus-within::after{-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-multiline:hover::after,.hWlpPn.tooltipped-multiline:active::after,.hWlpPn.tooltipped-multiline:focus::after,.hWlpPn.tooltipped-multiline:focus-within::after{display:table-cell;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-se::after,.hWlpPn.tooltipped-sw::after{top:100%;right:50%;margin-top:6px;}/*!sc*/ .hWlpPn.tooltipped-se::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-sw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-n::after,.hWlpPn.tooltipped-ne::after,.hWlpPn.tooltipped-nw::after{right:50%;bottom:100%;margin-bottom:6px;}/*!sc*/ .hWlpPn.tooltipped-ne::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-nw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-n::after{-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%);}/*!sc*/ .hWlpPn.tooltipped-w::after{right:100%;bottom:50%;margin-right:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-e::after{bottom:50%;left:100%;margin-left:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-wrap:break-word;white-space:pre-line;border-collapse:separate;}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-s::after,.hWlpPn.tooltipped-multiline.tooltipped-n::after{right:auto;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-w::after,.hWlpPn.tooltipped-multiline.tooltipped-e::after{right:100%;}/*!sc*/ .hWlpPn.tooltipped-align-right-2::after{right:0;margin-right:0;}/*!sc*/ .hWlpPn.tooltipped-align-left-2::after{left:0;margin-left:0;}/*!sc*/ data-styled.g17[id="Tooltip__TooltipBase-sc-17tf59c-0"]{content:"hWlpPn,"}/*!sc*/ .liVpTx{display:inline-block;overflow:hidden;text-overflow:ellipsis;vertical-align:top;white-space:nowrap;max-width:125px;}/*!sc*/ data-styled.g19[id="Truncate__StyledTruncate-sc-23o1d2-0"]{content:"liVpTx,"}/*!sc*/ </style> <!-- --> <!-- --> <div class="Box-sc-g0xbh4-0 iVEunk"><div class="Box-sc-g0xbh4-0 jzuOtQ"><div class="Box-sc-g0xbh4-0 bGojzy"></div></div><div class="Box-sc-g0xbh4-0 iNSVHo"><div class="Box-sc-g0xbh4-0 bVgnfw"><div class="Box-sc-g0xbh4-0 CEgMp"><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" class="Box-sc-g0xbh4-0 gMOVLe prc-Button-ButtonBase-c50BI overview-ref-selector width-full" data-loading="false" data-size="medium" data-variant="default" aria-describedby="branch-picker-repos-header-ref-selector-loading-announcement" id="branch-picker-repos-header-ref-selector"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="text" class="prc-Button-Label-pTQ3x"><div class="Box-sc-g0xbh4-0 bZBlpz"><div class="Box-sc-g0xbh4-0 lhTYNA"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></div><div class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"><span class="Box-sc-g0xbh4-0 bmcJak prc-Text-Text-0ima0"> <!-- -->master</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><button hidden="" data-hotkey-scope="read-only-cursor-text-area"></button></div><div class="Box-sc-g0xbh4-0 fLXEGX"><a style="--button-color:fg.muted" type="button" href="/xmartlabs/Eureka/branches" class="Box-sc-g0xbh4-0 lmSMZJ prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rclab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Branches</span></span></a><a style="--button-color:fg.muted" type="button" href="/xmartlabs/Eureka/tags" class="Box-sc-g0xbh4-0 lmSMZJ prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rklab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Tags</span></span></a></div><div class="Box-sc-g0xbh4-0 dqfxud"><a style="--button-color:fg.muted" type="button" aria-label="Go to Branches page" href="/xmartlabs/Eureka/branches" class="Box-sc-g0xbh4-0 fGwBZA prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-describedby=":Relab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></a><a style="--button-color:fg.muted" type="button" aria-label="Go to Tags page" href="/xmartlabs/Eureka/tags" class="Box-sc-g0xbh4-0 fGwBZA prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-describedby=":Rmlab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></a></div></div><div class="Box-sc-g0xbh4-0 jxTzTd"><div class="Box-sc-g0xbh4-0 gqqBXN"><div class="Box-sc-g0xbh4-0 dzXgxt"><!--$--><div class="Box-sc-g0xbh4-0 iWFGlI"><span class="Box-sc-g0xbh4-0 vcvyP TextInput-wrapper prc-components-TextInputWrapper-i1ofR prc-components-TextInputBaseWrapper-ueK9q" data-leading-visual="true" data-trailing-visual="true" aria-busy="false"><span class="TextInput-icon" id=":R2j5ab:" aria-hidden="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellcheck="false" placeholder="Go to file" aria-describedby=":R2j5ab: :R2j5abH1:" data-component="input" class="prc-components-Input-Ic-y8" value=""/><span class="TextInput-icon" id=":R2j5abH1:" aria-hidden="true"></span></span></div><!--/$--></div><div class="Box-sc-g0xbh4-0 YUPas"><button type="button" class="prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-describedby=":Rr5ab:-loading-announcement"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="text" class="prc-Button-Label-pTQ3x">Go to file</span></span></button></div><div class="react-directory-add-file-icon"></div><div class="react-directory-remove-file-icon"></div></div><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="primary" aria-describedby=":R55ab:-loading-announcement" id=":R55ab:"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-code hide-sm" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Code</span><span data-component="trailingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="Box-sc-g0xbh4-0 izFOf"><button data-component="IconButton" type="button" aria-label="Open more actions menu" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-c50BI prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-describedby=":R75ab:-loading-announcement" id=":R75ab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button></div></div></div><div class="Box-sc-g0xbh4-0 vIPPs"><div data-hpc="true"><button hidden="" data-testid="focus-next-element-button" data-hotkey="j"></button><button hidden="" data-testid="focus-previous-element-button" data-hotkey="k"></button><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading" id="folders-and-files">Folders and files</h2><table aria-labelledby="folders-and-files" class="Box-sc-g0xbh4-0 fdROMU"><thead class="Box-sc-g0xbh4-0 jGKpsv"><tr class="Box-sc-g0xbh4-0 jdgHnn"><th colSpan="2" class="Box-sc-g0xbh4-0 bQivRW"><span class="text-bold">Name</span></th><th colSpan="1" class="Box-sc-g0xbh4-0 ldkMIO"><span class="text-bold">Name</span></th><th class="hide-sm"><div title="Last commit message" class="Truncate__StyledTruncate-sc-23o1d2-0 liVpTx width-fit"><span class="text-bold">Last commit message</span></div></th><th colSpan="1" class="Box-sc-g0xbh4-0 jMbWeI"><div title="Last commit date" class="Truncate__StyledTruncate-sc-23o1d2-0 liVpTx width-fit"><span class="text-bold">Last commit date</span></div></th></tr></thead><tbody><tr class="Box-sc-g0xbh4-0 gpqjiB"><td colSpan="3" class="bgColor-muted p-1 rounded-top-2"><div class="Box-sc-g0xbh4-0 dzCJzi"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">History</h2><a href="/xmartlabs/Eureka/commits/master/" class="prc-Button-ButtonBase-c50BI d-none d-lg-flex LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby=":Raqj8pab:-loading-announcement"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x"><span class="fgColor-default">918 Commits</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><span role="tooltip" aria-label="918 Commits" id="history-icon-button-tooltip" class="Tooltip__TooltipBase-sc-17tf59c-0 hWlpPn tooltipped-n"><a href="/xmartlabs/Eureka/commits/master/" class="prc-Button-ButtonBase-c50BI LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby=":R1iqj8pab:-loading-announcement history-icon-button-tooltip"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a></span></div></div></div></div></td></tr><tr class="react-directory-row undefined" id="folder-row-0"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".github" aria-label=".github, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/.github">.github</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".github" aria-label=".github, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/.github">.github</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-1"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Documentation" aria-label="Documentation, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Documentation">Documentation</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Documentation" aria-label="Documentation, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Documentation">Documentation</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-2"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Eureka.playground" aria-label="Eureka.playground, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Eureka.playground">Eureka.playground</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Eureka.playground" aria-label="Eureka.playground, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Eureka.playground">Eureka.playground</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-3"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Eureka.xcodeproj" aria-label="Eureka.xcodeproj, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Eureka.xcodeproj">Eureka.xcodeproj</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Eureka.xcodeproj" aria-label="Eureka.xcodeproj, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Eureka.xcodeproj">Eureka.xcodeproj</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-4"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Eureka.xcworkspace" aria-label="Eureka.xcworkspace, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Eureka.xcworkspace">Eureka.xcworkspace</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Eureka.xcworkspace" aria-label="Eureka.xcworkspace, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Eureka.xcworkspace">Eureka.xcworkspace</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-5"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Example.xcodeproj" aria-label="Example.xcodeproj, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Example.xcodeproj">Example.xcodeproj</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Example.xcodeproj" aria-label="Example.xcodeproj, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Example.xcodeproj">Example.xcodeproj</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-6"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Example" aria-label="Example, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Example">Example</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Example" aria-label="Example, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Example">Example</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-7"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Source" aria-label="Source, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Source">Source</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Source" aria-label="Source, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Source">Source</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-8"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Tests" aria-label="Tests, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Tests">Tests</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Tests" aria-label="Tests, (Directory)" class="Link--primary" href="/xmartlabs/Eureka/tree/master/Tests">Tests</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-9"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitignore" aria-label=".gitignore, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/.gitignore">.gitignore</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitignore" aria-label=".gitignore, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/.gitignore">.gitignore</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-10"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="CHANGELOG.md" aria-label="CHANGELOG.md, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/CHANGELOG.md">CHANGELOG.md</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="CHANGELOG.md" aria-label="CHANGELOG.md, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/CHANGELOG.md">CHANGELOG.md</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-11"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="CONTRIBUTING.md" aria-label="CONTRIBUTING.md, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="CONTRIBUTING.md" aria-label="CONTRIBUTING.md, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/CONTRIBUTING.md">CONTRIBUTING.md</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-12"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Eureka.png" aria-label="Eureka.png, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/Eureka.png">Eureka.png</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Eureka.png" aria-label="Eureka.png, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/Eureka.png">Eureka.png</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-13"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Eureka.podspec" aria-label="Eureka.podspec, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/Eureka.podspec">Eureka.podspec</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Eureka.podspec" aria-label="Eureka.podspec, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/Eureka.podspec">Eureka.podspec</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-14"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="LICENSE" aria-label="LICENSE, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/LICENSE">LICENSE</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="LICENSE" aria-label="LICENSE, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/LICENSE">LICENSE</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-15"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Package.swift" aria-label="Package.swift, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/Package.swift">Package.swift</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Package.swift" aria-label="Package.swift, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/Package.swift">Package.swift</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-16"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="README.md" aria-label="README.md, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/README.md">README.md</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="README.md" aria-label="README.md, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/README.md">README.md</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-17"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="donate.png" aria-label="donate.png, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/donate.png">donate.png</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="donate.png" aria-label="donate.png, (File)" class="Link--primary" href="/xmartlabs/Eureka/blob/master/donate.png">donate.png</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="Box-sc-g0xbh4-0 eNCcrz show-for-mobile" data-testid="view-all-files-row"><td colSpan="3" class="Box-sc-g0xbh4-0 bHTcCe"><div><button class="prc-Link-Link-85e08">View all files</button></div></td></tr></tbody></table></div><div class="Box-sc-g0xbh4-0 csrIcr"><div class="Box-sc-g0xbh4-0 bUQNHB"><div itemscope="" itemType="https://schema.org/abstract" class="Box-sc-g0xbh4-0 jPdcfu"><h2 class="_VisuallyHidden__VisuallyHidden-sc-11jhm7a-0 brGdpi">Repository files navigation</h2><nav class="Box-sc-g0xbh4-0 iphEWz prc-components-UnderlineWrapper-oOh5J" aria-label="Repository files"><ul class="prc-components-UnderlineItemList-b23Hf" role="list"><li class="Box-sc-g0xbh4-0 hUCRAk"><a class="prc-components-UnderlineItem-lJsg-" href="#" aria-current="page"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-book" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path></svg></span><span data-component="text" data-content="README">README</span></a></li><li class="Box-sc-g0xbh4-0 hUCRAk"><a class="prc-components-UnderlineItem-lJsg-" href="#"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-law" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path></svg></span><span data-component="text" data-content="License">License</span></a></li></ul></nav><button style="--button-color:fg.subtle" type="button" aria-label="Outline" aria-haspopup="true" aria-expanded="false" tabindex="0" class="Box-sc-g0xbh4-0 cwoBXV prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rr9ab:-loading-announcement" id=":Rr9ab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button></div><div class="Box-sc-g0xbh4-0 QkQOb js-snippet-clipboard-copy-unpositioned undefined" data-hpc="true"><article class="markdown-body entry-content container-lg" itemprop="text"><p dir="auto"><a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Eureka.png"><img src="/xmartlabs/Eureka/raw/master/Eureka.png" alt="Eureka: Elegant form builder in Swift" style="max-width: 100%;"></a></p> <p align="center" dir="auto"> <a href="https://travis-ci.org/xmartlabs/Eureka" rel="nofollow"><img src="https://camo.githubusercontent.com/0eb322fd379e0e25c9d7302849b654e6e659acdf7c975229cbf4987c1da54ea4/68747470733a2f2f7472617669732d63692e6f72672f786d6172746c6162732f457572656b612e7376673f6272616e63683d6d6173746572" alt="Build status" data-canonical-src="https://travis-ci.org/xmartlabs/Eureka.svg?branch=master" style="max-width: 100%;"></a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/655f5ca0fa2783d9237997730cad4d0bbd935f0e66580583e7d2a0c41d768ce0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d694f532d626c75652e7376673f7374796c653d666c6174"><img src="https://camo.githubusercontent.com/655f5ca0fa2783d9237997730cad4d0bbd935f0e66580583e7d2a0c41d768ce0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f706c6174666f726d2d694f532d626c75652e7376673f7374796c653d666c6174" alt="Platform iOS" data-canonical-src="https://img.shields.io/badge/platform-iOS-blue.svg?style=flat" style="max-width: 100%;"></a> <a href="https://developer.apple.com/swift" rel="nofollow"><img src="https://camo.githubusercontent.com/7db9d3740915bb60719b25d791b2aa35d2700396655644f7cfc36724ec9d515a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7377696674352d636f6d70617469626c652d3442433531442e7376673f7374796c653d666c6174" alt="Swift 5 compatible" data-canonical-src="https://img.shields.io/badge/swift5-compatible-4BC51D.svg?style=flat" style="max-width: 100%;"></a> <a href="https://github.com/Carthage/Carthage"><img src="https://camo.githubusercontent.com/5cb89494518efc818a124fd801726287be9482423d1a161a6dec2066aa0f30db/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f43617274686167652d636f6d70617469626c652d3442433531442e7376673f7374796c653d666c6174" alt="Carthage compatible" data-canonical-src="https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat" style="max-width: 100%;"></a> <a href="https://cocoapods.org/pods/Eureka" rel="nofollow"><img src="https://camo.githubusercontent.com/f266a4687695a4f0d1b7359950cd52dc01299aeb2bdc1a7a646941af268ce304/68747470733a2f2f696d672e736869656c64732e696f2f636f636f61706f64732f762f457572656b612e737667" alt="CocoaPods compatible" data-canonical-src="https://img.shields.io/cocoapods/v/Eureka.svg" style="max-width: 100%;"></a> <a href="https://raw.githubusercontent.com/xmartlabs/Eureka/master/LICENSE" rel="nofollow"><img src="https://camo.githubusercontent.com/95c10fa6088c05deb9bdfe215245185f6f8262c17e68b55188cfcf7c3ce03c52/687474703a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e7376673f7374796c653d666c6174" alt="License: MIT" data-canonical-src="http://img.shields.io/badge/license-MIT-blue.svg?style=flat" style="max-width: 100%;"></a> <a href="https://codebeat.co/projects/github-com-xmartlabs-eureka" rel="nofollow"><img alt="codebeat badge" src="https://camo.githubusercontent.com/6ee41ba9346b816db6e6cb52c3b6b1bd76312efa336aed43603511ba2b0f5002/68747470733a2f2f636f6465626561742e636f2f6261646765732f31366632396166622d663037322d343633332d393439372d333333633665623731323633" data-canonical-src="https://codebeat.co/badges/16f29afb-f072-4633-9497-333c6eb71263" style="max-width: 100%;"></a> </p> <p dir="auto">Made with ❤️ by <a href="http://xmartlabs.com" rel="nofollow">XMARTLABS</a>. This is the re-creation of <a href="https://github.com/xmartlabs/XLForm">XLForm</a> in Swift.</p> <p dir="auto"><a href="/xmartlabs/Eureka/blob/master/Documentation/README_CN.md">简体中文</a></p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Overview</h2><a id="user-content-overview" class="anchor" aria-label="Permalink: Overview" href="#overview"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <markdown-accessiblity-table><table> <tbody><tr> <th> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/EurekaExample1.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/EurekaExample1.gif" width="220" data-animated-image="" style="max-width: 100%;"></a> </th> <th> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/EurekaExample2.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/EurekaExample2.gif" width="220" data-animated-image="" style="max-width: 100%;"></a> </th> <th> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/EurekaExample3.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/EurekaExample3.gif" width="220" data-animated-image="" style="max-width: 100%;"></a> </th> </tr> </tbody></table></markdown-accessiblity-table> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Contents</h2><a id="user-content-contents" class="anchor" aria-label="Permalink: Contents" href="#contents"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><a href="#requirements">Requirements</a></li> <li><a href="#usage">Usage</a> <ul dir="auto"> <li><a href="#how-to-create-a-form">How to create a Form</a></li> <li><a href="#getting-row-values">Getting row values</a></li> <li><a href="#operators">Operators</a></li> <li><a href="#using-the-callbacks">Using the callbacks</a></li> <li><a href="#section-header-and-footer">Section Header and Footer</a></li> <li><a href="#hide-show-rows">Dynamically hide and show rows (or sections)</a></li> <li><a href="#list-sections">List sections</a></li> <li><a href="#multivalued-sections">Multivalued sections</a></li> <li><a href="#validations">Validations</a></li> <li><a href="#swipe-actions">Swipe Actions</a></li> </ul> </li> <li><a href="#custom-rows">Custom rows</a> <ul dir="auto"> <li><a href="#basic-custom-rows">Basic custom rows</a></li> <li><a href="#custom-inline-rows">Custom inline rows</a></li> <li><a href="#custom-presenter-rows">Custom presenter rows</a></li> </ul> </li> <li><a href="#row-catalog">Row catalog</a></li> <li><a href="#installation">Installation</a></li> <li><a href="#faq">FAQ</a></li> </ul> <p dir="auto"><strong>For more information look at <a href="http://blog.xmartlabs.com/2015/09/29/Introducing-Eureka-iOS-form-library-written-in-pure-Swift/" rel="nofollow">our blog post</a> that introduces <em>Eureka</em>.</strong></p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Requirements (for latest release)</h2><a id="user-content-requirements-for-latest-release" class="anchor" aria-label="Permalink: Requirements (for latest release)" href="#requirements-for-latest-release"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>Xcode 11+</li> <li>Swift 5.0+</li> </ul> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Example project</h3><a id="user-content-example-project" class="anchor" aria-label="Permalink: Example project" href="#example-project"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">You can clone and run the Example project to see examples of most of Eureka's features.</p> <markdown-accessiblity-table><table> <tbody><tr> <th> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/EurekaNavigation.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/EurekaNavigation.gif" width="200" data-animated-image="" style="max-width: 100%;"></a> </th> <th> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/EurekaRows.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/EurekaRows.gif" width="200" data-animated-image="" style="max-width: 100%;"></a> </th> </tr> </tbody></table></markdown-accessiblity-table> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Usage</h2><a id="user-content-usage" class="anchor" aria-label="Permalink: Usage" href="#usage"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">How to create a form</h3><a id="user-content-how-to-create-a-form" class="anchor" aria-label="Permalink: How to create a form" href="#how-to-create-a-form"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">By extending <code>FormViewController</code> you can then simply add sections and rows to the <code>form</code> variable.</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="import Eureka class MyFormViewController: FormViewController { override func viewDidLoad() { super.viewDidLoad() form +++ Section("Section1") <<< TextRow(){ row in row.title = "Text Row" row.placeholder = "Enter text here" } <<< PhoneRow(){ $0.title = "Phone Row" $0.placeholder = "And numbers here" } +++ Section("Section2") <<< DateRow(){ $0.title = "Date Row" $0.value = Date(timeIntervalSinceReferenceDate: 0) } } }"><pre><span class="pl-k">import</span> Eureka <span class="pl-k">class</span> <span class="pl-smi">MyFormViewController</span><span class="pl-kos">:</span> <span class="pl-smi">FormViewController</span> <span class="pl-kos">{</span> <span class="pl-k"><span class="pl-k">override</span></span> <span class="pl-en">func</span> viewDidLoad<span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> super<span class="pl-kos">.</span><span class="pl-en">viewDidLoad</span><span class="pl-kos">(</span><span class="pl-kos">)</span> form <span class="pl-c1">+++</span> <span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">Section1</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-c1"><<<</span> <span class="pl-en">TextRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">{</span> row <span class="pl-k">in</span> row<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Text Row</span><span class="pl-s">"</span> row<span class="pl-kos">.</span>placeholder <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Enter text here</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-c1"><<<</span> <span class="pl-en">PhoneRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Phone Row</span><span class="pl-s">"</span> $0<span class="pl-kos">.</span>placeholder <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">And numbers here</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-c1">+++</span> <span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">Section2</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-c1"><<<</span> <span class="pl-en">DateRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Date Row</span><span class="pl-s">"</span> $0<span class="pl-kos">.</span>value <span class="pl-c1">=</span> <span class="pl-en">Date</span><span class="pl-kos">(</span>timeIntervalSinceReferenceDate<span class="pl-kos">:</span> <span class="pl-c1">0</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">In the example we create two sections with standard rows, the result is this:</p> <p dir="auto"><a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/EurekaHowTo.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/EurekaHowTo.gif" width="200" alt="Screenshot of Custom Cells" data-animated-image="" style="max-width: 100%;"></a></p> <p dir="auto">You could create a form by just setting up the <code>form</code> property by yourself without extending from <code>FormViewController</code> but this method is typically more convenient.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Configuring the keyboard navigation accesory</h4><a id="user-content-configuring-the-keyboard-navigation-accesory" class="anchor" aria-label="Permalink: Configuring the keyboard navigation accesory" href="#configuring-the-keyboard-navigation-accesory"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">To change the behaviour of this you should set the navigation options of your controller. The <code>FormViewController</code> has a <code>navigationOptions</code> variable which is an enum and can have one or more of the following values:</p> <ul dir="auto"> <li><strong>disabled</strong>: no view at all</li> <li><strong>enabled</strong>: enable view at the bottom</li> <li><strong>stopDisabledRow</strong>: if the navigation should stop when the next row is disabled</li> <li><strong>skipCanNotBecomeFirstResponderRow</strong>: if the navigation should skip the rows that return false to <code>canBecomeFirstResponder()</code></li> </ul> <p dir="auto">The default value is <code>enabled & skipCanNotBecomeFirstResponderRow</code></p> <p dir="auto">To enable smooth scrolling to off-screen rows, enable it via the <code>animateScroll</code> property. By default, the <code>FormViewController</code> jumps immediately between rows when the user hits the next or previous buttons in the keyboard navigation accesory, including when the next row is off screen.</p> <p dir="auto">To set the amount of space between the keyboard and the highlighted row following a navigation event, set the <code>rowKeyboardSpacing</code> property. By default, when the form scrolls to an offscreen view no space will be left between the top of the keyboard and the bottom of the row.</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="class MyFormViewController: FormViewController { override func viewDidLoad() { super.viewDidLoad() form = ... // Enables the navigation accessory and stops navigation when a disabled row is encountered navigationOptions = RowNavigationOptions.Enabled.union(.StopDisabledRow) // Enables smooth scrolling on navigation to off-screen rows animateScroll = true // Leaves 20pt of space between the keyboard and the highlighted row after scrolling to an off screen row rowKeyboardSpacing = 20 } }"><pre><span class="pl-k">class</span> <span class="pl-smi">MyFormViewController</span><span class="pl-kos">:</span> <span class="pl-smi">FormViewController</span> <span class="pl-kos">{</span> <span class="pl-k"><span class="pl-k">override</span></span> <span class="pl-en">func</span> viewDidLoad<span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> super<span class="pl-kos">.</span><span class="pl-en">viewDidLoad</span><span class="pl-kos">(</span><span class="pl-kos">)</span> form <span class="pl-c1">=</span> <span class="pl-c1">...</span> // Enables the navigation accessory and stops navigation when a disabled row is encountered navigationOptions <span class="pl-c1">=</span> <span class="pl-smi">RowNavigationOptions</span><span class="pl-kos">.</span>Enabled<span class="pl-kos">.</span><span class="pl-en">union</span><span class="pl-kos">(</span><span class="pl-kos">.</span>StopDisabledRow<span class="pl-kos">)</span> // Enables smooth scrolling on navigation to off-screen rows animateScroll <span class="pl-c1">=</span> <span class="pl-c1">true</span> // Leaves 20pt of space between the keyboard and the highlighted row after scrolling to an off screen row rowKeyboardSpacing <span class="pl-c1">=</span> <span class="pl-c1">20</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">If you want to change the whole navigation accessory view, you will have to override the <code>navigationAccessoryView</code> variable in your subclass of <code>FormViewController</code>.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Getting row values</h3><a id="user-content-getting-row-values" class="anchor" aria-label="Permalink: Getting row values" href="#getting-row-values"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The <code>Row</code> object holds a <em><strong>value</strong></em> of a specific type. For example, a <code>SwitchRow</code> holds a <code>Bool</code> value, while a <code>TextRow</code> holds a <code>String</code> value.</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Get the value of a single row let row: TextRow? = form.rowBy(tag: "MyRowTag") let value = row.value // Get the value of all rows which have a Tag assigned // The dictionary contains the 'rowTag':value pairs. let valuesDictionary = form.values()"><pre>// Get the value of a single row <span class="pl-k">let</span> <span class="pl-s1">row</span><span class="pl-kos">:</span> <span class="pl-smi">TextRow</span><span class="pl-c1"><span class="pl-c1">?</span></span> <span class="pl-c1">=</span> form<span class="pl-kos">.</span><span class="pl-en">rowBy</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">MyRowTag</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-k">let</span> <span class="pl-s1">value</span> <span class="pl-c1">=</span> row<span class="pl-kos">.</span>value // Get the value of all rows which have a Tag assigned // The dictionary contains the 'rowTag':value pairs. <span class="pl-k">let</span> <span class="pl-s1">valuesDictionary</span> <span class="pl-c1">=</span> form<span class="pl-kos">.</span><span class="pl-en">values</span><span class="pl-kos">(</span><span class="pl-kos">)</span></pre></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Operators</h3><a id="user-content-operators" class="anchor" aria-label="Permalink: Operators" href="#operators"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Eureka includes custom operators to make form creation easy:</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">+++ Add a section</h4><a id="user-content--add-a-section" class="anchor" aria-label="Permalink: +++ Add a section" href="#-add-a-section"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="form +++ Section() // Chain it to add multiple Sections form +++ Section("First Section") +++ Section("Another Section") // Or use it with rows and get a blank section for free form +++ TextRow() +++ TextRow() // Each row will be on a separate section"><pre>form <span class="pl-c1">+++</span> <span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-kos">)</span> // Chain it to add multiple Sections form <span class="pl-c1">+++</span> <span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">First Section</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-c1">+++</span> <span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">Another Section</span><span class="pl-s">"</span><span class="pl-kos">)</span> // Or use it with rows and get a blank section for free form <span class="pl-c1">+++</span> <span class="pl-en">TextRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">+++</span> <span class="pl-en">TextRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> // Each row will be on a separate section</pre></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><<< Insert a row</h4><a id="user-content--insert-a-row" class="anchor" aria-label="Permalink: <<< Insert a row" href="#-insert-a-row"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="form +++ Section() <<< TextRow() <<< DateRow() // Or implicitly create the Section form +++ TextRow() <<< DateRow()"><pre>form <span class="pl-c1">+++</span> <span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1"><<<</span> <span class="pl-en">TextRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1"><<<</span> <span class="pl-en">DateRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> // Or implicitly create the Section form <span class="pl-c1">+++</span> <span class="pl-en">TextRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1"><<<</span> <span class="pl-en">DateRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span></pre></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">+= Append an array</h4><a id="user-content---append-an-array" class="anchor" aria-label="Permalink: += Append an array" href="#--append-an-array"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Append Sections into a Form form += [Section("A"), Section("B"), Section("C")] // Append Rows into a Section section += [TextRow(), DateRow()]"><pre>// Append Sections into a Form form <span class="pl-c1">+=</span> <span class="pl-kos">[</span><span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">A</span><span class="pl-s">"</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">B</span><span class="pl-s">"</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">C</span><span class="pl-s">"</span><span class="pl-kos">)</span><span class="pl-kos">]</span> // Append Rows into a Section section <span class="pl-c1">+=</span> <span class="pl-kos">[</span><span class="pl-en">TextRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-en">DateRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">]</span></pre></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Result builders</h3><a id="user-content-result-builders" class="anchor" aria-label="Permalink: Result builders" href="#result-builders"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Eureka includes result builders to make form creation easy:</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">@SectionBuilder</h4><a id="user-content-sectionbuilder" class="anchor" aria-label="Permalink: @SectionBuilder" href="#sectionbuilder"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Section + Section form = (Section("A") +++ { URLRow("UrlRow_f1") { $0.title = "Url" } if something { TwitterRow("TwitterRow_f2") { $0.title = "Twitter" } } else { TwitterRow("TwitterRow_f1") { $0.title = "Twitter" } } AccountRow("AccountRow_f1") { $0.title = "Account" } }) // Form + Section form +++ { if something { PhoneRow("PhoneRow_f1") { $0.title = "Phone" } } else { PhoneRow("PhoneRow_f2") { $0.title = "Phone" } } PasswordRow("PasswordRow_f1") { $0.title = "Password" } }"><pre>// Section + Section form <span class="pl-c1">=</span> <span class="pl-kos">(</span><span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">A</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-c1">+++</span> <span class="pl-kos">{</span> <span class="pl-en">URLRow</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">UrlRow_f1</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Url</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-k">if</span> something <span class="pl-kos">{</span> <span class="pl-en">TwitterRow</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">TwitterRow_f2</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Twitter</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-k">else</span> <span class="pl-kos">{</span> <span class="pl-en">TwitterRow</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">TwitterRow_f1</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Twitter</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-en">AccountRow</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">AccountRow_f1</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Account</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> // Form + Section form <span class="pl-c1">+++</span> <span class="pl-kos">{</span> <span class="pl-k">if</span> something <span class="pl-kos">{</span> <span class="pl-en">PhoneRow</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">PhoneRow_f1</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Phone</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-k">else</span> <span class="pl-kos">{</span> <span class="pl-en">PhoneRow</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">PhoneRow_f2</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Phone</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-en">PasswordRow</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">PasswordRow_f1</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Password</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">@FormBuilder</h4><a id="user-content-formbuilder" class="anchor" aria-label="Permalink: @FormBuilder" href="#formbuilder"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="@FormBuilder var form: Form { Section("Section A") { section in section.tag = "Section_A" } if true { Section("Section B") { section in section.tag = "Section_B" } } NameRow("NameRow_f1") { $0.title = "Name" } }"><pre><span class="pl-s1">@<span class="pl-smi">FormBuilder</span></span> <span class="pl-k">var</span> <span class="pl-s1">form</span><span class="pl-kos">:</span> <span class="pl-smi">Form</span> <span class="pl-kos">{</span> <span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">Section A</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> section <span class="pl-k">in</span> section<span class="pl-kos">.</span>tag <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Section_A</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-k">if</span> <span class="pl-c1">true</span> <span class="pl-kos">{</span> <span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">Section B</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> section <span class="pl-k">in</span> section<span class="pl-kos">.</span>tag <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Section_B</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-en">NameRow</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">NameRow_f1</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Name</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Using the callbacks</h3><a id="user-content-using-the-callbacks" class="anchor" aria-label="Permalink: Using the callbacks" href="#using-the-callbacks"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Eureka includes callbacks to change the appearance and behavior of a row.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Understanding Row and Cell</h4><a id="user-content-understanding-row-and-cell" class="anchor" aria-label="Permalink: Understanding Row and Cell" href="#understanding-row-and-cell"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">A <code>Row</code> is an abstraction Eureka uses which holds a <strong>value</strong> and contains the view <code>Cell</code>. The <code>Cell</code> manages the view and subclasses <code>UITableViewCell</code>.</p> <p dir="auto">Here is an example:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="let row = SwitchRow("SwitchRow") { row in // initializer row.title = "The title" }.onChange { row in row.title = (row.value ?? false) ? "The title expands when on" : "The title" row.updateCell() }.cellSetup { cell, row in cell.backgroundColor = .lightGray }.cellUpdate { cell, row in cell.textLabel?.font = .italicSystemFont(ofSize: 18.0) }"><pre><span class="pl-k">let</span> <span class="pl-s1">row</span> <span class="pl-c1">=</span> <span class="pl-en">SwitchRow</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">SwitchRow</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> row <span class="pl-k">in</span> // initializer row<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">The title</span><span class="pl-s">"</span> <span class="pl-kos">}</span><span class="pl-kos">.</span><span class="pl-en">onChange</span> <span class="pl-kos">{</span> row <span class="pl-k">in</span> row<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-kos">(</span>row<span class="pl-kos">.</span>value <span class="pl-c1">??</span> <span class="pl-c1">false</span><span class="pl-kos">)</span> <span class="pl-c1">?</span> <span class="pl-s">"</span><span class="pl-s">The title expands when on</span><span class="pl-s">"</span> <span class="pl-k">:</span> <span class="pl-s">"</span><span class="pl-s">The title</span><span class="pl-s">"</span> row<span class="pl-kos">.</span><span class="pl-en">updateCell</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">.</span><span class="pl-en">cellSetup</span> <span class="pl-kos">{</span> cell<span class="pl-kos">,</span> row <span class="pl-k">in</span> cell<span class="pl-kos">.</span>backgroundColor <span class="pl-c1">=</span> <span class="pl-kos">.</span>lightGray <span class="pl-kos">}</span><span class="pl-kos">.</span><span class="pl-en">cellUpdate</span> <span class="pl-kos">{</span> cell<span class="pl-kos">,</span> row <span class="pl-k">in</span> cell<span class="pl-kos">.</span>textLabel<span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">.</span>font <span class="pl-c1">=</span> <span class="pl-kos">.</span>italicSystemFont<span class="pl-kos">(</span>ofSize<span class="pl-kos">:</span> <span class="pl-c1">18.0</span><span class="pl-kos">)</span> <span class="pl-kos">}</span></pre></div> <p dir="auto"><a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/EurekaOnChange.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/EurekaOnChange.gif" width="300" alt="Screenshot of Disabled Row" data-animated-image="" style="max-width: 100%;"></a></p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Callbacks list</h4><a id="user-content-callbacks-list" class="anchor" aria-label="Permalink: Callbacks list" href="#callbacks-list"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <p dir="auto"><strong>onChange()</strong></p> <p dir="auto">Called when the value of a row changes. You might be interested in adjusting some parameters here or even make some other rows appear or disappear.</p> </li> <li> <p dir="auto"><strong>onCellSelection()</strong></p> <p dir="auto">Called each time the user taps on the row and it gets selected. Note that this will also get called for disabled rows so you should start your code inside this callback with something like <code>guard !row.isDisabled else { return }</code></p> </li> <li> <p dir="auto"><strong>cellSetup()</strong></p> <p dir="auto">Called only once when the cell is first configured. Set permanent settings here.</p> </li> <li> <p dir="auto"><strong>cellUpdate()</strong></p> <p dir="auto">Called each time the cell appears on screen. You can change the appearance here using variables that may not be present on cellSetup().</p> </li> <li> <p dir="auto"><strong>onCellHighlightChanged()</strong></p> <p dir="auto">Called whenever the cell or any subview become or resign the first responder.</p> </li> <li> <p dir="auto"><strong>onRowValidationChanged()</strong></p> <p dir="auto">Called whenever the the validation errors associated with a row changes.</p> </li> <li> <p dir="auto"><strong>onExpandInlineRow()</strong></p> <p dir="auto">Called before expanding the inline row. Applies to rows conforming <code>InlineRowType</code> protocol.</p> </li> <li> <p dir="auto"><strong>onCollapseInlineRow()</strong></p> <p dir="auto">Called before collapsing the inline row. Applies to rows conforming <code>InlineRowType</code> protocol.</p> </li> <li> <p dir="auto"><strong>onPresent()</strong></p> <p dir="auto">Called by a row just before presenting another view controller. Applies to rows conforming <code>PresenterRowType</code> protocol. Use it to set up the presented controller.</p> </li> </ul> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Section Header and Footer</h3><a id="user-content-section-header-and-footer" class="anchor" aria-label="Permalink: Section Header and Footer" href="#section-header-and-footer"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">You can set a title <code>String</code> or a custom <code>View</code> as the header or footer of a <code>Section</code>.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">String title</h4><a id="user-content-string-title" class="anchor" aria-label="Permalink: String title" href="#string-title"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="Section("Title") Section(header: "Title", footer: "Footer Title") Section(footer: "Footer Title")"><pre><span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">Title</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-en">Section</span><span class="pl-kos">(</span>header<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">Title</span><span class="pl-s">"</span><span class="pl-kos">,</span> footer<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">Footer Title</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-en">Section</span><span class="pl-kos">(</span>footer<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">Footer Title</span><span class="pl-s">"</span><span class="pl-kos">)</span></pre></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Custom view</h4><a id="user-content-custom-view" class="anchor" aria-label="Permalink: Custom view" href="#custom-view"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">You can use a Custom View from a <code>.xib</code> file:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="Section() { section in var header = HeaderFooterView<MyHeaderNibFile>(.nibFile(name: "MyHeaderNibFile", bundle: nil)) // Will be called every time the header appears on screen header.onSetupView = { view, _ in // Commonly used to setup texts inside the view // Don't change the view hierarchy or size here! } section.header = header }"><pre><span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> section <span class="pl-k">in</span> <span class="pl-k">var</span> <span class="pl-s1">header</span> <span class="pl-c1">=</span> <span class="pl-smi">HeaderFooterView</span><span class="pl-c1"><</span><span class="pl-smi">MyHeaderNibFile</span><span class="pl-c1">></span><span class="pl-kos">(</span><span class="pl-kos">.</span>nibFile<span class="pl-kos">(</span>name<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">MyHeaderNibFile</span><span class="pl-s">"</span><span class="pl-kos">,</span> bundle<span class="pl-kos">:</span> <span class="pl-smi">nil</span><span class="pl-kos">)</span><span class="pl-kos">)</span> // Will be called every time the header appears on screen header<span class="pl-kos">.</span>onSetupView <span class="pl-c1">=</span> <span class="pl-kos">{</span> view<span class="pl-kos">,</span> _ <span class="pl-k">in</span> // Commonly used to setup texts inside the view // Don't change the view hierarchy or size here! <span class="pl-kos">}</span> section<span class="pl-kos">.</span>header <span class="pl-c1">=</span> header <span class="pl-kos">}</span></pre></div> <p dir="auto">Or a custom <code>UIView</code> created programmatically</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="Section(){ section in var header = HeaderFooterView<MyCustomUIView>(.class) header.height = {100} header.onSetupView = { view, _ in view.backgroundColor = .red } section.header = header }"><pre><span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">{</span> section <span class="pl-k">in</span> <span class="pl-k">var</span> <span class="pl-s1">header</span> <span class="pl-c1">=</span> <span class="pl-smi">HeaderFooterView</span><span class="pl-c1"><</span><span class="pl-smi">MyCustomUIView</span><span class="pl-c1">></span><span class="pl-kos">(</span><span class="pl-kos">.</span>class<span class="pl-kos">)</span> header<span class="pl-kos">.</span>height <span class="pl-c1">=</span> <span class="pl-kos">{</span><span class="pl-c1">100</span><span class="pl-kos">}</span> header<span class="pl-kos">.</span>onSetupView <span class="pl-c1">=</span> <span class="pl-kos">{</span> view<span class="pl-kos">,</span> _ <span class="pl-k">in</span> view<span class="pl-kos">.</span>backgroundColor <span class="pl-c1">=</span> <span class="pl-kos">.</span>red <span class="pl-kos">}</span> section<span class="pl-kos">.</span>header <span class="pl-c1">=</span> header <span class="pl-kos">}</span></pre></div> <p dir="auto">Or just build the view with a Callback</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="Section(){ section in section.header = { var header = HeaderFooterView<UIView>(.callback({ let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) view.backgroundColor = .red return view })) header.height = { 100 } return header }() }"><pre><span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">{</span> section <span class="pl-k">in</span> section<span class="pl-kos">.</span>header <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-k">var</span> <span class="pl-s1">header</span> <span class="pl-c1">=</span> <span class="pl-smi">HeaderFooterView</span><span class="pl-c1"><</span><span class="pl-smi">UIView</span><span class="pl-c1">></span><span class="pl-kos">(</span><span class="pl-kos">.</span>callback<span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-k">let</span> <span class="pl-s1">view</span> <span class="pl-c1">=</span> <span class="pl-en">UIView</span><span class="pl-kos">(</span>frame<span class="pl-kos">:</span> <span class="pl-en">CGRect</span><span class="pl-kos">(</span>x<span class="pl-kos">:</span> <span class="pl-c1">0</span><span class="pl-kos">,</span> y<span class="pl-kos">:</span> <span class="pl-c1">0</span><span class="pl-kos">,</span> width<span class="pl-kos">:</span> <span class="pl-c1">100</span><span class="pl-kos">,</span> height<span class="pl-kos">:</span> <span class="pl-c1">100</span><span class="pl-kos">)</span><span class="pl-kos">)</span> view<span class="pl-kos">.</span>backgroundColor <span class="pl-c1">=</span> <span class="pl-kos">.</span>red <span class="pl-k">return</span> view <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">)</span> header<span class="pl-kos">.</span>height <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">100</span> <span class="pl-kos">}</span> <span class="pl-k">return</span> header <span class="pl-kos">}</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">}</span></pre></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Dynamically hide and show rows (or sections) <a name="user-content-hide-show-rows"></a></h3><a id="user-content-dynamically-hide-and-show-rows-or-sections--" class="anchor" aria-label="Permalink: Dynamically hide and show rows (or sections) " href="#dynamically-hide-and-show-rows-or-sections--"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/EurekaSwitchSections.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/EurekaSwitchSections.gif" width="300" alt="Screenshot of Hidden Rows" data-animated-image="" style="max-width: 100%;"></a></p> <p dir="auto">In this case we are hiding and showing whole sections.</p> <p dir="auto">To accomplish this each row has a <code>hidden</code> variable of optional type <code>Condition</code> which can be set using a function or <code>NSPredicate</code>.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Hiding using a function condition</h4><a id="user-content-hiding-using-a-function-condition" class="anchor" aria-label="Permalink: Hiding using a function condition" href="#hiding-using-a-function-condition"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Using the <code>function</code> case of <code>Condition</code>:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="Condition.function([String], (Form)->Bool)"><pre><span class="pl-smi">Condition</span><span class="pl-kos">.</span><span class="pl-en">function</span><span class="pl-kos">(</span><span class="pl-kos">[</span>String<span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-kos">(</span>Form<span class="pl-kos">)</span><span class="pl-c1">-</span><span class="pl-c1">></span>Bool<span class="pl-kos">)</span></pre></div> <p dir="auto">The array of <code>String</code> to pass should contain the tags of the rows this row depends on. Each time the value of any of those rows changes the function is reevaluated. The function then takes the <code>Form</code> and returns a <code>Bool</code> indicating whether the row should be hidden or not. This the most powerful way of setting up the <code>hidden</code> property as it has no explicit limitations of what can be done.</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="form +++ Section() <<< SwitchRow("switchRowTag"){ $0.title = "Show message" } <<< LabelRow(){ $0.hidden = Condition.function(["switchRowTag"], { form in return !((form.rowBy(tag: "switchRowTag") as? SwitchRow)?.value ?? false) }) $0.title = "Switch is on!" }"><pre>form <span class="pl-c1">+++</span> <span class="pl-en">Section</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1"><<<</span> <span class="pl-en">SwitchRow</span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">switchRowTag</span><span class="pl-s">"</span><span class="pl-kos">)</span><span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Show message</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-c1"><<<</span> <span class="pl-en">LabelRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">{</span> $0<span class="pl-kos">.</span>hidden <span class="pl-c1">=</span> <span class="pl-smi">Condition</span><span class="pl-kos">.</span><span class="pl-en">function</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-s">"</span><span class="pl-s">switchRowTag</span><span class="pl-s">"</span><span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-kos">{</span> form <span class="pl-k">in</span> <span class="pl-k">return</span> !<span class="pl-kos">(</span><span class="pl-kos">(</span>form<span class="pl-kos">.</span><span class="pl-en">rowBy</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">switchRowTag</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-k">as?</span> <span class="pl-smi">SwitchRow</span><span class="pl-kos">)</span><span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">.</span>value <span class="pl-c1">??</span> <span class="pl-c1">false</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Switch is on!</span><span class="pl-s">"</span> <span class="pl-kos">}</span></pre></div> <p dir="auto"><a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/EurekaHidden.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/EurekaHidden.gif" width="300" alt="Screenshot of Hidden Rows" data-animated-image="" style="max-width: 100%;"></a></p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="public enum Condition { case function([String], (Form)->Bool) case predicate(NSPredicate) }"><pre><span class="pl-k">public</span> <span class="pl-k">enum</span> <span class="pl-smi">Condition</span> <span class="pl-kos">{</span> <span class="pl-k">case</span> function<span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-smi">String</span><span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-smi">Form</span><span class="pl-kos">)</span><span class="pl-c1">-></span><span class="pl-smi">Bool</span><span class="pl-kos">)</span> <span class="pl-k">case</span> predicate<span class="pl-kos">(</span><span class="pl-smi">NSPredicate</span><span class="pl-kos">)</span> <span class="pl-kos">}</span></pre></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Hiding using an NSPredicate</h4><a id="user-content-hiding-using-an-nspredicate" class="anchor" aria-label="Permalink: Hiding using an NSPredicate" href="#hiding-using-an-nspredicate"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The <code>hidden</code> variable can also be set with a NSPredicate. In the predicate string you can reference values of other rows by their tags to determine if a row should be hidden or visible. This will only work if the values of the rows the predicate has to check are NSObjects (String and Int will work as they are bridged to their ObjC counterparts, but enums won't work). Why could it then be useful to use predicates when they are more limited? Well, they can be much simpler, shorter and readable than functions. Look at this example:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="$0.hidden = Condition.predicate(NSPredicate(format: "$switchTag == false"))"><pre>$0<span class="pl-kos">.</span>hidden <span class="pl-c1">=</span> <span class="pl-smi">Condition</span><span class="pl-kos">.</span><span class="pl-en">predicate</span><span class="pl-kos">(</span><span class="pl-en">NSPredicate</span><span class="pl-kos">(</span>format<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">$switchTag == false</span><span class="pl-s">"</span><span class="pl-kos">)</span><span class="pl-kos">)</span></pre></div> <p dir="auto">And we can write it even shorter since <code>Condition</code> conforms to <code>ExpressibleByStringLiteral</code>:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="$0.hidden = "$switchTag == false""><pre>$0<span class="pl-kos">.</span>hidden <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">$switchTag == false</span><span class="pl-s">"</span></pre></div> <p dir="auto"><em>Note: we will substitute the value of the row whose tag is 'switchTag' instead of '$switchTag'</em></p> <p dir="auto">For all of this to work, <strong>all of the implicated rows must have a tag</strong> as the tag will identify them.</p> <p dir="auto">We can also hide a row by doing:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="$0.hidden = true"><pre>$0<span class="pl-kos">.</span>hidden <span class="pl-c1">=</span> <span class="pl-c1">true</span></pre></div> <p dir="auto">as <code>Condition</code> conforms to <code>ExpressibleByBooleanLiteral</code>.</p> <p dir="auto">Not setting the <code>hidden</code> variable will leave the row always visible.</p> <p dir="auto">If you manually set the hidden (or disabled) condition after the form has been displayed you may have to call <code>row.evaluateHidden()</code> to force Eureka to reevaluate the new condition. See <a href="https://github.com/xmartlabs/Eureka#row-does-not-update-after-changing-hidden-or-disabled-condition">this FAQ section</a> for more info.</p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Sections</h5><a id="user-content-sections" class="anchor" aria-label="Permalink: Sections" href="#sections"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">For sections this works just the same. That means we can set up section <code>hidden</code> property to show/hide it dynamically.</p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Disabling rows</h5><a id="user-content-disabling-rows" class="anchor" aria-label="Permalink: Disabling rows" href="#disabling-rows"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">To disable rows, each row has an <code>disabled</code> variable which is also an optional <code>Condition</code> type property. This variable also works the same as the <code>hidden</code> variable so that it requires the rows to have a tag.</p> <p dir="auto">Note that if you want to disable a row permanently you can also set <code>disabled</code> variable to <code>true</code>.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">List Sections</h3><a id="user-content-list-sections" class="anchor" aria-label="Permalink: List Sections" href="#list-sections"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">To display a list of options, Eureka includes a special section called <code>SelectableSection</code>. When creating one you need to pass the type of row to use in the options and the <code>selectionType</code>. The <code>selectionType</code> is an enum which can be either <code>multipleSelection</code> or <code>singleSelection(enableDeselection: Bool)</code> where the <code>enableDeselection</code> parameter determines if the selected rows can be deselected or not.</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="form +++ SelectableSection<ListCheckRow<String>>("Where do you live", selectionType: .singleSelection(enableDeselection: true)) let continents = ["Africa", "Antarctica", "Asia", "Australia", "Europe", "North America", "South America"] for option in continents { form.last! <<< ListCheckRow<String>(option){ listRow in listRow.title = option listRow.selectableValue = option listRow.value = nil } }"><pre>form <span class="pl-c1">+++</span> <span class="pl-smi">SelectableSection</span><span class="pl-c1"><</span><span class="pl-smi">ListCheckRow</span><span class="pl-c1"><</span><span class="pl-smi">String</span><span class="pl-c1">></span><span class="pl-c1">></span><span class="pl-kos">(</span><span class="pl-s">"</span><span class="pl-s">Where do you live</span><span class="pl-s">"</span><span class="pl-kos">,</span> selectionType<span class="pl-kos">:</span> <span class="pl-kos">.</span>singleSelection<span class="pl-kos">(</span>enableDeselection<span class="pl-kos">:</span> <span class="pl-c1">true</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-k">let</span> <span class="pl-s1">continents</span> <span class="pl-c1">=</span> <span class="pl-kos">[</span><span class="pl-s">"</span><span class="pl-s">Africa</span><span class="pl-s">"</span><span class="pl-kos">,</span> <span class="pl-s">"</span><span class="pl-s">Antarctica</span><span class="pl-s">"</span><span class="pl-kos">,</span> <span class="pl-s">"</span><span class="pl-s">Asia</span><span class="pl-s">"</span><span class="pl-kos">,</span> <span class="pl-s">"</span><span class="pl-s">Australia</span><span class="pl-s">"</span><span class="pl-kos">,</span> <span class="pl-s">"</span><span class="pl-s">Europe</span><span class="pl-s">"</span><span class="pl-kos">,</span> <span class="pl-s">"</span><span class="pl-s">North America</span><span class="pl-s">"</span><span class="pl-kos">,</span> <span class="pl-s">"</span><span class="pl-s">South America</span><span class="pl-s">"</span><span class="pl-kos">]</span> <span class="pl-k">for</span> <span class="pl-s1">option</span> <span class="pl-k">in</span> continents <span class="pl-kos">{</span> form<span class="pl-kos">.</span>last! <span class="pl-c1"><<<</span> <span class="pl-smi">ListCheckRow</span><span class="pl-c1"><</span><span class="pl-smi">String</span><span class="pl-c1">></span><span class="pl-kos">(</span>option<span class="pl-kos">)</span><span class="pl-kos">{</span> listRow <span class="pl-k">in</span> listRow<span class="pl-kos">.</span>title <span class="pl-c1">=</span> option listRow<span class="pl-kos">.</span>selectableValue <span class="pl-c1">=</span> option listRow<span class="pl-kos">.</span>value <span class="pl-c1">=</span> <span class="pl-smi">nil</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">What kind of rows can be used?</h5><a id="user-content-what-kind-of-rows-can-be-used" class="anchor" aria-label="Permalink: What kind of rows can be used?" href="#what-kind-of-rows-can-be-used"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">To create such a section you have to create a row that conforms the <code>SelectableRowType</code> protocol.</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="public protocol SelectableRowType : RowType { var selectableValue : Value? { get set } }"><pre><span class="pl-k">public</span> <span class="pl-k">protocol</span> <span class="pl-smi">SelectableRowType</span> <span class="pl-kos">:</span> <span class="pl-smi">RowType</span> <span class="pl-kos">{</span> <span class="pl-s1"><span class="pl-k">var</span> <span class="pl-c1">selectableValue</span></span> <span class="pl-kos">:</span> <span class="pl-smi">Value</span><span class="pl-c1"><span class="pl-c1">?</span></span> <span class="pl-kos">{</span> <span class="pl-k">get</span> <span class="pl-k">set</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">This <code>selectableValue</code> is where the value of the row will be permanently stored. The <code>value</code> variable will be used to determine if the row is selected or not, being 'selectableValue' if selected or nil otherwise. Eureka includes the <code>ListCheckRow</code> which is used for example. In the custom rows of the Examples project you can also find the <code>ImageCheckRow</code>.</p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Getting the selected rows</h5><a id="user-content-getting-the-selected-rows" class="anchor" aria-label="Permalink: Getting the selected rows" href="#getting-the-selected-rows"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">To easily get the selected row/s of a <code>SelectableSection</code> there are two methods: <code>selectedRow()</code> and <code>selectedRows()</code> which can be called to get the selected row in case it is a <code>SingleSelection</code> section or all the selected rows if it is a <code>MultipleSelection</code> section.</p> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Grouping options in sections</h5><a id="user-content-grouping-options-in-sections" class="anchor" aria-label="Permalink: Grouping options in sections" href="#grouping-options-in-sections"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Additionally you can setup list of options to be grouped by sections using following properties of <code>SelectorViewController</code>:</p> <ul dir="auto"> <li> <p dir="auto"><code>sectionKeyForValue</code> - a closure that should return key for particular row value. This key is later used to break options by sections.</p> </li> <li> <p dir="auto"><code>sectionHeaderTitleForKey</code> - a closure that returns header title for a section for particular key. By default returns the key itself.</p> </li> <li> <p dir="auto"><code>sectionFooterTitleForKey</code> - a closure that returns footer title for a section for particular key.</p> </li> </ul> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Multivalued Sections</h3><a id="user-content-multivalued-sections" class="anchor" aria-label="Permalink: Multivalued Sections" href="#multivalued-sections"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Eureka supports multiple values for a certain field (such as telephone numbers in a contact) by using Multivalued sections. It allows us to easily create insertable, deletable and reorderable sections.</p> <p dir="auto"><a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/EurekaMultivalued.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/EurekaMultivalued.gif" width="300" alt="Screenshot of Multivalued Section" data-animated-image="" style="max-width: 100%;"></a></p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How to create a multivalued section</h4><a id="user-content-how-to-create-a-multivalued-section" class="anchor" aria-label="Permalink: How to create a multivalued section" href="#how-to-create-a-multivalued-section"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">In order to create a multivalued section we have to use <code>MultivaluedSection</code> type instead of the regular <code>Section</code> type. <code>MultivaluedSection</code> extends <code>Section</code> and has some additional properties to configure multivalued section behavior.</p> <p dir="auto">let's dive into a code example...</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="form +++ MultivaluedSection(multivaluedOptions: [.Reorder, .Insert, .Delete], header: "Multivalued TextField", footer: ".Insert adds a 'Add Item' (Add New Tag) button row as last cell.") { $0.addButtonProvider = { section in return ButtonRow(){ $0.title = "Add New Tag" } } $0.multivaluedRowToInsertAt = { index in return NameRow() { $0.placeholder = "Tag Name" } } $0 <<< NameRow() { $0.placeholder = "Tag Name" } }"><pre>form <span class="pl-c1">+++</span> <span class="pl-en">MultivaluedSection</span><span class="pl-kos">(</span>multivaluedOptions<span class="pl-kos">:</span> <span class="pl-kos">[</span><span class="pl-kos">.</span>Reorder<span class="pl-kos">,</span> <span class="pl-kos">.</span>Insert<span class="pl-kos">,</span> <span class="pl-kos">.</span>Delete<span class="pl-kos">]</span><span class="pl-kos">,</span> header<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">Multivalued TextField</span><span class="pl-s">"</span><span class="pl-kos">,</span> footer<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">.Insert adds a 'Add Item' (Add New Tag) button row as last cell.</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>addButtonProvider <span class="pl-c1">=</span> <span class="pl-kos">{</span> section <span class="pl-k">in</span> <span class="pl-k">return</span> <span class="pl-en">ButtonRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Add New Tag</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> $0<span class="pl-kos">.</span>multivaluedRowToInsertAt <span class="pl-c1">=</span> <span class="pl-kos">{</span> index <span class="pl-k">in</span> <span class="pl-k">return</span> <span class="pl-en">NameRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>placeholder <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Tag Name</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> $0 <span class="pl-c1"><<<</span> <span class="pl-en">NameRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>placeholder <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Tag Name</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">Previous code snippet shows how to create a multivalued section. In this case we want to insert, delete and reorder rows as multivaluedOptions argument indicates.</p> <p dir="auto"><code>addButtonProvider</code> allows us to customize the button row which inserts a new row when tapped and <code>multivaluedOptions</code> contains <code>.Insert</code> value.</p> <p dir="auto"><code>multivaluedRowToInsertAt</code> closure property is called by Eureka each time a new row needs to be inserted. In order to provide the row to add into multivalued section we should set this property. Eureka passes the index as closure parameter. Notice that we can return any kind of row, even custom rows, even though in most cases multivalued section rows are of the same type.</p> <p dir="auto">Eureka automatically adds a button row when we create a insertable multivalued section. We can customize how the this button row looks like as we explained before. <code>showInsertIconInAddButton</code> property indicates if plus button (insert style) should appear in the left of the button, true by default.</p> <p dir="auto">There are some considerations we need to have in mind when creating insertable sections. Any row added to the insertable multivalued section should be placed above the row that Eureka automatically adds to insert new rows. This can be easily achieved by adding these additional rows to the section from inside the section's initializer closure (last parameter of section initializer) so then Eureka adds the adds insert button at the end of the section.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Editing mode</h4><a id="user-content-editing-mode" class="anchor" aria-label="Permalink: Editing mode" href="#editing-mode"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">By default Eureka will set the tableView's <code>isEditing</code> to true only if there is a MultivaluedSection in the form. This will be done in <code>viewWillAppear</code> the first time a form is presented.</p> <p dir="auto">For more information on how to use multivalued sections please take a look at Eureka example project which contains several usage examples.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Custom add button</h4><a id="user-content-custom-add-button" class="anchor" aria-label="Permalink: Custom add button" href="#custom-add-button"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">If you want to use an add button which is not a <code>ButtonRow</code> then you can use <code>GenericMultivaluedSection<AddButtonType></code>, where <code>AddButtonType</code> is the type of the row you want to use as add button. This is useful if you want to use a custom row to change the UI of the button.</p> <p dir="auto">Example:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="GenericMultivaluedSection<LabelRow>(multivaluedOptions: [.Reorder, .Insert, .Delete], { $0.addButtonProvider = { section in return LabelRow(){ $0.title = "A Label row as add button" } } // ... }"><pre><span class="pl-smi">GenericMultivaluedSection</span><span class="pl-c1"><</span><span class="pl-smi">LabelRow</span><span class="pl-c1">></span><span class="pl-kos">(</span>multivaluedOptions<span class="pl-kos">:</span> <span class="pl-kos">[</span><span class="pl-kos">.</span>Reorder<span class="pl-kos">,</span> <span class="pl-kos">.</span>Insert<span class="pl-kos">,</span> <span class="pl-kos">.</span>Delete<span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>addButtonProvider <span class="pl-c1">=</span> <span class="pl-kos">{</span> section <span class="pl-k">in</span> <span class="pl-k">return</span> <span class="pl-en">LabelRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">A Label row as add button</span><span class="pl-s">"</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> // ... <span class="pl-kos">}</span><span class="pl-kos"></span></pre></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Validations</h3><a id="user-content-validations" class="anchor" aria-label="Permalink: Validations" href="#validations"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Eureka 2.0.0 introduces the much requested built-in validations feature.</p> <p dir="auto">A row has a collection of <code>Rules</code> and a specific configuration that determines when validation rules should be evaluated.</p> <p dir="auto">There are some rules provided by default, but you can also create new ones on your own.</p> <p dir="auto">The provided rules are:</p> <ul dir="auto"> <li>RuleRequired</li> <li>RuleEmail</li> <li>RuleURL</li> <li>RuleGreaterThan, RuleGreaterOrEqualThan, RuleSmallerThan, RuleSmallerOrEqualThan</li> <li>RuleMinLength, RuleMaxLength</li> <li>RuleClosure</li> </ul> <p dir="auto">Let's see how to set up the validation rules.</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content=" override func viewDidLoad() { super.viewDidLoad() form +++ Section(header: "Required Rule", footer: "Options: Validates on change") <<< TextRow() { $0.title = "Required Rule" $0.add(rule: RuleRequired()) // This could also have been achieved using a closure that returns nil if valid, or a ValidationError otherwise. /* let ruleRequiredViaClosure = RuleClosure<String> { rowValue in return (rowValue == nil || rowValue!.isEmpty) ? ValidationError(msg: "Field required!") : nil } $0.add(rule: ruleRequiredViaClosure) */ $0.validationOptions = .validatesOnChange } .cellUpdate { cell, row in if !row.isValid { cell.titleLabel?.textColor = .systemRed } } +++ Section(header: "Email Rule, Required Rule", footer: "Options: Validates on change after blurred") <<< TextRow() { $0.title = "Email Rule" $0.add(rule: RuleRequired()) $0.add(rule: RuleEmail()) $0.validationOptions = .validatesOnChangeAfterBlurred } .cellUpdate { cell, row in if !row.isValid { cell.titleLabel?.textColor = .systemRed } } "><pre><span class="pl-k"><span class="pl-k">override</span></span> <span class="pl-en">func</span> viewDidLoad<span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> super<span class="pl-kos">.</span><span class="pl-en">viewDidLoad</span><span class="pl-kos">(</span><span class="pl-kos">)</span> form <span class="pl-c1">+++</span> <span class="pl-en">Section</span><span class="pl-kos">(</span>header<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">Required Rule</span><span class="pl-s">"</span><span class="pl-kos">,</span> footer<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">Options: Validates on change</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-c1"><<<</span> <span class="pl-en">TextRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Required Rule</span><span class="pl-s">"</span> $0<span class="pl-kos">.</span><span class="pl-en">add</span><span class="pl-kos">(</span>rule<span class="pl-kos">:</span> <span class="pl-en">RuleRequired</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span> // This could also have been achieved using a closure that returns nil if valid, or a ValidationError otherwise. /* let ruleRequiredViaClosure = RuleClosure<String> { rowValue in return (rowValue == nil || rowValue!.isEmpty) ? ValidationError(msg: "Field required!") : nil } $0.add(rule: ruleRequiredViaClosure) */ $0<span class="pl-kos">.</span>validationOptions <span class="pl-c1">=</span> <span class="pl-kos">.</span>validatesOnChange <span class="pl-kos">}</span> <span class="pl-kos">.</span><span class="pl-en">cellUpdate</span> <span class="pl-kos">{</span> cell<span class="pl-kos">,</span> row <span class="pl-k">in</span> <span class="pl-k">if</span> !row<span class="pl-kos">.</span>isValid <span class="pl-kos">{</span> cell<span class="pl-kos">.</span>titleLabel<span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">.</span>textColor <span class="pl-c1">=</span> <span class="pl-kos">.</span>systemRed <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-c1">+++</span> <span class="pl-en">Section</span><span class="pl-kos">(</span>header<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">Email Rule, Required Rule</span><span class="pl-s">"</span><span class="pl-kos">,</span> footer<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">Options: Validates on change after blurred</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-c1"><<<</span> <span class="pl-en">TextRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Email Rule</span><span class="pl-s">"</span> $0<span class="pl-kos">.</span><span class="pl-en">add</span><span class="pl-kos">(</span>rule<span class="pl-kos">:</span> <span class="pl-en">RuleRequired</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span> $0<span class="pl-kos">.</span><span class="pl-en">add</span><span class="pl-kos">(</span>rule<span class="pl-kos">:</span> <span class="pl-en">RuleEmail</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span> $0<span class="pl-kos">.</span>validationOptions <span class="pl-c1">=</span> <span class="pl-kos">.</span>validatesOnChangeAfterBlurred <span class="pl-kos">}</span> <span class="pl-kos">.</span><span class="pl-en">cellUpdate</span> <span class="pl-kos">{</span> cell<span class="pl-kos">,</span> row <span class="pl-k">in</span> <span class="pl-k">if</span> !row<span class="pl-kos">.</span>isValid <span class="pl-kos">{</span> cell<span class="pl-kos">.</span>titleLabel<span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">.</span>textColor <span class="pl-c1">=</span> <span class="pl-kos">.</span>systemRed <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">As you can see in the previous code snippet we can set up as many rules as we want in a row by invoking row's <code>add(rule:)</code> function.</p> <p dir="auto">Row also provides <code>func remove(ruleWithIdentifier identifier: String)</code> to remove a rule. In order to use it we must assign an id to the rule after creating it.</p> <p dir="auto">Sometimes the collection of rules we want to use on a row is the same we want to use on many other rows. In this case we can set up all validation rules using a <code>RuleSet</code> which is a collection of validation rules.</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="var rules = RuleSet<String>() rules.add(rule: RuleRequired()) rules.add(rule: RuleEmail()) let row = TextRow() { $0.title = "Email Rule" $0.add(ruleSet: rules) $0.validationOptions = .validatesOnChangeAfterBlurred }"><pre><span class="pl-k">var</span> <span class="pl-s1">rules</span> <span class="pl-c1">=</span> <span class="pl-smi">RuleSet</span><span class="pl-c1"><</span><span class="pl-smi">String</span><span class="pl-c1">></span><span class="pl-kos">(</span><span class="pl-kos">)</span> rules<span class="pl-kos">.</span><span class="pl-en">add</span><span class="pl-kos">(</span>rule<span class="pl-kos">:</span> <span class="pl-en">RuleRequired</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span> rules<span class="pl-kos">.</span><span class="pl-en">add</span><span class="pl-kos">(</span>rule<span class="pl-kos">:</span> <span class="pl-en">RuleEmail</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-k">let</span> <span class="pl-s1">row</span> <span class="pl-c1">=</span> <span class="pl-en">TextRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Email Rule</span><span class="pl-s">"</span> $0<span class="pl-kos">.</span><span class="pl-en">add</span><span class="pl-kos">(</span>ruleSet<span class="pl-kos">:</span> rules<span class="pl-kos">)</span> $0<span class="pl-kos">.</span>validationOptions <span class="pl-c1">=</span> <span class="pl-kos">.</span>validatesOnChangeAfterBlurred <span class="pl-kos">}</span></pre></div> <p dir="auto">Eureka allows us to specify when validation rules should be evaluated. We can do it by setting up <code>validationOptions</code> row's property, which can have the following values:</p> <ul dir="auto"> <li><code>.validatesOnChange</code> - Validates whenever a row value changes.</li> <li><code>.validatesOnBlur</code> - (Default value) validates right after the cell resigns first responder. Not applicable for all rows.</li> <li><code>.validatesOnChangeAfterBlurred</code> - Validates whenever the row value changes after it resigns first responder for the first time.</li> <li><code>.validatesOnDemand</code> - We should manually validate the row or form by invoking <code>validate()</code> method.</li> </ul> <p dir="auto">If you want to validate the entire form (all the rows) you can manually invoke Form <code>validate()</code> method.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How to get validation errors</h4><a id="user-content-how-to-get-validation-errors" class="anchor" aria-label="Permalink: How to get validation errors" href="#how-to-get-validation-errors"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Each row has the <code>validationErrors</code> property that can be used to retrieve all validation errors. This property just holds the validation error list of the latest row validation execution, which means it doesn't evaluate the validation rules of the row.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Note on types</h4><a id="user-content-note-on-types" class="anchor" aria-label="Permalink: Note on types" href="#note-on-types"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">As expected, the Rules must use the same types as the Row object. Be extra careful to check the row type used. You might see a compiler error ("Incorrect arugment label in call (have 'rule:' expected 'ruleSet:')" that is not pointing to the problem when mixing types.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Swipe Actions</h3><a id="user-content-swipe-actions" class="anchor" aria-label="Permalink: Swipe Actions" href="#swipe-actions"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">By using swipe actions we can define multiple <code>leadingSwipe</code> and <code>trailingSwipe</code> actions per row. As swipe actions depend on iOS system features, <code>leadingSwipe</code> is available on iOS 11.0+ only.</p> <p dir="auto">Let's see how to define swipe actions.</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="let row = TextRow() { let deleteAction = SwipeAction( style: .destructive, title: "Delete", handler: { (action, row, completionHandler) in //add your code here. //make sure you call the completionHandler once done. completionHandler?(true) }) deleteAction.image = UIImage(named: "icon-trash") $0.trailingSwipe.actions = [deleteAction] $0.trailingSwipe.performsFirstActionWithFullSwipe = true //please be aware: `leadingSwipe` is only available on iOS 11+ only let infoAction = SwipeAction( style: .normal, title: "Info", handler: { (action, row, completionHandler) in //add your code here. //make sure you call the completionHandler once done. completionHandler?(true) }) infoAction.actionBackgroundColor = .blue infoAction.image = UIImage(named: "icon-info") $0.leadingSwipe.actions = [infoAction] $0.leadingSwipe.performsFirstActionWithFullSwipe = true }"><pre><span class="pl-k">let</span> <span class="pl-s1">row</span> <span class="pl-c1">=</span> <span class="pl-en">TextRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-k">let</span> <span class="pl-s1">deleteAction</span> <span class="pl-c1">=</span> <span class="pl-en">SwipeAction</span><span class="pl-kos">(</span> style<span class="pl-kos">:</span> <span class="pl-kos">.</span>destructive<span class="pl-kos">,</span> title<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">Delete</span><span class="pl-s">"</span><span class="pl-kos">,</span> handler<span class="pl-kos">:</span> <span class="pl-kos">{</span> <span class="pl-kos">(</span>action<span class="pl-kos">,</span> row<span class="pl-kos">,</span> completionHandler<span class="pl-kos">)</span> <span class="pl-k">in</span> //add your code here. //make sure you call the completionHandler once done. <span class="pl-en">completionHandler</span><span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">(</span><span class="pl-c1">true</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> deleteAction<span class="pl-kos">.</span>image <span class="pl-c1">=</span> <span class="pl-en">UIImage</span><span class="pl-kos">(</span>named<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">icon-trash</span><span class="pl-s">"</span><span class="pl-kos">)</span> $0<span class="pl-kos">.</span>trailingSwipe<span class="pl-kos">.</span>actions <span class="pl-c1">=</span> <span class="pl-kos">[</span>deleteAction<span class="pl-kos">]</span> $0<span class="pl-kos">.</span>trailingSwipe<span class="pl-kos">.</span>performsFirstActionWithFullSwipe <span class="pl-c1">=</span> <span class="pl-c1">true</span> //please be aware: `leadingSwipe` is only available on iOS 11+ only <span class="pl-k">let</span> <span class="pl-s1">infoAction</span> <span class="pl-c1">=</span> <span class="pl-en">SwipeAction</span><span class="pl-kos">(</span> style<span class="pl-kos">:</span> <span class="pl-kos">.</span>normal<span class="pl-kos">,</span> title<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">Info</span><span class="pl-s">"</span><span class="pl-kos">,</span> handler<span class="pl-kos">:</span> <span class="pl-kos">{</span> <span class="pl-kos">(</span>action<span class="pl-kos">,</span> row<span class="pl-kos">,</span> completionHandler<span class="pl-kos">)</span> <span class="pl-k">in</span> //add your code here. //make sure you call the completionHandler once done. <span class="pl-en">completionHandler</span><span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">(</span><span class="pl-c1">true</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> infoAction<span class="pl-kos">.</span>actionBackgroundColor <span class="pl-c1">=</span> <span class="pl-kos">.</span>blue infoAction<span class="pl-kos">.</span>image <span class="pl-c1">=</span> <span class="pl-en">UIImage</span><span class="pl-kos">(</span>named<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">icon-info</span><span class="pl-s">"</span><span class="pl-kos">)</span> $0<span class="pl-kos">.</span>leadingSwipe<span class="pl-kos">.</span>actions <span class="pl-c1">=</span> <span class="pl-kos">[</span>infoAction<span class="pl-kos">]</span> $0<span class="pl-kos">.</span>leadingSwipe<span class="pl-kos">.</span>performsFirstActionWithFullSwipe <span class="pl-c1">=</span> <span class="pl-c1">true</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">Swipe Actions need <code>tableView.isEditing</code> be set to <code>false</code>. Eureka will set this to <code>true</code> if there is a MultivaluedSection in the form (in the <code>viewWillAppear</code>). If you have both MultivaluedSections and swipe actions in the same form you should set <code>isEditing</code> according to your needs.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Custom rows</h2><a id="user-content-custom-rows" class="anchor" aria-label="Permalink: Custom rows" href="#custom-rows"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">It is very common that you need a row that is different from those included in Eureka. If this is the case you will have to create your own row but this should not be difficult. You can read <a href="https://blog.xmartlabs.com/2016/09/06/Eureka-custom-row-tutorial/" rel="nofollow">this tutorial on how to create custom rows</a> to get started. You might also want to have a look at <a href="https://github.com/EurekaCommunity">EurekaCommunity</a> which includes some extra rows ready to be added to Eureka.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Basic custom rows</h3><a id="user-content-basic-custom-rows" class="anchor" aria-label="Permalink: Basic custom rows" href="#basic-custom-rows"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">To create a row with custom behaviour and appearance you'll probably want to create subclasses of <code>Row</code> and <code>Cell</code>.</p> <p dir="auto">Remember that <code>Row</code> is the abstraction Eureka uses, while the <code>Cell</code> is the actual <code>UITableViewCell</code> in charge of the view. As the <code>Row</code> contains the <code>Cell</code>, both <code>Row</code> and <code>Cell</code> must be defined for the same <strong>value</strong> type.</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Custom Cell with value type: Bool // The cell is defined using a .xib, so we can set outlets :) public class CustomCell: Cell<Bool>, CellType { @IBOutlet weak var switchControl: UISwitch! @IBOutlet weak var label: UILabel! public override func setup() { super.setup() switchControl.addTarget(self, action: #selector(CustomCell.switchValueChanged), for: .valueChanged) } func switchValueChanged(){ row.value = switchControl.on row.updateCell() // Re-draws the cell which calls 'update' bellow } public override func update() { super.update() backgroundColor = (row.value ?? false) ? .white : .black } } // The custom Row also has the cell: CustomCell and its correspond value public final class CustomRow: Row<CustomCell>, RowType { required public init(tag: String?) { super.init(tag: tag) // We set the cellProvider to load the .xib corresponding to our cell cellProvider = CellProvider<CustomCell>(nibName: "CustomCell") } }"><pre>// Custom Cell with value type: Bool // The cell is defined using a .xib, so we can set outlets :) <span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-smi">CustomCell</span><span class="pl-kos">:</span> <span class="pl-smi">Cell</span><span class="pl-c1"><</span><span class="pl-smi">Bool</span><span class="pl-c1">></span><span class="pl-kos">,</span> <span class="pl-smi">CellType</span> <span class="pl-kos">{</span> <span class="pl-s1">@<span class="pl-smi">IBOutlet</span></span> weak <span class="pl-k">var</span> <span class="pl-s1"><span class="pl-c1">switchControl</span></span><span class="pl-kos">:</span> <span class="pl-smi">UISwitch</span><span class="pl-c1">!</span> <span class="pl-s1">@<span class="pl-smi">IBOutlet</span></span> weak <span class="pl-k">var</span> <span class="pl-s1"><span class="pl-c1">label</span></span><span class="pl-kos">:</span> <span class="pl-smi">UILabel</span><span class="pl-c1">!</span> <span class="pl-k">public</span> <span class="pl-k"><span class="pl-k">override</span></span> <span class="pl-en">func</span> setup<span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> super<span class="pl-kos">.</span><span class="pl-en">setup</span><span class="pl-kos">(</span><span class="pl-kos">)</span> switchControl<span class="pl-kos">.</span><span class="pl-en">addTarget</span><span class="pl-kos">(</span><span class="pl-smi">self</span><span class="pl-kos">,</span> action<span class="pl-kos">:</span> #selector<span class="pl-kos">(</span><span class="pl-smi">CustomCell</span><span class="pl-kos">.</span>switchValueChanged<span class="pl-kos">)</span><span class="pl-kos">,</span> for<span class="pl-kos">:</span> <span class="pl-kos">.</span>valueChanged<span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-en">func</span> switchValueChanged<span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">{</span> row<span class="pl-kos">.</span>value <span class="pl-c1">=</span> switchControl<span class="pl-kos">.</span>on row<span class="pl-kos">.</span><span class="pl-en">updateCell</span><span class="pl-kos">(</span><span class="pl-kos">)</span> // Re-draws the cell which calls 'update' bellow <span class="pl-kos">}</span> <span class="pl-k">public</span> <span class="pl-k"><span class="pl-k">override</span></span> <span class="pl-en">func</span> update<span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> super<span class="pl-kos">.</span><span class="pl-en">update</span><span class="pl-kos">(</span><span class="pl-kos">)</span> backgroundColor <span class="pl-c1">=</span> <span class="pl-kos">(</span>row<span class="pl-kos">.</span>value <span class="pl-c1">??</span> <span class="pl-c1">false</span><span class="pl-kos">)</span> <span class="pl-c1">?</span> <span class="pl-kos">.</span>white <span class="pl-k">:</span> <span class="pl-kos">.</span>black <span class="pl-kos">}</span> <span class="pl-kos">}</span> // The custom Row also has the cell: CustomCell and its correspond value <span class="pl-k">public</span> <span class="pl-k">final</span> <span class="pl-k">class</span> <span class="pl-smi">CustomRow</span><span class="pl-kos">:</span> <span class="pl-smi">Row</span><span class="pl-c1"><</span><span class="pl-smi">CustomCell</span><span class="pl-c1">></span><span class="pl-kos">,</span> <span class="pl-smi">RowType</span> <span class="pl-kos">{</span> <span class="pl-k"><span class="pl-k">required</span></span> <span class="pl-k">public</span> <span class="pl-v">init</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> <span class="pl-smi">String</span><span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">)</span> <span class="pl-kos">{</span> super<span class="pl-kos">.</span><span class="pl-en">init</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> tag<span class="pl-kos">)</span> // We set the cellProvider to load the .xib corresponding to our cell cellProvider <span class="pl-c1">=</span> <span class="pl-smi">CellProvider</span><span class="pl-c1"><</span><span class="pl-smi">CustomCell</span><span class="pl-c1">></span><span class="pl-kos">(</span>nibName<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">CustomCell</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">The result: <br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/EurekaCustomRow.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/EurekaCustomRow.gif" alt="Screenshot of Disabled Row" data-animated-image="" style="max-width: 100%;"></a></p> <br> Custom rows need to subclass `Row` and conform to `RowType` protocol. Custom cells need to subclass `Cell` and conform to `CellType` protocol. <p dir="auto">Just like the callbacks cellSetup and CellUpdate, the <code>Cell</code> has the setup and update methods where you can customize it.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Custom inline rows</h3><a id="user-content-custom-inline-rows" class="anchor" aria-label="Permalink: Custom inline rows" href="#custom-inline-rows"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">An inline row is a specific type of row that shows dynamically a row below it, normally an inline row changes between an expanded and collapsed mode whenever the row is tapped.</p> <p dir="auto">So to create an inline row we need 2 rows, the row that is "always" visible and the row that will expand/collapse.</p> <p dir="auto">Another requirement is that the value type of these 2 rows must be the same. This means if one row holds a <code>String</code> value then the other must have a <code>String</code> value too.</p> <p dir="auto">Once we have these 2 rows, we should make the top row type conform to <code>InlineRowType</code>. This protocol requires you to define an <code>InlineRow</code> typealias and a <code>setupInlineRow</code> function. The <code>InlineRow</code> type will be the type of the row that will expand/collapse. Take this as an example:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="class PickerInlineRow<T> : Row<PickerInlineCell<T>> where T: Equatable { public typealias InlineRow = PickerRow<T> open var options = [T]() required public init(tag: String?) { super.init(tag: tag) } public func setupInlineRow(_ inlineRow: InlineRow) { inlineRow.options = self.options inlineRow.displayValueFor = self.displayValueFor inlineRow.cell.height = { UITableViewAutomaticDimension } } }"><pre><span class="pl-k">class</span> <span class="pl-smi">PickerInlineRow</span><span class="pl-c1"><</span>T<span class="pl-c1">></span> <span class="pl-kos">:</span> <span class="pl-smi">Row</span><span class="pl-c1"><</span><span class="pl-smi">PickerInlineCell</span><span class="pl-c1"><</span><span class="pl-smi">T</span><span class="pl-c1">></span><span class="pl-c1">></span> <span class="pl-k">where</span> T<span class="pl-kos">:</span> <span class="pl-smi">Equatable</span> <span class="pl-kos">{</span> <span class="pl-k">public</span> <span class="pl-k">typealias</span> <span class="pl-smi">InlineRow</span> <span class="pl-c1">=</span> <span class="pl-smi">PickerRow</span><span class="pl-c1"><</span><span class="pl-smi">T</span><span class="pl-c1">></span> <span class="pl-k">open</span> <span class="pl-k">var</span> <span class="pl-s1"><span class="pl-c1">options</span></span> <span class="pl-c1">=</span> <span class="pl-kos">[</span>T<span class="pl-kos">]</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-k"><span class="pl-k">required</span></span> <span class="pl-k">public</span> <span class="pl-v">init</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> <span class="pl-smi">String</span><span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">)</span> <span class="pl-kos">{</span> super<span class="pl-kos">.</span><span class="pl-en">init</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> tag<span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-k">public</span> <span class="pl-en">func</span> setupInlineRow<span class="pl-kos">(</span>_ inlineRow<span class="pl-kos">:</span> <span class="pl-smi">InlineRow</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> inlineRow<span class="pl-kos">.</span>options <span class="pl-c1">=</span> <span class="pl-smi">self</span><span class="pl-kos">.</span>options inlineRow<span class="pl-kos">.</span>displayValueFor <span class="pl-c1">=</span> <span class="pl-smi">self</span><span class="pl-kos">.</span>displayValueFor inlineRow<span class="pl-kos">.</span>cell<span class="pl-kos">.</span>height <span class="pl-c1">=</span> <span class="pl-kos">{</span> UITableViewAutomaticDimension <span class="pl-kos">}</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">The <code>InlineRowType</code> will also add some methods to your inline row:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="func expandInlineRow() func collapseInlineRow() func toggleInlineRow()"><pre><span class="pl-en">func</span> expandInlineRow<span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-en">func</span> collapseInlineRow<span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-en">func</span> toggleInlineRow<span class="pl-kos">(</span><span class="pl-kos">)</span></pre></div> <p dir="auto">These methods should work fine but should you want to override them keep in mind that it is <code>toggleInlineRow</code> that has to call <code>expandInlineRow</code> and <code>collapseInlineRow</code>.</p> <p dir="auto">Finally you must invoke <code>toggleInlineRow()</code> when the row is selected, for example overriding <code>customDidSelect</code>:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="public override func customDidSelect() { super.customDidSelect() if !isDisabled { toggleInlineRow() } }"><pre><span class="pl-k">public</span> <span class="pl-k"><span class="pl-k">override</span></span> <span class="pl-en">func</span> customDidSelect<span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> super<span class="pl-kos">.</span><span class="pl-en">customDidSelect</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-k">if</span> !isDisabled <span class="pl-kos">{</span> <span class="pl-en">toggleInlineRow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Custom Presenter rows</h3><a id="user-content-custom-presenter-rows" class="anchor" aria-label="Permalink: Custom Presenter rows" href="#custom-presenter-rows"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><strong>Note:</strong> <em>A Presenter row is a row that presents a new UIViewController.</em></p> <p dir="auto">To create a custom Presenter row you must create a class that conforms the <code>PresenterRowType</code> protocol. It is highly recommended to subclass <code>SelectorRow</code> as it does conform to that protocol and adds other useful functionality.</p> <p dir="auto">The PresenterRowType protocol is defined as follows:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="public protocol PresenterRowType: TypedRowType { associatedtype PresentedControllerType : UIViewController, TypedRowControllerType /// Defines how the view controller will be presented, pushed, etc. var presentationMode: PresentationMode<PresentedControllerType>? { get set } /// Will be called before the presentation occurs. var onPresentCallback: ((FormViewController, PresentedControllerType) -> Void)? { get set } }"><pre><span class="pl-k">public</span> <span class="pl-k">protocol</span> <span class="pl-smi">PresenterRowType</span><span class="pl-kos">:</span> <span class="pl-smi">TypedRowType</span> <span class="pl-kos">{</span> <span class="pl-k">associatedtype</span> <span class="pl-smi">PresentedControllerType</span> <span class="pl-kos">:</span> <span class="pl-smi">UIViewController</span><span class="pl-kos">,</span> TypedRowControllerType /// Defines how the view controller will be presented, pushed, etc. <span class="pl-s1"><span class="pl-k">var</span> <span class="pl-c1">presentationMode</span></span><span class="pl-kos">:</span> <span class="pl-smi">PresentationMode</span><span class="pl-c1"><</span><span class="pl-smi">PresentedControllerType</span><span class="pl-c1">></span><span class="pl-c1"><span class="pl-c1">?</span></span> <span class="pl-kos">{</span> <span class="pl-k">get</span> <span class="pl-k">set</span> <span class="pl-kos">}</span> /// Will be called before the presentation occurs. <span class="pl-s1"><span class="pl-k">var</span> <span class="pl-c1">onPresentCallback</span></span><span class="pl-kos">:</span> <span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-smi">FormViewController</span><span class="pl-kos">,</span> <span class="pl-smi">PresentedControllerType</span><span class="pl-kos">)</span> <span class="pl-c1">-></span> <span class="pl-smi">Void</span><span class="pl-kos">)</span><span class="pl-c1"><span class="pl-c1">?</span></span> <span class="pl-kos">{</span> <span class="pl-k">get</span> <span class="pl-k">set</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">The onPresentCallback will be called when the row is about to present another view controller. This is done in the <code>SelectorRow</code> so if you do not subclass it you will have to call it yourself.</p> <p dir="auto">The <code>presentationMode</code> is what defines how the controller is presented and which controller is presented. This presentation can be using a Segue identifier, a segue class, presenting a controller modally or pushing to a specific view controller. For example a CustomPushRow can be defined like this:</p> <p dir="auto">Let's see an example..</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content=" /// Generic row type where a user must select a value among several options. open class SelectorRow<Cell: CellType>: OptionsRow<Cell>, PresenterRowType where Cell: BaseCell { /// Defines how the view controller will be presented, pushed, etc. open var presentationMode: PresentationMode<SelectorViewController<SelectorRow<Cell>>>? /// Will be called before the presentation occurs. open var onPresentCallback: ((FormViewController, SelectorViewController<SelectorRow<Cell>>) -> Void)? required public init(tag: String?) { super.init(tag: tag) } /** Extends `didSelect` method */ open override func customDidSelect() { super.customDidSelect() guard let presentationMode = presentationMode, !isDisabled else { return } if let controller = presentationMode.makeController() { controller.row = self controller.title = selectorTitle ?? controller.title onPresentCallback?(cell.formViewController()!, controller) presentationMode.present(controller, row: self, presentingController: self.cell.formViewController()!) } else { presentationMode.present(nil, row: self, presentingController: self.cell.formViewController()!) } } /** Prepares the pushed row setting its title and completion callback. */ open override func prepare(for segue: UIStoryboardSegue) { super.prepare(for: segue) guard let rowVC = segue.destination as Any as? SelectorViewController<SelectorRow<Cell>> else { return } rowVC.title = selectorTitle ?? rowVC.title rowVC.onDismissCallback = presentationMode?.onDismissCallback ?? rowVC.onDismissCallback onPresentCallback?(cell.formViewController()!, rowVC) rowVC.row = self } } // SelectorRow conforms to PresenterRowType public final class CustomPushRow<T: Equatable>: SelectorRow<PushSelectorCell<T>>, RowType { public required init(tag: String?) { super.init(tag: tag) presentationMode = .show(controllerProvider: ControllerProvider.callback { return SelectorViewController<T>(){ _ in } }, onDismiss: { vc in _ = vc.navigationController?.popViewController(animated: true) }) } }"><pre>/// Generic row type where a user must select a value among several options. <span class="pl-k">open</span> <span class="pl-k">class</span> <span class="pl-smi">SelectorRow</span><span class="pl-c1"><</span>Cell<span class="pl-kos">:</span> <span class="pl-smi">CellType</span><span class="pl-c1">></span><span class="pl-kos">:</span> <span class="pl-smi">OptionsRow</span><span class="pl-c1"><</span><span class="pl-smi">Cell</span><span class="pl-c1">></span><span class="pl-kos">,</span> <span class="pl-smi">PresenterRowType</span> <span class="pl-k">where</span> Cell<span class="pl-kos">:</span> <span class="pl-smi">BaseCell</span> <span class="pl-kos">{</span> /// Defines how the view controller will be presented, pushed, etc. <span class="pl-k">open</span> <span class="pl-k">var</span> <span class="pl-s1"><span class="pl-c1">presentationMode</span></span><span class="pl-kos">:</span> <span class="pl-smi">PresentationMode</span><span class="pl-c1"><</span><span class="pl-smi">SelectorViewController</span><span class="pl-c1"><</span><span class="pl-smi">SelectorRow</span><span class="pl-c1"><</span><span class="pl-smi">Cell</span><span class="pl-c1">></span><span class="pl-c1">></span><span class="pl-c1">></span><span class="pl-c1"><span class="pl-c1">?</span></span> /// Will be called before the presentation occurs. <span class="pl-k">open</span> <span class="pl-k">var</span> <span class="pl-s1"><span class="pl-c1">onPresentCallback</span></span><span class="pl-kos">:</span> <span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-smi">FormViewController</span><span class="pl-kos">,</span> <span class="pl-smi">SelectorViewController</span><span class="pl-c1"><</span><span class="pl-smi">SelectorRow</span><span class="pl-c1"><</span><span class="pl-smi">Cell</span><span class="pl-c1">></span><span class="pl-c1">></span><span class="pl-kos">)</span> <span class="pl-c1">-></span> <span class="pl-smi">Void</span><span class="pl-kos">)</span><span class="pl-c1"><span class="pl-c1">?</span></span> <span class="pl-k"><span class="pl-k">required</span></span> <span class="pl-k">public</span> <span class="pl-v">init</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> <span class="pl-smi">String</span><span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">)</span> <span class="pl-kos">{</span> super<span class="pl-kos">.</span><span class="pl-en">init</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> tag<span class="pl-kos">)</span> <span class="pl-kos">}</span> /** Extends `didSelect` method */ <span class="pl-k">open</span> <span class="pl-k"><span class="pl-k">override</span></span> <span class="pl-en">func</span> customDidSelect<span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> super<span class="pl-kos">.</span><span class="pl-en">customDidSelect</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-k">guard</span> <span class="pl-k">let</span> presentationMode <span class="pl-c1">=</span> presentationMode<span class="pl-kos">,</span> !isDisabled <span class="pl-k">else</span> <span class="pl-kos">{</span> <span class="pl-k">return</span> <span class="pl-kos">}</span> <span class="pl-k">if</span> <span class="pl-k">let</span> controller <span class="pl-c1">=</span> presentationMode<span class="pl-kos">.</span><span class="pl-en">makeController</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> controller<span class="pl-kos">.</span>row <span class="pl-c1">=</span> <span class="pl-smi">self</span> controller<span class="pl-kos">.</span>title <span class="pl-c1">=</span> selectorTitle <span class="pl-c1">??</span> controller<span class="pl-kos">.</span>title <span class="pl-en">onPresentCallback</span><span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">(</span>cell<span class="pl-kos">.</span><span class="pl-en">formViewController</span><span class="pl-kos">(</span><span class="pl-kos">)</span>!<span class="pl-kos">,</span> controller<span class="pl-kos">)</span> presentationMode<span class="pl-kos">.</span><span class="pl-en">present</span><span class="pl-kos">(</span>controller<span class="pl-kos">,</span> row<span class="pl-kos">:</span> <span class="pl-smi">self</span><span class="pl-kos">,</span> presentingController<span class="pl-kos">:</span> <span class="pl-smi">self</span><span class="pl-kos">.</span>cell<span class="pl-kos">.</span><span class="pl-en">formViewController</span><span class="pl-kos">(</span><span class="pl-kos">)</span>!<span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-k">else</span> <span class="pl-kos">{</span> presentationMode<span class="pl-kos">.</span><span class="pl-en">present</span><span class="pl-kos">(</span><span class="pl-smi">nil</span><span class="pl-kos">,</span> row<span class="pl-kos">:</span> <span class="pl-smi">self</span><span class="pl-kos">,</span> presentingController<span class="pl-kos">:</span> <span class="pl-smi">self</span><span class="pl-kos">.</span>cell<span class="pl-kos">.</span><span class="pl-en">formViewController</span><span class="pl-kos">(</span><span class="pl-kos">)</span>!<span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> /** Prepares the pushed row setting its title and completion callback. */ <span class="pl-k">open</span> <span class="pl-k"><span class="pl-k">override</span></span> <span class="pl-en">func</span> prepare<span class="pl-kos">(</span>for segue<span class="pl-kos">:</span> <span class="pl-smi">UIStoryboardSegue</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> super<span class="pl-kos">.</span><span class="pl-en">prepare</span><span class="pl-kos">(</span>for<span class="pl-kos">:</span> segue<span class="pl-kos">)</span> <span class="pl-k">guard</span> <span class="pl-k">let</span> rowVC <span class="pl-c1">=</span> segue<span class="pl-kos">.</span>destination <span class="pl-k">as</span> <span class="pl-smi">Any</span> <span class="pl-k">as?</span> <span class="pl-smi">SelectorViewController</span><span class="pl-c1"><</span><span class="pl-smi">SelectorRow</span><span class="pl-c1"><</span><span class="pl-smi">Cell</span><span class="pl-c1">></span><span class="pl-c1">></span> <span class="pl-k">else</span> <span class="pl-kos">{</span> <span class="pl-k">return</span> <span class="pl-kos">}</span> rowVC<span class="pl-kos">.</span>title <span class="pl-c1">=</span> selectorTitle <span class="pl-c1">??</span> rowVC<span class="pl-kos">.</span>title rowVC<span class="pl-kos">.</span>onDismissCallback <span class="pl-c1">=</span> presentationMode<span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">.</span>onDismissCallback <span class="pl-c1">??</span> rowVC<span class="pl-kos">.</span>onDismissCallback <span class="pl-en">onPresentCallback</span><span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">(</span>cell<span class="pl-kos">.</span><span class="pl-en">formViewController</span><span class="pl-kos">(</span><span class="pl-kos">)</span>!<span class="pl-kos">,</span> rowVC<span class="pl-kos">)</span> rowVC<span class="pl-kos">.</span>row <span class="pl-c1">=</span> <span class="pl-smi">self</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span> // SelectorRow conforms to PresenterRowType <span class="pl-k">public</span> <span class="pl-k">final</span> <span class="pl-k">class</span> <span class="pl-smi">CustomPushRow</span><span class="pl-c1"><</span>T<span class="pl-kos">:</span> <span class="pl-smi">Equatable</span><span class="pl-c1">></span><span class="pl-kos">:</span> <span class="pl-smi">SelectorRow</span><span class="pl-c1"><</span><span class="pl-smi">PushSelectorCell</span><span class="pl-c1"><</span><span class="pl-smi">T</span><span class="pl-c1">></span><span class="pl-c1">></span><span class="pl-kos">,</span> <span class="pl-smi">RowType</span> <span class="pl-kos">{</span> <span class="pl-k">public</span> <span class="pl-k"><span class="pl-k">required</span></span> <span class="pl-v">init</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> <span class="pl-smi">String</span><span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">)</span> <span class="pl-kos">{</span> super<span class="pl-kos">.</span><span class="pl-en">init</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> tag<span class="pl-kos">)</span> presentationMode <span class="pl-c1">=</span> <span class="pl-kos">.</span>show<span class="pl-kos">(</span>controllerProvider<span class="pl-kos">:</span> <span class="pl-smi">ControllerProvider</span><span class="pl-kos">.</span><span class="pl-en">callback</span> <span class="pl-kos">{</span> <span class="pl-k">return</span> <span class="pl-smi">SelectorViewController</span><span class="pl-c1"><</span><span class="pl-smi">T</span><span class="pl-c1">></span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">{</span> _ <span class="pl-k">in</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> onDismiss<span class="pl-kos">:</span> <span class="pl-kos">{</span> vc <span class="pl-k">in</span> _ <span class="pl-c1">=</span> vc<span class="pl-kos">.</span>navigationController<span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">.</span><span class="pl-en">popViewController</span><span class="pl-kos">(</span>animated<span class="pl-kos">:</span> <span class="pl-c1">true</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Subclassing cells using the same row</h3><a id="user-content-subclassing-cells-using-the-same-row" class="anchor" aria-label="Permalink: Subclassing cells using the same row" href="#subclassing-cells-using-the-same-row"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Sometimes we want to change the UI look of one of our rows but without changing the row type and all the logic associated to one row. There is currently one way to do this <strong>if you are using cells that are instantiated from nib files</strong>. Currently, none of Eureka's core rows are instantiated from nib files but some of the custom rows in <a href="https://github.com/EurekaCommunity">EurekaCommunity</a> are, in particular the <a href="https://github.com/EurekaCommunity/PostalAddressRow">PostalAddressRow</a> which was moved there.</p> <p dir="auto">What you have to do is:</p> <ul dir="auto"> <li>Create a nib file containing the cell you want to create.</li> <li>Then set the class of the cell to be the existing cell you want to modify (if you want to change something more apart from pure UI then you should subclass that cell). Make sure the module of that class is correctly set</li> <li>Connect the outlets to your class</li> <li>Tell your row to use the new nib file. This is done by setting the <code>cellProvider</code> variable to use this nib. You should do this in the initialiser, either in each concrete instantiation or using the <code>defaultRowInitializer</code>. For example:</li> </ul> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="<<< PostalAddressRow() { $0.cellProvider = CellProvider<PostalAddressCell>(nibName: "CustomNib", bundle: Bundle.main) }"><pre><span class="pl-c1"><<<</span> PostalAddressRow<span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>cellProvider <span class="pl-c1">=</span> <span class="pl-smi">CellProvider</span><span class="pl-c1"><</span><span class="pl-smi">PostalAddressCell</span><span class="pl-c1">></span><span class="pl-kos">(</span>nibName<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">CustomNib</span><span class="pl-s">"</span><span class="pl-kos">,</span> bundle<span class="pl-kos">:</span> <span class="pl-smi">Bundle</span><span class="pl-kos">.</span>main<span class="pl-kos">)</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">You could also create a new row for this. In that case try to inherit from the same superclass as the row you want to change to inherit its logic.</p> <p dir="auto">There are some things to consider when you do this:</p> <ul dir="auto"> <li>If you want to see an example have a look at the <a href="https://github.com/EurekaCommunity/PostalAddressRow">PostalAddressRow</a> or the <a href="https://github.com/EurekaCommunity/CreditCardRow">CreditCardRow</a> which have use a custom nib file in their examples.</li> <li>If you get an error saying <code>Unknown class <YOUR_CLASS_NAME> in Interface Builder file</code>, it might be that you have to instantiate that new type somewhere in your code to load it in the runtime. Calling <code>let t = YourClass.self</code> helped in my case.</li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Row catalog</h2><a id="user-content-row-catalog" class="anchor" aria-label="Permalink: Row catalog" href="#row-catalog"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Controls Rows</h3><a id="user-content-controls-rows" class="anchor" aria-label="Permalink: Controls Rows" href="#controls-rows"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <markdown-accessiblity-table><table> <tbody><tr> <td><b>Label Row</b><br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/LabelRow.png"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/LabelRow.png" style="max-width: 100%;"></a> <br><br> </td> <td><b>Button Row</b><br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/ButtonRow.png"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/ButtonRow.png" style="max-width: 100%;"></a> <br><br> </td> <td><b>Check Row</b><br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/CheckRow.png"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/CheckRow.png" style="max-width: 100%;"></a> <br><br> </td> </tr> <tr> <td><b>Switch Row</b><br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/SwitchRow.png"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/SwitchRow.png" style="max-width: 100%;"></a> <br><br> </td> <td><b>Slider Row</b><br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/SliderRow.png"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/SliderRow.png" style="max-width: 100%;"></a> <br><br> </td> <td><b>Stepper Row</b><br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/StepperRow.png"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/StepperRow.png" style="max-width: 100%;"></a> <br><br> </td> </tr> <tr> <td><b>Text Area Row</b><br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/TextAreaRow.png"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/TextAreaRow.png" style="max-width: 100%;"></a> <br><br> </td> </tr> </tbody></table></markdown-accessiblity-table> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Field Rows</h3><a id="user-content-field-rows" class="anchor" aria-label="Permalink: Field Rows" href="#field-rows"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">These rows have a textfield on the right side of the cell. The difference between each one of them consists in a different capitalization, autocorrection and keyboard type configuration.</p> <markdown-accessiblity-table><table> <tbody><tr> <td> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/CatalogFieldRows.jpg"><img src="/xmartlabs/Eureka/raw/master/Example/Media/CatalogFieldRows.jpg" width="300" style="max-width: 100%;"></a> </td> <td> TextRow<br><br> NameRow<br><br> URLRow<br><br> IntRow<br><br> PhoneRow<br><br> PasswordRow<br><br> EmailRow<br><br> DecimalRow<br><br> TwitterRow<br><br> AccountRow<br><br> ZipCodeRow </td> </tr><tr> </tr></tbody></table></markdown-accessiblity-table> <p dir="auto">All of the <code>FieldRow</code> subtypes above have a <code>formatter</code> property of type <a href="https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFormatter_Class/" rel="nofollow"><code>NSFormatter</code></a> which can be set to determine how that row's value should be displayed. A custom formatter for numbers with two digits after the decimal mark is included with Eureka (<code>DecimalFormatter</code>). The Example project also contains a <code>CurrencyFormatter</code> which displays a number as currency according to the user's locale.</p> <p dir="auto">By default, setting a row's <code>formatter</code> only affects how a value is displayed when it is not being edited. To also format the value while the row is being edited, set <code>useFormatterDuringInput</code> to <code>true</code> when initializing the row. Formatting the value as it is being edited may require updating the cursor position and Eureka provides the following protocol that your formatter should conform to in order to handle cursor position:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="public protocol FormatterProtocol { func getNewPosition(forPosition forPosition: UITextPosition, inTextInput textInput: UITextInput, oldValue: String?, newValue: String?) -> UITextPosition }"><pre><span class="pl-k">public</span> <span class="pl-k">protocol</span> <span class="pl-smi">FormatterProtocol</span> <span class="pl-kos">{</span> <span class="pl-en">func</span> getNewPosition<span class="pl-kos">(</span>forPosition forPosition<span class="pl-kos">:</span> <span class="pl-smi">UITextPosition</span><span class="pl-kos">,</span> inTextInput textInput<span class="pl-kos">:</span> <span class="pl-smi">UITextInput</span><span class="pl-kos">,</span> oldValue<span class="pl-kos">:</span> <span class="pl-smi">String</span><span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">,</span> newValue<span class="pl-kos">:</span> <span class="pl-smi">String</span><span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">)</span> <span class="pl-c1">-></span> <span class="pl-smi">UITextPosition</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">Additionally, <code>FieldRow</code> subtypes have a <code>useFormatterOnDidBeginEditing</code> property. When using a <code>DecimalRow</code> with a formatter that allows decimal values and conforms to the user's locale (e.g. <code>DecimalFormatter</code>), if <code>useFormatterDuringInput</code> is <code>false</code>, <code>useFormatterOnDidBeginEditing</code> must be set to <code>true</code> so that the decimal mark in the value being edited matches the decimal mark on the keyboard.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Date Rows</h3><a id="user-content-date-rows" class="anchor" aria-label="Permalink: Date Rows" href="#date-rows"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Date Rows hold a Date and allow us to set up a new value through UIDatePicker control. The mode of the UIDatePicker and the way how the date picker view is shown is what changes between them.</p> <markdown-accessiblity-table><table> <tbody><tr> <td> <b>Date Row</b> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowGifs/EurekaDateRow.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowGifs/EurekaDateRow.gif" height="220" width="230" data-animated-image="" style="max-width: 100%;"></a> <br> Picker shown in the keyboard. </td> <td> <b>Date Row (Inline)</b> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowGifs/EurekaDateInlineRow.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowGifs/EurekaDateInlineRow.gif" height="220" width="210" data-animated-image="" style="max-width: 100%;"></a> <br> The row expands. </td> <td> <b>Date Row (Picker)</b> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowGifs/EurekaDatePickerRow.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowGifs/EurekaDatePickerRow.gif" height="220" width="210" data-animated-image="" style="max-width: 100%;"></a> <br> The picker is always visible. </td> </tr> </tbody></table></markdown-accessiblity-table> <p dir="auto">With those 3 styles (Normal, Inline & Picker), Eureka includes:</p> <ul dir="auto"> <li><strong>DateRow</strong></li> <li><strong>TimeRow</strong></li> <li><strong>DateTimeRow</strong></li> <li><strong>CountDownRow</strong></li> </ul> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Option Rows</h3><a id="user-content-option-rows" class="anchor" aria-label="Permalink: Option Rows" href="#option-rows"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">These are rows with a list of options associated from which the user must choose.</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="<<< ActionSheetRow<String>() { $0.title = "ActionSheetRow" $0.selectorTitle = "Pick a number" $0.options = ["One","Two","Three"] $0.value = "Two" // initially selected }"><pre><span class="pl-c1"><<<</span> <span class="pl-smi">ActionSheetRow</span><span class="pl-c1"><</span><span class="pl-smi">String</span><span class="pl-c1">></span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">ActionSheetRow</span><span class="pl-s">"</span> $0<span class="pl-kos">.</span>selectorTitle <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Pick a number</span><span class="pl-s">"</span> $0<span class="pl-kos">.</span>options <span class="pl-c1">=</span> <span class="pl-kos">[</span><span class="pl-s">"</span><span class="pl-s">One</span><span class="pl-s">"</span><span class="pl-kos">,</span><span class="pl-s">"</span><span class="pl-s">Two</span><span class="pl-s">"</span><span class="pl-kos">,</span><span class="pl-s">"</span><span class="pl-s">Three</span><span class="pl-s">"</span><span class="pl-kos">]</span> $0<span class="pl-kos">.</span>value <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Two</span><span class="pl-s">"</span> // initially selected <span class="pl-kos">}</span></pre></div> <markdown-accessiblity-table><table> <tbody><tr> <td width="25%"> <b>Alert Row</b><br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/AlertRow.jpeg"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/AlertRow.jpeg" style="max-width: 100%;"></a> <br> Will show an alert with the options to choose from. </td> <td width="25%"> <b>ActionSheet Row</b><br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/ActionSheetRow.jpeg"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/ActionSheetRow.jpeg" style="max-width: 100%;"></a> <br> Will show an action sheet with the options to choose from. </td> <td width="25%"> <b>Push Row</b><br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/PushRow.jpeg"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/PushRow.jpeg" style="max-width: 100%;"></a> <br> Will push to a new controller from where to choose options listed using Check rows. </td> <td width="25%"> <b>Multiple Selector Row</b><br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/MultipleSelectorRow.jpeg"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/MultipleSelectorRow.jpeg" style="max-width: 100%;"></a> <br> Like PushRow but allows the selection of multiple options. </td> </tr> </tbody></table></markdown-accessiblity-table> <markdown-accessiblity-table><table> <tbody><tr> <td><b>Segmented Row</b><br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/SegmentedRow.png"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/SegmentedRow.png" style="max-width: 100%;"></a> </td> <td><b>Segmented Row (w/Title)</b><br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/SegmentedRowWithTitle.png"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/SegmentedRowWithTitle.png" style="max-width: 100%;"></a> </td> <td><b>Picker Row</b><br> <a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/RowStatics/PickerRow.png"><img src="/xmartlabs/Eureka/raw/master/Example/Media/RowStatics/PickerRow.png" style="max-width: 100%;"></a> <br>Presents options of a generic type through a picker view <br><b>(There is also Picker Inline Row)</b> </td> </tr> </tbody></table></markdown-accessiblity-table> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Built your own custom row?</h3><a id="user-content-built-your-own-custom-row" class="anchor" aria-label="Permalink: Built your own custom row?" href="#built-your-own-custom-row"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Let us know about it, we would be glad to mention it here. :)</p> <ul dir="auto"> <li><strong>LocationRow</strong> (Included as custom row in the example project)</li> </ul> <p dir="auto"><a target="_blank" rel="noopener noreferrer" href="/xmartlabs/Eureka/blob/master/Example/Media/EurekaLocationRow.gif"><img src="/xmartlabs/Eureka/raw/master/Example/Media/EurekaLocationRow.gif" width="300" alt="Screenshot of Location Row" data-animated-image="" style="max-width: 100%;"></a></p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Installation</h2><a id="user-content-installation" class="anchor" aria-label="Permalink: Installation" href="#installation"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">CocoaPods</h4><a id="user-content-cocoapods" class="anchor" aria-label="Permalink: CocoaPods" href="#cocoapods"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><a href="https://cocoapods.org/" rel="nofollow">CocoaPods</a> is a dependency manager for Cocoa projects.</p> <p dir="auto">Specify Eureka into your project's <code>Podfile</code>:</p> <div class="highlight highlight-source-ruby notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="source 'https://github.com/CocoaPods/Specs.git' platform :ios, '9.0' use_frameworks! pod 'Eureka'"><pre><span class="pl-en">source</span> <span class="pl-s">'https://github.com/CocoaPods/Specs.git'</span> <span class="pl-en">platform</span> <span class="pl-pds">:ios</span><span class="pl-kos">,</span> <span class="pl-s">'9.0'</span> <span class="pl-en">use_frameworks!</span> <span class="pl-en">pod</span> <span class="pl-s">'Eureka'</span></pre></div> <p dir="auto">Then run the following command:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="$ pod install"><pre>$ pod install</pre></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Swift Package Manager</h4><a id="user-content-swift-package-manager" class="anchor" aria-label="Permalink: Swift Package Manager" href="#swift-package-manager"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><a href="https://swift.org/package-manager/" rel="nofollow">Swift Package Manager</a> is a tool for managing the distribution of Swift code.</p> <p dir="auto">After you set up your <code>Package.swift</code> manifest file, you can add Eureka as a dependency by adding it to the dependencies value of your <code>Package.swift</code>.</p> <p dir="auto">dependencies: [ .package(url: "<a href="https://github.com/xmartlabs/Eureka.git">https://github.com/xmartlabs/Eureka.git</a>", from: "5.5.0") ]</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Carthage</h4><a id="user-content-carthage" class="anchor" aria-label="Permalink: Carthage" href="#carthage"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><a href="https://github.com/Carthage/Carthage">Carthage</a> is a simple, decentralized dependency manager for Cocoa.</p> <p dir="auto">Specify Eureka into your project's <code>Cartfile</code>:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="github "xmartlabs/Eureka" ~> 5.5"><pre lang="ogdl" class="notranslate"><code>github "xmartlabs/Eureka" ~> 5.5 </code></pre></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Manually as Embedded Framework</h4><a id="user-content-manually-as-embedded-framework" class="anchor" aria-label="Permalink: Manually as Embedded Framework" href="#manually-as-embedded-framework"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>Clone Eureka as a git <a href="http://git-scm.com/docs/git-submodule" rel="nofollow">submodule</a> by running the following command from your project root git folder.</li> </ul> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="$ git submodule add https://github.com/xmartlabs/Eureka.git"><pre>$ git submodule add https://github.com/xmartlabs/Eureka.git</pre></div> <ul dir="auto"> <li> <p dir="auto">Open Eureka folder that was created by the previous git submodule command and drag the Eureka.xcodeproj into the Project Navigator of your application's Xcode project.</p> </li> <li> <p dir="auto">Select the Eureka.xcodeproj in the Project Navigator and verify the deployment target matches with your application deployment target.</p> </li> <li> <p dir="auto">Select your project in the Xcode Navigation and then select your application target from the sidebar. Next select the "General" tab and click on the + button under the "Embedded Binaries" section.</p> </li> <li> <p dir="auto">Select <code>Eureka.framework</code> and we are done!</p> </li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Getting involved</h2><a id="user-content-getting-involved" class="anchor" aria-label="Permalink: Getting involved" href="#getting-involved"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>If you <strong>want to contribute</strong> please feel free to <strong>submit pull requests</strong>.</li> <li>If you <strong>have a feature request</strong> please <strong>open an issue</strong>.</li> <li>If you <strong>found a bug</strong> check older issues before submitting an issue.</li> <li>If you <strong>need help</strong> or would like to <strong>ask general question</strong>, use <a href="http://stackoverflow.com/questions/tagged/eureka-forms" rel="nofollow">StackOverflow</a>. (Tag <code>eureka-forms</code>).</li> </ul> <p dir="auto"><strong>Before contribute check the <a href="/xmartlabs/Eureka/blob/master/CONTRIBUTING.md">CONTRIBUTING</a> file for more info.</strong></p> <p dir="auto">If you use <strong>Eureka</strong> in your app We would love to hear about it! Drop us a line on <a href="https://twitter.com/xmartlabs" rel="nofollow">twitter</a>.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Authors</h2><a id="user-content-authors" class="anchor" aria-label="Permalink: Authors" href="#authors"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><a href="https://github.com/mtnBarreto">Martin Barreto</a> (<a href="https://twitter.com/mtnBarreto" rel="nofollow">@mtnBarreto</a>)</li> <li><a href="https://github.com/mats-claassen">Mathias Claassen</a> (<a href="https://twitter.com/mClaassen26" rel="nofollow">@mClaassen26</a>)</li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">FAQ</h2><a id="user-content-faq" class="anchor" aria-label="Permalink: FAQ" href="#faq"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How to change the text representation of the row value shown in the cell.</h4><a id="user-content-how-to-change-the-text-representation-of-the-row-value-shown-in-the--cell" class="anchor" aria-label="Permalink: How to change the text representation of the row value shown in the cell." href="#how-to-change-the-text-representation-of-the-row-value-shown-in-the--cell"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Every row has the following property:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="/// Block variable used to get the String that should be displayed for the value of this row. public var displayValueFor: ((T?) -> String?)? = { return $0.map { String(describing: $0) } }"><pre>/// Block variable used to get the String that should be displayed for the value of this row. <span class="pl-k">public</span> <span class="pl-k">var</span> <span class="pl-s1">displayValueFor</span><span class="pl-kos">:</span> <span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-smi">T</span><span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">)</span> <span class="pl-c1">-></span> <span class="pl-smi">String</span><span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">)</span><span class="pl-c1"><span class="pl-c1">?</span></span> <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-k">return</span> $0<span class="pl-kos">.</span><span class="pl-en">map</span> <span class="pl-kos">{</span> <span class="pl-en">String</span><span class="pl-kos">(</span>describing<span class="pl-kos">:</span> $0<span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">You can set <code>displayValueFor</code> according the string value you want to display.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How to get a Row using its tag value</h4><a id="user-content-how-to-get-a-row-using-its-tag-value" class="anchor" aria-label="Permalink: How to get a Row using its tag value" href="#how-to-get-a-row-using-its-tag-value"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">We can get a particular row by invoking any of the following functions exposed by the <code>Form</code> class:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="public func rowBy<T: Equatable>(tag: String) -> RowOf<T>? public func rowBy<Row: RowType>(tag: String) -> Row? public func rowBy(tag: String) -> BaseRow?"><pre><span class="pl-k">public</span> <span class="pl-en">func</span> rowBy<span class="pl-c1"><</span>T<span class="pl-kos">:</span> <span class="pl-smi">Equatable</span><span class="pl-c1">></span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> <span class="pl-smi">String</span><span class="pl-kos">)</span> <span class="pl-c1">-></span> <span class="pl-smi">RowOf</span><span class="pl-c1"><</span><span class="pl-smi">T</span><span class="pl-c1">></span><span class="pl-c1"><span class="pl-c1">?</span></span> <span class="pl-k">public</span> <span class="pl-en">func</span> rowBy<span class="pl-c1"><</span>Row<span class="pl-kos">:</span> <span class="pl-smi">RowType</span><span class="pl-c1">></span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> <span class="pl-smi">String</span><span class="pl-kos">)</span> <span class="pl-c1">-></span> <span class="pl-smi">Row</span><span class="pl-c1"><span class="pl-c1">?</span></span> public <span class="pl-en">func</span> rowBy<span class="pl-kos">(</span>tag<span class="pl-kos">:</span> <span class="pl-smi">String</span><span class="pl-kos">)</span> <span class="pl-c1">-></span> <span class="pl-smi">BaseRow</span><span class="pl-c1"><span class="pl-c1">?</span></span></pre></div> <p dir="auto">For instance:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="let dateRow : DateRow? = form.rowBy(tag: "dateRowTag") let labelRow: LabelRow? = form.rowBy(tag: "labelRowTag") let dateRow2: Row<DateCell>? = form.rowBy(tag: "dateRowTag") let labelRow2: BaseRow? = form.rowBy(tag: "labelRowTag")"><pre><span class="pl-k">let</span> <span class="pl-s1">dateRow</span> <span class="pl-kos">:</span> <span class="pl-smi">DateRow</span><span class="pl-c1"><span class="pl-c1">?</span></span> <span class="pl-c1">=</span> form<span class="pl-kos">.</span><span class="pl-en">rowBy</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">dateRowTag</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-k">let</span> <span class="pl-s1">labelRow</span><span class="pl-kos">:</span> <span class="pl-smi">LabelRow</span><span class="pl-c1"><span class="pl-c1">?</span></span> <span class="pl-c1">=</span> form<span class="pl-kos">.</span><span class="pl-en">rowBy</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">labelRowTag</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-k">let</span> <span class="pl-s1">dateRow2</span><span class="pl-kos">:</span> <span class="pl-smi">Row</span><span class="pl-c1"><</span><span class="pl-smi">DateCell</span><span class="pl-c1">></span><span class="pl-c1"><span class="pl-c1">?</span></span> <span class="pl-c1">=</span> form<span class="pl-kos">.</span><span class="pl-en">rowBy</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">dateRowTag</span><span class="pl-s">"</span><span class="pl-kos">)</span> <span class="pl-k">let</span> <span class="pl-s1">labelRow2</span><span class="pl-kos">:</span> <span class="pl-smi">BaseRow</span><span class="pl-c1"><span class="pl-c1">?</span></span> <span class="pl-c1">=</span> form<span class="pl-kos">.</span><span class="pl-en">rowBy</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">labelRowTag</span><span class="pl-s">"</span><span class="pl-kos">)</span></pre></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How to get a Section using its tag value</h4><a id="user-content-how-to-get-a-section-using-its-tag-value" class="anchor" aria-label="Permalink: How to get a Section using its tag value" href="#how-to-get-a-section-using-its-tag-value"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="let section: Section? = form.sectionBy(tag: "sectionTag")"><pre><span class="pl-k">let</span> <span class="pl-s1">section</span><span class="pl-kos">:</span> <span class="pl-smi">Section</span><span class="pl-c1"><span class="pl-c1">?</span></span> <span class="pl-c1">=</span> form<span class="pl-kos">.</span><span class="pl-en">sectionBy</span><span class="pl-kos">(</span>tag<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">sectionTag</span><span class="pl-s">"</span><span class="pl-kos">)</span></pre></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How to set the form values using a dictionary</h4><a id="user-content-how-to-set-the-form-values-using-a-dictionary" class="anchor" aria-label="Permalink: How to set the form values using a dictionary" href="#how-to-set-the-form-values-using-a-dictionary"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Invoking <code>setValues(values: [String: Any?])</code> which is exposed by <code>Form</code> class.</p> <p dir="auto">For example:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="form.setValues(["IntRowTag": 8, "TextRowTag": "Hello world!", "PushRowTag": Company(name:"Xmartlabs")])"><pre>form<span class="pl-kos">.</span><span class="pl-en">setValues</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-s">"</span><span class="pl-s">IntRowTag</span><span class="pl-s">"</span><span class="pl-kos">:</span> <span class="pl-c1">8</span><span class="pl-kos">,</span> <span class="pl-s">"</span><span class="pl-s">TextRowTag</span><span class="pl-s">"</span><span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">Hello world!</span><span class="pl-s">"</span><span class="pl-kos">,</span> <span class="pl-s">"</span><span class="pl-s">PushRowTag</span><span class="pl-s">"</span><span class="pl-kos">:</span> <span class="pl-en">Company</span><span class="pl-kos">(</span>name<span class="pl-kos">:</span><span class="pl-s">"</span><span class="pl-s">Xmartlabs</span><span class="pl-s">"</span><span class="pl-kos">)</span><span class="pl-kos">]</span><span class="pl-kos">)</span></pre></div> <p dir="auto">Where <code>"IntRowTag"</code>, <code>"TextRowTag"</code>, <code>"PushRowTag"</code> are row tags (each one uniquely identifies a row) and <code>8</code>, <code>"Hello world!"</code>, <code>Company(name:"Xmartlabs")</code> are the corresponding row value to assign.</p> <p dir="auto">The value type of a row must match with the value type of the corresponding dictionary value otherwise nil will be assigned.</p> <p dir="auto">If the form was already displayed we have to reload the visible rows either by reloading the table view <code>tableView.reloadData()</code> or invoking <code>updateCell()</code> to each visible row.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Row does not update after changing hidden or disabled condition</h4><a id="user-content-row-does-not-update-after-changing-hidden-or-disabled-condition" class="anchor" aria-label="Permalink: Row does not update after changing hidden or disabled condition" href="#row-does-not-update-after-changing-hidden-or-disabled-condition"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">After setting a condition, this condition is not automatically evaluated. If you want it to do so immediately you can call <code>.evaluateHidden()</code> or <code>.evaluateDisabled()</code>.</p> <p dir="auto">This functions are just called when a row is added to the form and when a row it depends on changes. If the condition is changed when the row is being displayed then it must be reevaluated manually.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">onCellUnHighlight doesn't get called unless onCellHighlight is also defined</h4><a id="user-content-oncellunhighlight-doesnt-get-called-unless-oncellhighlight-is-also-defined" class="anchor" aria-label="Permalink: onCellUnHighlight doesn't get called unless onCellHighlight is also defined" href="#oncellunhighlight-doesnt-get-called-unless-oncellhighlight-is-also-defined"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Look at this <a href="https://github.com/xmartlabs/Eureka/issues/96" data-hovercard-type="issue" data-hovercard-url="/xmartlabs/Eureka/issues/96/hovercard">issue</a>.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How to update a Section header/footer</h4><a id="user-content-how-to-update-a-section-headerfooter" class="anchor" aria-label="Permalink: How to update a Section header/footer" href="#how-to-update-a-section-headerfooter"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>Set up a new header/footer data ....</li> </ul> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="section.header = HeaderFooterView(title: "Header title \(variable)") // use String interpolation //or var header = HeaderFooterView<UIView>(.class) // most flexible way to set up a header using any view type header.height = { 60 } // height can be calculated header.onSetupView = { view, section in // each time the view is about to be displayed onSetupView is invoked. view.backgroundColor = .orange } section.header = header"><pre>section<span class="pl-kos">.</span>header <span class="pl-c1">=</span> <span class="pl-en">HeaderFooterView</span><span class="pl-kos">(</span>title<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">Header title </span><span class="pl-kos">\(</span>variable<span class="pl-kos">)</span><span class="pl-s">"</span><span class="pl-kos">)</span> // use String interpolation //or <span class="pl-k">var</span> <span class="pl-s1">header</span> <span class="pl-c1">=</span> <span class="pl-smi">HeaderFooterView</span><span class="pl-c1"><</span><span class="pl-smi">UIView</span><span class="pl-c1">></span><span class="pl-kos">(</span><span class="pl-kos">.</span>class<span class="pl-kos">)</span> // most flexible way to set up a header using any view type header<span class="pl-kos">.</span>height <span class="pl-c1">=</span> <span class="pl-kos">{</span> <span class="pl-c1">60</span> <span class="pl-kos">}</span> // height can be calculated header<span class="pl-kos">.</span>onSetupView <span class="pl-c1">=</span> <span class="pl-kos">{</span> view<span class="pl-kos">,</span> section <span class="pl-k">in</span> // each time the view is about to be displayed onSetupView is invoked. view<span class="pl-kos">.</span>backgroundColor <span class="pl-c1">=</span> <span class="pl-kos">.</span>orange <span class="pl-kos">}</span> section<span class="pl-kos">.</span>header <span class="pl-c1">=</span> header</pre></div> <ul dir="auto"> <li>Reload the Section to perform the changes</li> </ul> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="section.reload()"><pre>section<span class="pl-kos">.</span><span class="pl-en">reload</span><span class="pl-kos">(</span><span class="pl-kos">)</span></pre></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How to customize Selector and MultipleSelector option cells</h4><a id="user-content-how-to-customize-selector-and-multipleselector-option-cells" class="anchor" aria-label="Permalink: How to customize Selector and MultipleSelector option cells" href="#how-to-customize-selector-and-multipleselector-option-cells"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><code>selectableRowSetup</code>, <code>selectableRowCellUpdate</code> and <code>selectableRowCellSetup</code> properties are provided to be able to customize SelectorViewController and MultipleSelectorViewController selectable cells.</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="let row = PushRow<Emoji>() { $0.title = "PushRow" $0.options = [💁🏻, 🍐, 👦🏼, 🐗, 🐼, 🐻] $0.value = 👦🏼 $0.selectorTitle = "Choose an Emoji!" }.onPresent { from, to in to.dismissOnSelection = false to.dismissOnChange = false to.selectableRowSetup = { row in row.cellProvider = CellProvider<ListCheckCell<Emoji>>(nibName: "EmojiCell", bundle: Bundle.main) } to.selectableRowCellUpdate = { cell, row in cell.textLabel?.text = "Text " + row.selectableValue! // customization cell.detailTextLabel?.text = "Detail " + row.selectableValue! } } "><pre><span class="pl-k">let</span> <span class="pl-s1">row</span> <span class="pl-c1">=</span> <span class="pl-smi">PushRow</span><span class="pl-c1"><</span><span class="pl-smi">Emoji</span><span class="pl-c1">></span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> $0<span class="pl-kos">.</span>title <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">PushRow</span><span class="pl-s">"</span> $0<span class="pl-kos">.</span>options <span class="pl-c1">=</span> <span class="pl-kos">[</span>💁🏻<span class="pl-kos">,</span> 🍐<span class="pl-kos">,</span> 👦🏼<span class="pl-kos">,</span> 🐗<span class="pl-kos">,</span> 🐼<span class="pl-kos">,</span> 🐻<span class="pl-kos">]</span> $0<span class="pl-kos">.</span>value <span class="pl-c1">=</span> 👦🏼 $0<span class="pl-kos">.</span>selectorTitle <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Choose an Emoji!</span><span class="pl-s">"</span> <span class="pl-kos">}</span><span class="pl-kos">.</span><span class="pl-en">onPresent</span> <span class="pl-kos">{</span> from<span class="pl-kos">,</span> to <span class="pl-k">in</span> to<span class="pl-kos">.</span>dismissOnSelection <span class="pl-c1">=</span> <span class="pl-c1">false</span> to<span class="pl-kos">.</span>dismissOnChange <span class="pl-c1">=</span> <span class="pl-c1">false</span> to<span class="pl-kos">.</span>selectableRowSetup <span class="pl-c1">=</span> <span class="pl-kos">{</span> row <span class="pl-k">in</span> row<span class="pl-kos">.</span>cellProvider <span class="pl-c1">=</span> <span class="pl-smi">CellProvider</span><span class="pl-c1"><</span><span class="pl-smi">ListCheckCell</span><span class="pl-c1"><</span><span class="pl-smi">Emoji</span><span class="pl-c1">></span><span class="pl-c1">></span><span class="pl-kos">(</span>nibName<span class="pl-kos">:</span> <span class="pl-s">"</span><span class="pl-s">EmojiCell</span><span class="pl-s">"</span><span class="pl-kos">,</span> bundle<span class="pl-kos">:</span> <span class="pl-smi">Bundle</span><span class="pl-kos">.</span>main<span class="pl-kos">)</span> <span class="pl-kos">}</span> to<span class="pl-kos">.</span>selectableRowCellUpdate <span class="pl-c1">=</span> <span class="pl-kos">{</span> cell<span class="pl-kos">,</span> row <span class="pl-k">in</span> cell<span class="pl-kos">.</span>textLabel<span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">.</span>text <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Text </span><span class="pl-s">"</span> <span class="pl-c1">+</span> row<span class="pl-kos">.</span>selectableValue! // customization cell<span class="pl-kos">.</span>detailTextLabel<span class="pl-c1"><span class="pl-c1">?</span></span><span class="pl-kos">.</span>text <span class="pl-c1">=</span> <span class="pl-s">"</span><span class="pl-s">Detail </span><span class="pl-s">"</span> <span class="pl-c1">+</span> row<span class="pl-kos">.</span>selectableValue! <span class="pl-kos">}</span> <span class="pl-kos">}</span></pre></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Don't want to use Eureka custom operators?</h4><a id="user-content-dont-want-to-use-eureka-custom-operators" class="anchor" aria-label="Permalink: Don't want to use Eureka custom operators?" href="#dont-want-to-use-eureka-custom-operators"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">As we've said <code>Form</code> and <code>Section</code> types conform to <code>MutableCollection</code> and <code>RangeReplaceableCollection</code>. A Form is a collection of Sections and a Section is a collection of Rows.</p> <p dir="auto"><code>RangeReplaceableCollection</code> protocol extension provides many useful methods to modify collection.</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="extension RangeReplaceableCollection { public mutating func append(_ newElement: Self.Element) public mutating func append<S>(contentsOf newElements: S) where S : Sequence, Self.Element == S.Element public mutating func insert(_ newElement: Self.Element, at i: Self.Index) public mutating func insert<S>(contentsOf newElements: S, at i: Self.Index) where S : Collection, Self.Element == S.Element public mutating func remove(at i: Self.Index) -> Self.Element public mutating func removeSubrange(_ bounds: Range<Self.Index>) public mutating func removeFirst(_ n: Int) public mutating func removeFirst() -> Self.Element public mutating func removeAll(keepingCapacity keepCapacity: Bool) public mutating func reserveCapacity(_ n: Self.IndexDistance) }"><pre><span class="pl-k">extension</span> <span class="pl-smi">RangeReplaceableCollection</span> <span class="pl-kos">{</span> <span class="pl-k">public</span> <span class="pl-k">mutating</span> <span class="pl-en">func</span> append<span class="pl-kos">(</span>_ newElement<span class="pl-kos">:</span> <span class="pl-smi">Self</span><span class="pl-kos">.</span><span class="pl-smi">Element</span><span class="pl-kos">)</span> <span class="pl-k">public</span> <span class="pl-k">mutating</span> <span class="pl-en">func</span> append<span class="pl-c1"><</span>S<span class="pl-c1">></span><span class="pl-kos">(</span>contentsOf newElements<span class="pl-kos">:</span> <span class="pl-smi">S</span><span class="pl-kos">)</span> <span class="pl-k">where</span> S <span class="pl-kos">:</span> <span class="pl-smi">Sequence</span><span class="pl-kos">,</span> Self<span class="pl-kos">.</span>Element <span class="pl-c1">==</span> <span class="pl-smi">S</span><span class="pl-kos">.</span><span class="pl-smi">Element</span> public <span class="pl-k">mutating</span> <span class="pl-en">func</span> insert<span class="pl-kos">(</span>_ newElement<span class="pl-kos">:</span> Self<span class="pl-kos">.</span><span class="pl-smi">Element</span><span class="pl-kos">,</span> at i<span class="pl-kos">:</span> <span class="pl-smi">Self</span><span class="pl-kos">.</span><span class="pl-smi">Index</span><span class="pl-kos">)</span> <span class="pl-k">public</span> <span class="pl-k">mutating</span> <span class="pl-en">func</span> insert<span class="pl-c1"><</span>S<span class="pl-c1">></span><span class="pl-kos">(</span>contentsOf newElements<span class="pl-kos">:</span> <span class="pl-smi">S</span><span class="pl-kos">,</span> at i<span class="pl-kos">:</span> <span class="pl-smi">Self</span><span class="pl-kos">.</span><span class="pl-smi">Index</span><span class="pl-kos">)</span> <span class="pl-k">where</span> S <span class="pl-kos">:</span> <span class="pl-smi">Collection</span><span class="pl-kos">,</span> Self<span class="pl-kos">.</span>Element <span class="pl-c1">==</span> <span class="pl-smi">S</span><span class="pl-kos">.</span><span class="pl-smi">Element</span> public <span class="pl-k">mutating</span> <span class="pl-en">func</span> remove<span class="pl-kos">(</span>at i<span class="pl-kos">:</span> Self<span class="pl-kos">.</span><span class="pl-smi">Index</span><span class="pl-kos">)</span> <span class="pl-c1">-></span> Self<span class="pl-kos">.</span>Element <span class="pl-k">public</span> <span class="pl-k">mutating</span> <span class="pl-en">func</span> removeSubrange<span class="pl-kos">(</span>_ bounds<span class="pl-kos">:</span> <span class="pl-smi">Range</span><span class="pl-c1"><</span><span class="pl-smi">Self</span><span class="pl-kos">.</span><span class="pl-smi">Index</span><span class="pl-c1">></span><span class="pl-kos">)</span> <span class="pl-k">public</span> <span class="pl-k">mutating</span> <span class="pl-en">func</span> removeFirst<span class="pl-kos">(</span>_ n<span class="pl-kos">:</span> <span class="pl-smi">Int</span><span class="pl-kos">)</span> <span class="pl-k">public</span> <span class="pl-k">mutating</span> <span class="pl-en">func</span> removeFirst<span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">-></span> <span class="pl-smi">Self</span><span class="pl-kos">.</span><span class="pl-smi">Element</span> <span class="pl-k">public</span> <span class="pl-k">mutating</span> <span class="pl-en">func</span> removeAll<span class="pl-kos">(</span>keepingCapacity keepCapacity<span class="pl-kos">:</span> <span class="pl-smi">Bool</span><span class="pl-kos">)</span> <span class="pl-k">public</span> <span class="pl-k">mutating</span> <span class="pl-en">func</span> reserveCapacity<span class="pl-kos">(</span>_ n<span class="pl-kos">:</span> <span class="pl-smi">Self</span><span class="pl-kos">.</span><span class="pl-smi">IndexDistance</span><span class="pl-kos">)</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">These methods are used internally to implement the custom operators as shown bellow:</p> <div class="highlight highlight-source-swift notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="public func +++(left: Form, right: Section) -> Form { left.append(right) return left } public func +=<C : Collection>(inout lhs: Form, rhs: C) where C.Element == Section { lhs.append(contentsOf: rhs) } public func <<<(left: Section, right: BaseRow) -> Section { left.append(right) return left } public func +=<C : Collection>(inout lhs: Section, rhs: C) where C.Element == BaseRow { lhs.append(contentsOf: rhs) }"><pre><span class="pl-k">public</span> <span class="pl-en">func</span> <span class="pl-c1">+++</span><span class="pl-kos">(</span>left<span class="pl-kos">:</span> <span class="pl-smi">Form</span><span class="pl-kos">,</span> right<span class="pl-kos">:</span> <span class="pl-smi">Section</span><span class="pl-kos">)</span> <span class="pl-c1">-></span> <span class="pl-smi">Form</span> <span class="pl-kos">{</span> left<span class="pl-kos">.</span><span class="pl-en">append</span><span class="pl-kos">(</span>right<span class="pl-kos">)</span> <span class="pl-k">return</span> left <span class="pl-kos">}</span> <span class="pl-k">public</span> <span class="pl-en">func</span> <span class="pl-c1">+=</span><span class="pl-c1"><</span>C <span class="pl-kos">:</span> <span class="pl-smi">Collection</span><span class="pl-c1">></span><span class="pl-kos">(</span>inout lhs<span class="pl-kos">:</span> <span class="pl-smi">Form</span><span class="pl-kos">,</span> rhs<span class="pl-kos">:</span> <span class="pl-smi">C</span><span class="pl-kos">)</span> <span class="pl-k">where</span> C<span class="pl-kos">.</span>Element <span class="pl-c1">==</span> <span class="pl-smi">Section</span> <span class="pl-kos">{</span> lhs<span class="pl-kos">.</span><span class="pl-en">append</span><span class="pl-kos">(</span>contentsOf<span class="pl-kos">:</span> rhs<span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-k">public</span> <span class="pl-en">func</span> <span class="pl-c1"><<</span><span class="pl-c1"><</span><span class="pl-kos">(</span>left<span class="pl-kos">:</span> <span class="pl-smi">Section</span><span class="pl-kos">,</span> right<span class="pl-kos">:</span> <span class="pl-smi">BaseRow</span><span class="pl-kos">)</span> <span class="pl-c1">-></span> <span class="pl-smi">Section</span> <span class="pl-kos">{</span> left<span class="pl-kos">.</span><span class="pl-en">append</span><span class="pl-kos">(</span>right<span class="pl-kos">)</span> <span class="pl-k">return</span> left <span class="pl-kos">}</span> <span class="pl-k">public</span> <span class="pl-en">func</span> <span class="pl-c1">+=</span><span class="pl-c1"><</span>C <span class="pl-kos">:</span> <span class="pl-smi">Collection</span><span class="pl-c1">></span><span class="pl-kos">(</span>inout lhs<span class="pl-kos">:</span> <span class="pl-smi">Section</span><span class="pl-kos">,</span> rhs<span class="pl-kos">:</span> <span class="pl-smi">C</span><span class="pl-kos">)</span> <span class="pl-k">where</span> C<span class="pl-kos">.</span>Element <span class="pl-c1">==</span> <span class="pl-smi">BaseRow</span> <span class="pl-kos">{</span> lhs<span class="pl-kos">.</span><span class="pl-en">append</span><span class="pl-kos">(</span>contentsOf<span class="pl-kos">:</span> rhs<span class="pl-kos">)</span> <span class="pl-kos">}</span></pre></div> <p dir="auto">You can see how the rest of custom operators are implemented <a href="https://github.com/xmartlabs/Eureka/blob/master/Source/Core/Operators.swift">here</a>.</p> <p dir="auto">It's up to you to decide if you want to use Eureka custom operators or not.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">How to set up your form from a storyboard</h4><a id="user-content-how-to-set-up-your-form-from-a-storyboard" class="anchor" aria-label="Permalink: How to set up your form from a storyboard" href="#how-to-set-up-your-form-from-a-storyboard"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The form is always displayed in a <code>UITableView</code>. You can set up your view controller in a storyboard and add a UITableView where you want it to be and then connect the outlet to FormViewController's <code>tableView</code> variable. This allows you to define a custom frame (possibly with constraints) for your form.</p> <p dir="auto">All of this can also be done by programmatically changing frame, margins, etc. of the <code>tableView</code> of your FormViewController.</p> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Donate to Eureka</h1><a id="user-content-donate-to-eureka" class="anchor" aria-label="Permalink: Donate to Eureka" href="#donate-to-eureka"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">So we can make Eureka even better!<br><br> <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=HRMAH7WZ4QQ8E" rel="nofollow"><img src="/xmartlabs/Eureka/raw/master/donate.png" style="max-width: 100%;"></a></p> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Change Log</h1><a id="user-content-change-log" class="anchor" aria-label="Permalink: Change Log" href="#change-log"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">This can be found in the <a href="/xmartlabs/Eureka/blob/master/CHANGELOG.md">CHANGELOG.md</a> file.</p> </article></div></div></div></div></div> <!-- --> <!-- --> <script type="application/json" id="__PRIMER_DATA_:R0:__">{"resolvedServerColorMode":"day"}</script></div> </react-partial> <input type="hidden" data-csrf="true" value="TfMkcz2tyeoMpPT8H+SAgdn/LQQJaFM2jb1I9Mk+qfLMhwTlAkmFuNFLk/vP4K9I3q2MCA4MYpfYRwNrEpzNrg==" /> </div> <div data-view-component="true" class="Layout-sidebar"> <div class="BorderGrid about-margin" data-pjax> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <div class="hide-sm hide-md"> <h2 class="mb-3 h4">About</h2> <p class="f4 my-3"> Elegant iOS form builder in Swift </p> <div class="my-3 d-flex flex-items-center"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link flex-shrink-0 mr-2"> <path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path> </svg> <span class="flex-auto min-width-0 css-truncate css-truncate-target width-fit"> <a title="https://eurekacommunity.github.io" role="link" target="_blank" rel="noopener noreferrer nofollow" class="text-bold" href="https://eurekacommunity.github.io">eurekacommunity.github.io</a> </span> </div> <h3 class="sr-only">Topics</h3> <div class="my-3"> <div class="f6"> <a href="/topics/swift" title="Topic: swift" data-view-component="true" class="topic-tag topic-tag-link"> swift </a> <a href="/topics/swift-library" title="Topic: swift-library" data-view-component="true" class="topic-tag topic-tag-link"> swift-library </a> <a href="/topics/ios" title="Topic: ios" data-view-component="true" class="topic-tag topic-tag-link"> ios </a> <a href="/topics/uitableview" title="Topic: uitableview" data-view-component="true" class="topic-tag topic-tag-link"> uitableview </a> <a href="/topics/forms" title="Topic: forms" data-view-component="true" class="topic-tag topic-tag-link"> forms </a> <a href="/topics/cocoapods" title="Topic: cocoapods" data-view-component="true" class="topic-tag topic-tag-link"> cocoapods </a> <a href="/topics/carthage" title="Topic: carthage" data-view-component="true" class="topic-tag topic-tag-link"> carthage </a> <a href="/topics/validations" title="Topic: validations" data-view-component="true" class="topic-tag topic-tag-link"> validations </a> <a href="/topics/ios-ui" title="Topic: ios-ui" data-view-component="true" class="topic-tag topic-tag-link"> ios-ui </a> <a href="/topics/ios-forms" title="Topic: ios-forms" data-view-component="true" class="topic-tag topic-tag-link"> ios-forms </a> <a href="/topics/hacktoberfest" title="Topic: hacktoberfest" data-view-component="true" class="topic-tag topic-tag-link"> hacktoberfest </a> </div> </div> <h3 class="sr-only">Resources</h3> <div class="mt-2"> <a class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:readme"}" href="#readme-ov-file"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book mr-2"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> Readme </a> </div> <h3 class="sr-only">License</h3> <div class="mt-2"> <a href="#MIT-1-ov-file" class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:license"}" > <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-law mr-2"> <path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path> </svg> MIT license </a> </div> <include-fragment src="/xmartlabs/Eureka/hovercards/citation/sidebar_partial?tree_name=master"> </include-fragment> <div class="mt-2"> <a href="/xmartlabs/Eureka/activity" data-view-component="true" class="Link Link--muted"><svg text="gray" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pulse mr-2"> <path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"></path> </svg> <span class="color-fg-muted">Activity</span></a> </div> <div class="mt-2"> <a href="/xmartlabs/Eureka/custom-properties" data-view-component="true" class="Link Link--muted"><svg text="gray" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-note mr-2"> <path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25Zm1.75-.25a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25ZM3.5 6.25a.75.75 0 0 1 .75-.75h7a.75.75 0 0 1 0 1.5h-7a.75.75 0 0 1-.75-.75Zm.75 2.25h4a.75.75 0 0 1 0 1.5h-4a.75.75 0 0 1 0-1.5Z"></path> </svg> <span class="color-fg-muted">Custom properties</span></a> </div> <h3 class="sr-only">Stars</h3> <div class="mt-2"> <a href="/xmartlabs/Eureka/stargazers" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg> <strong>11.8k</strong> stars</a> </div> <h3 class="sr-only">Watchers</h3> <div class="mt-2"> <a href="/xmartlabs/Eureka/watchers" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-eye mr-2"> <path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14c-1.981 0-3.671-.992-4.933-2.078C1.797 10.83.88 9.576.43 8.898a1.62 1.62 0 0 1 0-1.798c.45-.677 1.367-1.931 2.637-3.022C4.33 2.992 6.019 2 8 2ZM1.679 7.932a.12.12 0 0 0 0 .136c.411.622 1.241 1.75 2.366 2.717C5.176 11.758 6.527 12.5 8 12.5c1.473 0 2.825-.742 3.955-1.715 1.124-.967 1.954-2.096 2.366-2.717a.12.12 0 0 0 0-.136c-.412-.621-1.242-1.75-2.366-2.717C10.824 4.242 9.473 3.5 8 3.5c-1.473 0-2.825.742-3.955 1.715-1.124.967-1.954 2.096-2.366 2.717ZM8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10Z"></path> </svg> <strong>257</strong> watching</a> </div> <h3 class="sr-only">Forks</h3> <div class="mt-2"> <a href="/xmartlabs/Eureka/forks" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg> <strong>1.3k</strong> forks</a> </div> <div class="mt-2"> <a class="Link--muted" href="/contact/report-content?content_url=https%3A%2F%2Fgithub.com%2Fxmartlabs%2FEureka&report=xmartlabs+%28user%29"> Report repository </a> </div> </div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame"> <a href="/xmartlabs/Eureka/releases" data-view-component="true" class="Link--primary no-underline Link">Releases <span title="35" data-view-component="true" class="Counter">35</span></a></h2> <a class="Link--primary d-flex no-underline" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/xmartlabs/Eureka/releases/tag/5.5.0"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-tag flex-shrink-0 mt-1 color-fg-success"> <path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path> </svg> <div class="ml-2 min-width-0"> <div class="d-flex"> <span class="css-truncate css-truncate-target text-bold mr-2" style="max-width: none;">5.5.0</span> <span title="Label: Latest" data-view-component="true" class="Label Label--success flex-shrink-0"> Latest </span> </div> <div class="text-small color-fg-muted"><relative-time datetime="2024-05-23T21:59:52Z" class="no-wrap">May 23, 2024</relative-time></div> </div> </a> <div data-view-component="true" class="mt-3"> <a text="small" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/xmartlabs/Eureka/releases" data-view-component="true" class="Link">+ 34 releases</a></div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3">Sponsor this project</h2> <include-fragment src="/xmartlabs/Eureka/sponsors_list?block_button=true&current_repository=Eureka" aria-busy="true" aria-label="Loading sponsorable links"> <div class="d-flex mb-3"> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> <div class="Skeleton Skeleton--text flex-1 flex-self-center f4"> </div> </div> <button type="button" disabled="disabled" data-view-component="true" class="btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-heart icon-sponsor mr-1 color-fg-sponsors"> <path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path> </svg> Sponsor </button></include-fragment> <div class="text-small mt-3"> <a href="/sponsors">Learn more about GitHub Sponsors</a> </div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3"> <a href="/orgs/xmartlabs/packages?repo_name=Eureka" data-view-component="true" class="Link--primary no-underline Link d-flex flex-items-center">Packages <span title="0" hidden="hidden" data-view-component="true" class="Counter ml-1">0</span></a></h2> <div class="text-small color-fg-muted" > No packages published <br> </div> </div> </div> <div class="BorderGrid-row" hidden> <div class="BorderGrid-cell"> <include-fragment src="/xmartlabs/Eureka/used_by_list" accept="text/fragment+html"> </include-fragment> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3"> <a href="/xmartlabs/Eureka/graphs/contributors" data-view-component="true" class="Link--primary no-underline Link d-flex flex-items-center">Contributors <span title="152" data-view-component="true" class="Counter ml-1">152</span></a></h2> <ul class="list-style-none d-flex flex-wrap mb-n2"> <li class="mb-2 mr-2" > <a href="https://github.com/mats-claassen" class="" data-hovercard-type="user" data-hovercard-url="/users/mats-claassen/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/8573865?s=64&v=4" alt="@mats-claassen" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/RomanPodymov" class="" data-hovercard-type="user" data-hovercard-url="/users/RomanPodymov/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/10789692?s=64&v=4" alt="@RomanPodymov" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/SpencerC" class="" data-hovercard-type="user" data-hovercard-url="/users/SpencerC/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/817672?s=64&v=4" alt="@SpencerC" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/marbetschar" class="" data-hovercard-type="user" data-hovercard-url="/users/marbetschar/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/392542?s=64&v=4" alt="@marbetschar" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/m-revetria" class="" data-hovercard-type="user" data-hovercard-url="/users/m-revetria/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/4791678?s=64&v=4" alt="@m-revetria" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/ilyapuchka" class="" data-hovercard-type="user" data-hovercard-url="/users/ilyapuchka/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/1488293?s=64&v=4" alt="@ilyapuchka" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/charlymr" class="" data-hovercard-type="user" data-hovercard-url="/users/charlymr/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/356901?s=64&v=4" alt="@charlymr" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/mlorenze" class="" data-hovercard-type="user" data-hovercard-url="/users/mlorenze/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/27253361?s=64&v=4" alt="@mlorenze" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/anlaital" class="" data-hovercard-type="user" data-hovercard-url="/users/anlaital/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/2168023?s=64&v=4" alt="@anlaital" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/dernster" class="" data-hovercard-type="user" data-hovercard-url="/users/dernster/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/5302420?s=64&v=4" alt="@dernster" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/akabab" class="" data-hovercard-type="user" data-hovercard-url="/users/akabab/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/6205705?s=64&v=4" alt="@akabab" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/yannickl" class="" data-hovercard-type="user" data-hovercard-url="/users/yannickl/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/798235?s=64&v=4" alt="@yannickl" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/HiromichiYamada" class="" data-hovercard-type="user" data-hovercard-url="/users/HiromichiYamada/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/1617545?s=64&v=4" alt="@HiromichiYamada" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/AndrewBennet" class="" data-hovercard-type="user" data-hovercard-url="/users/AndrewBennet/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/2078225?s=64&v=4" alt="@AndrewBennet" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> </ul> <div data-view-component="true" class="mt-3"> <a text="small" href="/xmartlabs/Eureka/graphs/contributors" data-view-component="true" class="Link--inTextBlock Link">+ 138 contributors</a></div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3">Languages</h2> <div class="mb-2"> <span data-view-component="true" class="Progress"> <span style="background-color:#F05138 !important;;width: 99.7%;" itemprop="keywords" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#ededed !important;;width: 0.3%;" itemprop="keywords" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> </span></div> <ul class="list-style-none"> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/xmartlabs/Eureka/search?l=swift" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#F05138;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">Swift</span> <span>99.7%</span> </a> </li> <li class="d-inline"> <span class="d-inline-flex flex-items-center flex-nowrap text-small mr-3"> <svg style="color:#ededed;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">Other</span> <span>0.3%</span> </span> </li> </ul> </div> </div> </div> </div> </div></div> </div> </div> </turbo-frame> </main> </div> </div> <footer class="footer pt-8 pb-6 f6 color-fg-muted p-responsive" role="contentinfo" > <h2 class='sr-only'>Footer</h2> <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap"> <div class="d-flex flex-items-center flex-shrink-0 mx-2"> <a aria-label="Homepage" title="GitHub" class="footer-octicon mr-2" href="https://github.com"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12 1C5.9225 1 1 5.9225 1 12C1 16.8675 4.14875 20.9787 8.52125 22.4362C9.07125 22.5325 9.2775 22.2025 9.2775 21.9137C9.2775 21.6525 9.26375 20.7862 9.26375 19.865C6.5 20.3737 5.785 19.1912 5.565 18.5725C5.44125 18.2562 4.905 17.28 4.4375 17.0187C4.0525 16.8125 3.5025 16.3037 4.42375 16.29C5.29 16.2762 5.90875 17.0875 6.115 17.4175C7.105 19.0812 8.68625 18.6137 9.31875 18.325C9.415 17.61 9.70375 17.1287 10.02 16.8537C7.5725 16.5787 5.015 15.63 5.015 11.4225C5.015 10.2262 5.44125 9.23625 6.1425 8.46625C6.0325 8.19125 5.6475 7.06375 6.2525 5.55125C6.2525 5.55125 7.17375 5.2625 9.2775 6.67875C10.1575 6.43125 11.0925 6.3075 12.0275 6.3075C12.9625 6.3075 13.8975 6.43125 14.7775 6.67875C16.8813 5.24875 17.8025 5.55125 17.8025 5.55125C18.4075 7.06375 18.0225 8.19125 17.9125 8.46625C18.6138 9.23625 19.04 10.2125 19.04 11.4225C19.04 15.6437 16.4688 16.5787 14.0213 16.8537C14.42 17.1975 14.7638 17.8575 14.7638 18.8887C14.7638 20.36 14.75 21.5425 14.75 21.9137C14.75 22.2025 14.9563 22.5462 15.5063 22.4362C19.8513 20.9787 23 16.8537 23 12C23 5.9225 18.0775 1 12 1Z"></path> </svg> </a> <span> © 2025 GitHub, Inc. </span> </div> <nav aria-label="Footer"> <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3> <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading"> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to Terms","label":"text:terms"}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to privacy","label":"text:privacy"}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to security","label":"text:security"}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to status","label":"text:status"}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to docs","label":"text:docs"}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to contact","label":"text:contact"}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a> </li> <li class="mx-2" > <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{"location":"footer","action":"cookies","context":"subfooter","tag":"link","label":"cookies_link_subfooter_footer"}" > Manage cookies </button> </cookie-consent-link> </li> <li class="mx-2"> <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{"location":"footer","action":"dont_share_info","context":"subfooter","tag":"link","label":"dont_share_info_link_subfooter_footer"}" > Do not share my personal information </button> </cookie-consent-link> </li> </ul> </nav> </div> </footer> <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999" data-initial-cookie-consent-allowed="" data-cookie-consent-required="false"></ghcc-consent> <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> You can’t perform that action at this time. </div> <template id="site-details-dialog"> <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open> <summary role="button" aria-label="Close dialog"></summary> <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal"> <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div class="octocat-spinner my-6 js-details-dialog-spinner"></div> </details-dialog> </details> </template> <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;"> <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;"> </div> </div> <template id="snippet-clipboard-copy-button"> <div class="zeroclipboard-container position-absolute right-0 top-0"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> <template id="snippet-clipboard-copy-button-unpositioned"> <div class="zeroclipboard-container"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> </div> <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div> <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div> </body> </html>