在我一年前的第一篇关于移动开发的博客
SAP和Xamarin for Cţmobile跨平台开发教程
中,我详细描述了移动应用程序体系结构。我以前的所有应用程序都是使用Xamarin在Cţ中开发的。当Swift发布时,我想探索这一点,并编写一个基于Xamarin的iphone应用程序Swift和Xcode 6.3。这个博客
描述了我使用SWIFT开发的SAP Plant Stock应用程序。ABAP side REST服务已经按照我之前的博客中的描述开发了。
当我开始我的应用程序时,我想提供我为android和Iphone开发的类似应用程序所提供的所有功能,这个应用程序使用Xamarin(C#)但是在SWIFT和Xcode 6.3中开发此功能
Xamarin原生IPhone和Apple Watch for Plant Stock–第1部分
我使用Xcode创建了一个新的单视图应用程序–删除了创建的视图控制器–添加了一个新的表视图控制器–将此嵌入导航视图控制器(编辑菜单-嵌入导航视图控制器)
创建Swift类一个基于表视图控制器和其他UI视图控制器,并将这些类与序列图像板相关联。创建一个从按钮到第二个视图控制器的序列,允许用户输入选择-对于工厂和位置的材料,我用我得到的数据填充两个选择器从SAP REST call.
为了使REST all成为SAP,我创建了如下协议
protocol SapRestProtocol{
func didereceiveresponse(results:NSArray)
}
因为我想得到工厂和位置的主数据,所以在开始时我更改了appdelegate文件来实现上述协议,读取
class appdelegate:UIResponder,UIApplicationDelegate,SapRestProtocol{
{
///应用程序启动后自定义的覆盖点
checkandFetch()
return true
}
}
func checkandFetch()
{
/
var sapapi:SapRest?=SapRest()
sapapi!。委托=自我
sapapi!。GetSapMasterData("XXXXX",RestTag:"/MADATA/MADATA")
}
func didReceiveResponse(结果:NSArray){
if结果.计数>0{
//填充必须填充在SapRest类中的相应pickers
}
中的location和plant数组我的代码如下
类SapRest:NSObject{
var data:NSMutableData=NSMutableData()
var delegate:萨普雷斯特协议?
func GetSapMasterData(stringPost:String,便宜的云服务器,RestTag:字符串){
let path="
let SapClient="
let userName="
let passWord="
let loginString=NSString(格式:"%@:%@",userName,passWord)
let loginda:NSData=loginString.datausingencode文件(NSUTF8StringEncoding)!
让base64LoginString=loginData.Base64EncodedStringWith选项(NSDataBase64)编码选项.allZeros)
let urlPath=path+RestTag+SapClient;
如果let url=NSURL(string:urlPath){
var request:NSMutableURLRequest=NSMutableURLRequest(url:url)
请求.HTTPMethod="后"
请求.setValue("基本\(base64LoginString)",forHTTPHeaderField:"授权")
varpostData:NSData=stringPost.DataUsingEncode编码(NSUTF8StringEncoding)!
var postLength:NSString=String(postData.length文件)
请求.HTTPBody=postData
请求.setValue(postLength作为字符串,forHTTPHeaderField:"Content Length")
请求.setValue("application/x-www-form-urlencoded",云机服务器,用于httpheaderfield:"Content Type")
请求.setValue("应用程序/json",对于httpheaderfield:"Accept")
如果let connection=NSURLConnection(请求:请求,委托:self,开始时间:假){
连接.启动()
}
}
}
//}
我们现在有两个字符串数组中的工厂和位置,这样当用户单击按钮时–我们将填充选择器并转移到选择屏幕。
对于TableView控制器,我有代码–我们必须实现实现所需函数
类StockListController:UITableViewController{
override func numberOfSectionsInTableView(tableView:UITableView)->Int{
return 1
}
override func tableView(tableView:UITableView,行数节段:Int)->Int{
返回项目.计数
}
@iAction func unwindToStockList(segue:UIStoryboardSegue)
{
如果序列标识符=="UnWindList"{
如果let svc=segue.sourceview控制器作为?选择ViewController{
in_rec=svc.indata公司
如果在_记录材料!=""{
getData()
self.tableView.reloadData()
}
}
}
}
重写func tableView(tableView:UITableView,cellForRowAtIndexPath indexPath:NSIndexPath)->UITableView单元格{
var cell=tableView.dequeueReusableCellWithIdentifier("StockCell",forIndexPath:indexPath)作为?StockCell
如果cell==nil{
cell=UITableViewCell(样式:UITableViewCellStyle.副标题,reuseIdentifier:"StockCell")作为?StockCell
}
var celldata=项目[索引.row];
//配置单元格…
单元格!。TXT工厂!。文本=手机数据.WERKS
手机!。txtLocation!。文本=单元格数据.LGORT
手机!。txtBatch!。文本=手机数据.CHARG
手机!。txtStock!。text=String(格式:"%d",单元格数据.LABST)
返回单元格!
}
请注意"展开"的用法–当用户选择参数并点击"获取"按钮时,这会起作用–此时GetData将调用SAP并根据选择参数获取库存记录
现在让我们查看允许用户输入选择标准的代码,然后单击"获取"以获取用户可以扫描条形码的材料
导入UIKit
导入AVFoundation
类选择ViewController:UIViewController、UIExtFieldDelegate、UIPickerViewDeleteGate、UIPickerViewDataSource、ScannerViewController DeleteGate{
var scannerVC:ScannerViewController!
…
您必须实现以下委托和数据源方法
func textFieldShouldReturn(textField:UITextField)->Bool{
textField.resignFirstResponder辞职()
return false
}
func SetDataForPicker(PLANTS:[String],位置:[字符串])->(){
自生植物=工厂
自我定位=LOCATIONS
}
override func prepareForSegue(segue:UIStoryboardSegue,轻淘客,sender:AnyObject?){
如果序列标识符!="展开列表"{
scannerVC=segue.destinationViewController作为!扫描神经控制器
扫描代表=self
}
}
覆盖函数视图将出现(动画:Bool){
self.pickerPlant.reloadAllComponents()
self.pickerLocation.reloadAllComponents()
selPlant="ALL"
selLocation=""
}
@IBAction func btnScan(发送方:AnyObject){
}
/-条形码打开时触发捕获-
@IBOutlet弱var pickerPlant:UIPickerView!
@IBOutlet弱var pickerLocation:UIPickerView!
覆盖函数didReceiveMemoryWarning(){
太好了。我收到了记忆警告()
//处理所有可以重新创建的资源。
}
@IBAction func btnGetStock(发送方:AnyObject){
如果selPlant=="ALL"{|||selPlant=="ALL"{
selPlant=""
}
如果selLocation=="ALL"{||selLocation=="ALL"{|selLocation=""
}
如果txtMaterial.text.i空{
let alert=UIAlertController(title:"No Material",
message:"Please Enter Material and Click Get Button",物联网教室,
preferredStyle:。alert)
//显示警报
self.presentview控制器(alert,
animated:true,im即时通讯云,
completion:nil)
return
}
//如果让parentc=self.parentview控制器作为?StockListController{
indata.MATNR公司= txtMaterial.text文件
英达·沃克斯=selPlant
数据.LGORT=销售
indata.CHARG公司=selbatch
}
func numberOfComponentsInPickerView(pickerView:UIPickerView)->Int{
return 1
}
}
我们必须实现所需的委托–单击时将填充选取器数据在工具栏按钮上–
override func prepareForSegue(segue:UIStoryboardSegue,sender:AnyObject?){
//使用[segue destinationViewController]获取新的视图控制器。
//将所选对象传递给新的视图控制器。
如果序列标识符=="ToSelect"{
让vc=segue.destinationViewController作为!选择ViewController
var appdeg=UIApplication.sharedApplication应用程序().委派为!AppDelegate
vc.SetDataForPicker设置(appdeg.工厂,位置:适用位置)
}
否则如果序列标识符=="StockDetail"{
让vc=segue.destinationViewController作为!StockDetailViewController
如果let currpath=tableView.indexPathForSelectedRow表视图(){
vc.datarec公司=项目[currpath.row行]
}
}
}