gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:22:58 26 4
gpt4 key购买 nike

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

MyButton.TouchUpInside += (object sender, EventArgs e) =>
{
...
}

我试图在 F# 中做同样的事情,但它无法识别 Controller 中的“MyButton”。有帮助吗?

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

http://7sharpnine.com/2013/02/03/2013-02-03-monotouch-and-fsharp-part-i/

,此功能在 F# 中不可用,因为“F# 中缺少部分类使得 UI 设计人员很难将工具紧密集成到 F# 中”,他声称他将致力于此,但该博客文章是 4.5 年前的,所以我希望有人已经解决了这个问题...请指教

更新 2:同一个博客在 4 年后再次出现并再次解决了这个问题 http://7sharpnine.com/2017/04/11/i-want-to-tell-you-a-storyboard/

最佳答案

假设您在名为“fsharpButton”的 ViewController 上定义了一个 UIButton,您定义了一个 Outlet,它获取 VC 对象引用并在运行时将其分配给一个可变对象,然后您可以连接触摸事件。

let mutable _fsharpButton = null :> UIButton

[<Outlet>]
member this.fsharpButton
with get() = _fsharpButton
and set value = _fsharpButton <- value

完整的 ViewController 示例:

namespace ios_fsharp_foo

open System
open Foundation
open UIKit

[<Register ("ViewController")>]
type ViewController (handle:IntPtr) =
inherit UIViewController (handle)

let mutable _fsharpButton = null :> UIButton

let addUpdateHandler =
new EventHandler (fun sender eventargs ->
Console.WriteLine("Hello StackOverflow")
)

[<Outlet>]
member this.fsharpButton
with get() = _fsharpButton
and set value = _fsharpButton <- value

override x.DidReceiveMemoryWarning () =
// Releases the view if it doesn't have a superview.
base.DidReceiveMemoryWarning ()
// Release any cached data, images, etc that aren'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 <> UIInterfaceOrientation.PortraitUpsideDown
else
true

就我个人而言,我只是通过代码创建 UI 并跳过 Storyboard 设计器...

关于c# - F#:从 ViewController 中的 Storyboard访问 UI 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45360541/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com