菜鸟教程小白 发表于 2022-12-13 02:24:27

c# - F#:从 ViewController 中的 Storyboard访问 UI 元素?


                                            <p><p>这里是 F# 的新手,并尝试在纯 F# 中构建 Xamarin.iOS 应用程序。在 C# 中,当我在 Storyboard 编辑器中放置 UI 元素并为其命名,并且在 Storyboard 中引用 Controller 时,我可以访问该 Controller 中的 UI 元素。
即我在 Storyboard 中创建了一个名为 MyButton 的按钮。现在在 Controller 中我想添加一个 Action ,比如说创建一个警报,我可能会在 C# 中编写</p>

<pre><code>MyButton.TouchUpInside += (object sender, EventArgs e) =&gt;
{
...
}
</code></pre>

<p>我正在尝试在 F# 中执行相同的操作,但它无法识别 Controller 中的“MyButton”。有什么帮助吗?</p>

<p>更新:我做了一些研究,和往常一样,大部分来源都是几年前的。 C# 能够从设计器引用对象的方式是通过项目模板生成关联的 YourController.designer.cs 文件,这些文件引用来自设计器的对象。这是一个部分类。根据这篇有趣的博文:</p>

<p> <a href="http://7sharpnine.com/2013/02/03/2013-02-03-monotouch-and-fsharp-part-i/" rel="noreferrer noopener nofollow">http://7sharpnine.com/2013/02/03/2013-02-03-monotouch-and-fsharp-part-i/</a> </p>

<p>,此功能在 F# 中不可用,因为“F# 中缺少部分类使得 UI 设计人员可以使用该工具很难紧密集成到 F#”,但他声称他会在该博客文章中工作是从 4.​​5 年前开始的,所以我希望有人解决了这个问题...请指教</p>

<p>更新 2:同一个博客在 4 年后再次出现并再次解决了这个问题
<a href="http://7sharpnine.com/2017/04/11/i-want-to-tell-you-a-storyboard/" rel="noreferrer noopener nofollow">http://7sharpnine.com/2017/04/11/i-want-to-tell-you-a-storyboard/</a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>假设您在 ViewController 上定义了一个名为“fsharpButton”的 UIButton,您定义了一个 <code>Outlet</code>,它获取 VC 对象引用并在运行时将其分配给一个可变对象,然后您可以连接触摸事件。 </p>

<pre><code>let mutable _fsharpButton = null :&gt; UIButton

[&lt;Outlet&gt;]
member this.fsharpButton
       with get() = _fsharpButton
       and set value = _fsharpButton &lt;- value
</code></pre>

<p>完整的 ViewController 示例:</p>

<pre><code>namespace ios_fsharp_foo

open System
open Foundation
open UIKit

[&lt;Register (&#34;ViewController&#34;)&gt;]
type ViewController (handle:IntPtr) =
    inherit UIViewController (handle)

    let mutable _fsharpButton = null :&gt; UIButton

    let addUpdateHandler =
      new EventHandler (fun sender eventargs -&gt;
            Console.WriteLine(&#34;Hello StackOverflow&#34;)
    )

    [&lt;Outlet&gt;]
    member this.fsharpButton
         with get() = _fsharpButton
         and set value = _fsharpButton &lt;- value

    override x.DidReceiveMemoryWarning () =
      // Releases the view if it doesn&#39;t have a superview.
      base.DidReceiveMemoryWarning ()
      // Release any cached data, images, etc that aren&#39;t in use.

    override x.ViewDidLoad () =
      base.ViewDidLoad ()
      // Perform any additional setup after loading the view, typically from a nib.
      _fsharpButton.TouchUpInside.AddHandler addUpdateHandler

    override x.ShouldAutorotateToInterfaceOrientation (toInterfaceOrientation) =
      // Return true for supported orientations
      if UIDevice.CurrentDevice.UserInterfaceIdiom = UIUserInterfaceIdiom.Phone then
         toInterfaceOrientation &lt;&gt; UIInterfaceOrientation.PortraitUpsideDown
      else
         true
</code></pre>

<p>我个人只是通过代码创建 UI 并跳过 Storyboard 设计器...</p></p>
                                   
                                                <p style="font-size: 20px;">关于c# - F#:从 ViewController 中的 Storyboard访问 UI 元素?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/45360541/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/45360541/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: c# - F#:从 ViewController 中的 Storyboard访问 UI 元素?