如何在 Rider 中设置 Xamarin.ios 视图的属性? (如何更新自动生成的 View.designer.cs?)
Posted
技术标签:
【中文标题】如何在 Rider 中设置 Xamarin.ios 视图的属性? (如何更新自动生成的 View.designer.cs?)【英文标题】:How to set property for Xamarin.ios view in Rider? (How to update autogenerated View.designer.cs?) 【发布时间】:2019-11-28 18:14:41 【问题描述】:如果我使用 Visual Studio for Mac,它在设计器中有此字段。
它在 View.cs 文件中创建一个属性,允许我绑定到它。
我在 xcode 中找到了一个类似的部分(这是 Rider 打开的部分),它只有这些选项。没有名称字段。
此名称字段不是按钮标签上显示的内容。我知道怎么设置。
我宁愿使用 Rider 而不是 Visual Studio for mac。如果我必须不断地来回跳跃,这显然是个问题。
编辑:据我所知,它似乎在编辑 View.designer.cs。
它有这个评论。我怎样才能从 Rider 编辑这个?
// WARNING
//
// This file has been generated automatically by Visual Studio from the
outlets and
// actions declared in your storyboard file.
// Manual changes to this file will not be maintained.
//
这是新 MvvmCross 项目默认的样子
using Foundation;
using System;
using System.CodeDom.Compiler;
namespace HelloCrossPlatform.ios.Views
[Register ("FirstView")]
partial class FirstView
[Outlet]
[GeneratedCode ("iOS Designer", "1.0")]
UIKit.UILabel Label get; set;
[Outlet]
[GeneratedCode ("iOS Designer", "1.0")]
UIKit.UITextField TextField get; set;
void ReleaseDesignerOutlets ()
if (Label != null)
Label.Dispose ();
Label = null;
if (TextField != null)
TextField.Dispose ();
TextField = null;
这是我使用 Designer 将 name 属性添加到 Visual Studio for Mac 中的按钮时的样子
using Foundation;
using System;
using System.CodeDom.Compiler;
namespace HelloCrossPlatform.iOS.Views
[Register ("FirstView")]
partial class FirstView
[Outlet]
[GeneratedCode ("iOS Designer", "1.0")]
UIKit.UILabel Label get; set;
[Outlet]
[GeneratedCode ("iOS Designer", "1.0")]
UIKit.UIButton SayHelloButton get; set;
[Outlet]
[GeneratedCode ("iOS Designer", "1.0")]
UIKit.UITextField TextField get; set;
[Action ("UIButtonDZD114An_TouchUpInside:")]
[GeneratedCode ("iOS Designer", "1.0")]
partial void UIButtonDZD114An_TouchUpInside (UIKit.UIButton
sender);
void ReleaseDesignerOutlets ()
if (Label != null)
Label.Dispose ();
Label = null;
if (SayHelloButton != null)
SayHelloButton.Dispose ();
SayHelloButton = null;
if (TextField != null)
TextField.Dispose ();
TextField = null;
Rider 甚至是与 Xamarin 一起使用的好工具吗?我很失望他们甚至将其作为一种选择进行营销。真的质疑我对 JetBrains 的订阅。Vscode 似乎和 Webstorm 一样好用,这是我使用他们的唯一其他产品。
【问题讨论】:
【参考方案1】:Rider 没有针对 .xib
和 .storyboard
UI 文件的特殊设计器。我们(Rider 团队)认为我们将无法实现与原生 xcode 一样好的(和实际的)UI 设计器。因此,在 Rider 中使用 Xamarin macios UI 的主要场景 - 使用 xcode 界面生成器。
您可以查看有关 outlets 生成的苹果文档: https://developer.apple.com/library/archive/documentation/ToolsLanguages/Conceptual/Xcode_Overview/ConnectingObjectstoCode.html
这是如何在 xcode 11 中使用默认设置进行的简要说明。
将 UI 编辑器拆分为设计器和源代码部分
Ctrl+单击要绑定的控件并将其拖入代码中。 重要提示:使用 .h 文件创建新的动作和出口,Rider 分析 .h 文件以构建公共 API 模型。
现在您可以输入将创建绑定的控件的名称。您将在 objc 代码中看到相应的 outlet。
也许它不是那么简单,所以我将尝试解释它在内部是如何工作的。 Xamarin macios 项目是(几乎)常规的 .NET C# 项目。因此,为了让您在 xcode 中编辑 UI,Rider(实际上是 VS)做了一些魔术。它需要 .NET 项目并且:
-
使用特定设置和配置在
obj\xcode
文件夹中创建相应的xcodeproj(pbxproj 和朋友)项目。
复制视图、plist 文件、图像等所有内容。
查找所有ViewController
类型。 Rider 为它们中的每一个生成带有动作和出口的 objc 类。
打开 xcode 和生成的项目。
当您在生成的项目中进行了一些更改并返回到 Rider 时,它会尝试应用所有更改:
-
将所有更改的内容文件复制回 .NET 项目
更新设置
解析 objc 文件并为视图控制器重新生成
*.designer.cs
文件。对于所有这些文件,您将看到这个生成的标题(将来可以更改):
// WARNING
//
// This file has been generated automatically by Rider IDE
// to store outlets and actions made in Xcode.
// If it is removed, they will be lost.
// Manual changes to this file may not be handled correctly.
//
要控制 xcode 同步过程并查看发生了什么以及发生了什么错误,您可以使用特殊的 Rider 工具窗口:xcode console
。每次在 xcode 中打开项目时都会显示:
而不是结论:Rider 的团队试图为 Xamarin 开发人员提供良好的体验,甚至比 VS for Mac 更好。因此,我们正在努力支持一些 Xamarin 部件(2020.1 中的 Xamarin Forms Hot Reload),因此请随时在我们的公共问题跟踪器中分享您的问题:
https://youtrack.jetbrains.com/issues/RIDER?q=Technology:%20Xamarin%20
【讨论】:
非常感谢。我永远不会想出 .h 文件,因为它会默认提取 .m 。这很完美,让我可以使用 MvvmCross。 也许我们必须稍微重写一下引擎并解析 .m 文件...随时与我们分享任何反馈 =) 在第 1 步中,对我来说,不清楚从哪里获得该弹出窗口。它是编辑器右上角的行,有点像 word 中的左对齐图标。 每个版本的 xcode 都不同 =( 你必须谷歌你的版本。通常它在many lines with different length
图标下以上是关于如何在 Rider 中设置 Xamarin.ios 视图的属性? (如何更新自动生成的 View.designer.cs?)的主要内容,如果未能解决你的问题,请参考以下文章
Rider IDE 无法在 iPhone 设备上运行项目 Xamarin.iOS
Rider Xamarin iOS 错误“部署后未生成应用程序包”
Jetbrains Rider、Xamarin IOS 在钥匙串中找不到有效的 iOS 代码签名密钥
在 Rider IDE 中设置 Android Xamarin 解决方案未检测到框架