Visual Studio跨平台开发实战(2):Xamarin.iOS基本控制项介绍
qiyuwang 2024-10-11 18:22 9 浏览 0 评论
前言
在上一篇文章中, 我们介绍了Xamarin 以及简单的HelloWorld范例, 这次我们针对iOS的专案目录架构以及基本控制项进行说明. 包含UIButton,UISlider,UISwitch, UIImage以及UIWebView控制项。
iOS的使用者界面描述文档, 其副文档名为.xib, 目前在Visual Studio尚未支持直接编辑. 因此在文章中, 我们会先用Xamarin Studio建立专案, 并使用XCode中的Interface Builder布置我们所需的控制项后, 再以Visual Studio 开启专案进行程序代码的撰写. 让我们开始吧.
建立专案及使用Xcode Interface Builder
1. 开启Xamarin Studio. 新增专案 => 选择IOS下的IPhone=>在右边的菜单中选择 Single View Application
2. 在名称及专案名称中输入“Lab01-HelloWorld”
3. 专案建立后, 检视专案的文档案架构.
Main.cs : 应用程序的进入点.
- AppDelegate.cs : 主要的应用程序类别(class), 并接听来自作业系统的事件及相对应的事件处理.
- Lab01_HelloWorldViewController.cs : 负责主银幕的生命周期, 也就是MVC分层的Controller.
- Lab01_HelloWorldViewController.designer.cs : 包含使用者界面中对象的定义及动作(Action)的声明.
- Lab01_HelloWorldViewController.xib : 主要的使用者界面定义文档, 也就是MVC分层的View. XML格式, 可通过Xcode的Interface Builder(IB)进行编辑.
- Info.plist : 应用程序的资讯文档, 如名称, 版本, 图示等等.
4. 双击Lab01_HelloWorldViewController.xib以开启XCode, 在IB右边的Object Library拖拉Button及Label如下图, 存档后关闭IB, 回到Xamarin Studio
5. 使用Visual Studio 开启Lab01-HelloWorld专案并行以下设定:
- 在工具列=>建置=>组态管理员, 将平台设为iPhoneSimulator
- 开启专案属性, 选择iOS Application节点并输入Application Name, Identifier, Version等资讯. 最下面的”Deployment Target” 表示目标装置的最低作业系统版本. 此处选择6.0, 表示此应用程序可执行在iOS 6.0以后的版本.
- 执行专案: iPhone 模拟器将会启动并显示先前步驟所设计的页面.
Outlet与Action
由于iOS应用程序的开发模式使用MVC的分层架构. 因此使用者在View布置控制项后, 必须新增与Controller的链接(Connect), 才能在Controller通过程序代码进行控制项的操作. 而此链接在iOS中可以通过Outlet及Action进行.
- Outlet : 以属性的方式链接View及Controller. 可以对Outlet附加event handler 或呼叫方法
- Action :类似WPF的command property. 可以将多个control bind到同一个action.
接下来我们通过实际的范例来了认识Outlet及Action.
1. 在Xamarin Studio中打开Lab1_HelloWorldViewController.xib, 进入Interface Builder.
点选右上方的”Show Assistant editor”图标
此时会出现另一个辅助视窗并带出Lab01_HelloWorldViewController.h头文件
2. 按住”Control”键并将按钮”Click Me” 拖到@interface 及 @end中间的空白处
放开后会出现对话窗, 在name栏位输入“btnClickMe”.
3. 依照步驟2, 在Label 新增一个Outlet, 并命名为lblOutput.
您会发现在header文档中会增加2个property, 确认后关闭Interface Builder
4. 在Visual Studio 中开启Lab01_HelloWorldViewController.designer.cs, 您会发现在文档案中声明了2个属性, 名称与上一个步驟中所命名的名称相同. 并加上了[Outlet] 属性(Attribute)
5.开启 Lab01_HelloWorldViewController.cs文档. 并在 ViewDidLoad 事件处理函式中加入btnClickMe的TouchUpInside 事件委派及事件处理函式, 如下图所示:
6. 执行专案并测试Click Me 按钮功能是否正常.
由于目前最新版本的Xamain.iOS已支持到C# 5.0. 因此像是匿名方法及Lambda Expression等语法都有支持, 上述的委派及事件处理也可以通过如下代码来编写:
7. 再次点击xib文档. 依照步驟2的方式在Action 1按钮新增一个Action(不是Outlet), 如下图所示, 在Connection部分选择Action, Name的部份输入”actnButtonClick”
在右边的header文档可以看出action与先前加入的Outlet有所不同.
依照上面的方式, 我们将Action 2 按钮加入到同一个Action. 请按下Control鍵, 然后将Action 2按钮拖放到先前的 –(IBAction)actnButtonClick:(id) sender的声明. 此时仅会出现Connect Action的方法, 如下图所示:
8. 关闭Interface Builder, 回到Visual Studio 重新载入ViewController.Designer.cs文档. 可以发现刚刚新增的action, 被转换为没有回传值的方法.
9. 开启Lab01_HelloWorldViewController.cs 在类别中的空白出输入”partial”, Visual Studio 会提示您新增actnButtonClick的事件处理常式. 请输入以下程序代码:
执行程序, 确认执行結果是否符合预期
基本控制项
在上一节中, 我们已经练习过UIButton以及UILabel控制项的操作. 接下来我们将说明其他的基本控制项。
1. 这让我们通过程序动态产生Slider控制项. 首先我们在 Lab01-HelloWorldViewController 类别中新增Slider控制项的声明
2. 在ViewDidLoad 事件处理中初始化控制项, 并在ValueChanged 事件中将目前slider的值传到Label控制项显示
1 | _slider = newUISlider(newRectangleF(10, 350, View.Frame.Width -20, 50)); |
2 | _slider.MinValue = 0.0f; |
3 | _slider.MaxValue = 100.0f; |
4 | _slider.SetValue(20.0f,false); |
5 | _slider.ValueChanged += (sender, e) => |
7 | this.lblOutput.Text =string.Format("滑桿目前的值为 {0}", ((int)_slider.Value).ToString); |
9 | View.AddSubview(_slider); |
3. 执行专案, 试着滑动slider
1. 同样通过程序动态产生, 我们在Lab01_HelloWorldViewController类别中声明
03 | _switch = newUISwitch(newRectangleF(10,350,100,30)); |
05 | _switch.SetState(true,false); |
09 | _switch.ValueChanged += (sender, e) => |
13 | this.lblOutput.Text =string.Format("目前Switch的值为 {0}", _switch.On ?"ON":"OFF"); |
3. 执行专案, 试着切换Switch控制项
1. 开启Lab01_HelloWorldViewController.xib. 并放置1个UIImageView对象, 如下图所示:
针对UIImageView对象新增1个Outlet并命名为_img
2. 这里我们借用btnClickMe的事件处理, 指定UIImageView的图片来源.(请在专案中加入图片文档, 这里我们使用flower.jpg)
01 | this.btnClickMe.TouchUpInside += (sender, e) => |
05 | //this.lblOutput.Text = string.Format ("我被点了{0}下", ++i); |
09 | _img.Image = UIImage.FromFile("flower.jpg"); |
上述的程序代码中, 图片的资料来源是预先放置在专案目录中的图片文档.
3. 执行专案后点击ClickMe后的结果如下:
结语
通过上述的介绍, 是不是觉得使用C#来开发iOS的应用程序, 与开发Windows Form应用程序非常相似呢? 相信各位都能举一反三, 运用其他的控制项来建立自己的iOS应用程序, 在接下来的文章中, 将会介绍如何开发iOS的多页面应用程序, 以及程序如何在页面中预览。
本文转载自CSDN博客
本站文章除注明转载外,均为本站原创或翻译
相关推荐
- 程序员都用什么电脑?适合编程笔记本电脑推荐
-
适合程序员的笔记本电脑首先应该满足小巧轻便这个需求,然后才是性能因素,一个标准的程序员必定能够随时随地改BUG,所以可以优先考虑苹果MacBookPro,由于其MacOS就是Linux内核,做开...
- Linux(debian)内核编译(二)虚拟网卡实例
-
2.10.虚拟网卡TUN/TAP...
- 老毛子要上天 冬天竟然拿矿机当暖气
-
2017-12-2814:10:55作者:李鑫我们都知道矿机在实际工作当中会产生出大量的热能,近日俄罗斯就有人用Comino挖矿电脑来充当暖气的效果,这台电脑不需要特别安装,也没有多余的接口,同样...
- qemu linux内核(5.10.209)开发环境搭建
-
版本信息宿主机:ubuntu20.04.6LTS(FocalFossa)虚拟机:ubuntu20.04.6LTS(FocalFossa)安装宿主机的步骤省略,和一般的在vmware中安...
- Ubuntu 16.04 LTS现已正式支持IBM LinuxONE与z Systems
-
4月22号的时候,Canonical很高兴地宣布了Ubuntu16.04LTS(XenialXerus)已正式支持IBMzSystems和LinuxONE大型机的消息。该长期支持版本经历了六...
- 号称最强大深度学习笔电,雷蛇推出Lambda Tensorbook笔记本电脑
-
IT之家4月13日消息,深度学习公司Lambda与雷蛇合作,发布了新的LambdaTensorbook笔记本电脑,号称是世界上为深度学习设计的最强大的笔记本电脑,可以使用Linux...
- 电脑连 WiFi 全攻略!3 步搞定 + 疑难解答
-
电脑搜不到WiFi?输对密码却连不上?看视频卡、打游戏延迟高?别慌!不管你用Win/Mac还是Linux,这篇保姆级教程从连接步骤到故障排查全覆盖,10分钟让你告别“网络黑洞”!一、基础连...
- linux 网卡bond模式
-
如何进行Linux网络绑定网络绑定简介在Debian10Buster(DHCP)上配置有线和无线网络绑定...
- 在 Ubuntu Server 上配置静态 IP 地址
-
Ubuntu17.10之前版本编辑/etc/network/interfaces文件重启网络服务或重启服务器来应用新的配置...
- Linux网络运维脚本实战示例:配置下发
-
在Linux网络运维场景中,自动化配置下发是提高效率的关键。一个示例展示如何编写一个Shell脚本,用于远程批量部署网络配置到多台服务器。本示例将使用SSH无密码登录和Ansible自动化工具来简化和...
- KVM 虚拟机网络连接异常的排查方法
-
#KVM虚拟机网络连接异常的排查方法当KVM虚拟机出现网络连接问题时,可以按照以下系统化的方法进行排查和解决:##一、基础网络检查###1.检查虚拟机网络状态```bash#在虚拟机内部检...
- 技术宅教你linux开发板直连电脑ubuntu
-
1:我使用的是笔记本,台式机类似。原理:和开发板挂载到路由器或者交换机不一样。我们通过笔记本电脑直连,是将笔记本的物理网卡作为一个桥梁,把开发板和虚拟机ubuntu连接在一起。连接好以后可以使用NFS...
- Ubuntu 25.04发行版登场:Linux 6.14内核,带来多项技术革新
-
IT之家4月18日消息,科技媒体linuxiac昨日(4月17日)发布博文,报道称代号为PluckyPuffin的Ubuntu25.04发行版正式上线,搭载最新Linu...
- 【故障解决】麒麟系统右下角网络图标取消显示叹号
-
原文链接:【故障解决】麒麟系统右下角网络图标取消显示叹号...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- navicat无法连接mysql服务器 (65)
- 下横线怎么打 (71)
- flash插件怎么安装 (60)
- lol体验服怎么进 (66)
- ae插件怎么安装 (62)
- yum卸载 (75)
- .key文件 (63)
- cad一打开就致命错误是怎么回事 (61)
- rpm文件怎么安装 (66)
- linux取消挂载 (81)
- ie代理配置错误 (61)
- ajax error (67)
- centos7 重启网络 (67)
- centos6下载 (58)
- mysql 外网访问权限 (69)
- centos查看内核版本 (61)
- ps错误16 (66)
- nodejs读取json文件 (64)
- centos7 1810 (59)
- 加载com加载项时运行错误 (67)
- php打乱数组顺序 (68)
- cad安装失败怎么解决 (58)
- 因文件头错误而不能打开怎么解决 (68)
- js判断字符串为空 (62)
- centos查看端口 (64)