提问人:Marton Zeisler 提问时间:4/14/2018 更新时间:4/15/2018 访问量:1013
Swift - 如何从XML代码动态构建iOS用户界面?
Swift - How to build iOS user interface dynamically from XML code?
问:
我有以下示例 xml 代码,我的应用程序收到。我的工作是根据此 xml 代码创建某些 UI 元素,例如文本字段和标签。
<?xml version="1.0" encoding="UTF-8"?><Form>
<Group description="Alap" name="GEN">
<Field name="CUSNUM" type="F" length="0" lines="1" constraint="" mcHandler="" readOnly="false" hidden="false" mandatory="true" label="Üzletkód" width="2"/>
<Field name="CUSTOMERNAME" type="F" length="0" readOnly ="false" label="Üzlet neve" width="2"/>
<Field name="COMPANYNAME" type="F" length="0" readOnly ="false" label="Cég neve" width="2"/>
<Field name="ZIPCODE" type="F" length="0" readOnly ="false" label="Irányítószám" width="2"/>
<Field name="CITY" type="F" length="0" readOnly ="false" label="Település" width="2"/>
<Field name="ADDRESS" type="F" length="0" readOnly ="false" label="Cím" width="2"/>
</Group>
</Form>
答:
2赞
meaning-matters
4/14/2018
#1
首先,您需要使用 XMLParser 解析 XML。
然后,遍历生成的数据结构,并手动创建每个组的 s 和可能的 s。UILabel
UIView
最后,将上面的每个 UI 元素添加到当前的 .UIView
如果要添加每个组,当然需要将其设置为当前 .当你到达一个组中 Fiels 的末尾时,你需要跳回前一个(即当前 的)。UIView
UIView
UIView
superview
UIView
XML 未定义需要放置字段和组的确切位置。这应该由要求您这样做的一方的要求/愿望来定义。我建议您定义上/下/左/右边距,以及标签和组视图之间的水平和垂直边距。
您可以使用 iOS 自动布局,但这会添加代码。要做出决定,请查看这些 UI 在实际场景中会变得多么复杂,以及您需要多大的大小灵活性。不要写不必要的“通用”内容;你宁愿专注于保持代码的简单易懂性。
评论
0赞
Marton Zeisler
4/14/2018
谢谢,GitHub 上也有很多 XML 解析器,您推荐使用 Apple 的 XML 解析器还是 GitHub 上的其他东西?
0赞
meaning-matters
4/14/2018
@MartonZeisler 就我个人而言,我坚持尽可能长时间地添加外部内容,以保持简单并限制依赖性。在这种情况下,苹果的实现可能足够快/足够好或更好。
2赞
gcharita
4/15/2018
#2
特别是关于XML解析,如果你不介意使用外部库,你可以看看XMLMapper。
用于映射 XML 的模型类为:
class Form: XMLMappable {
var nodeName: String!
var group: Group?
required init(map: XMLMap) {
}
func mapping(map: XMLMap) {
group <- map["Group"]
}
}
class Group: XMLMappable {
var nodeName: String!
var fields: [Field]?
var description: String?
var name: String?
required init(map: XMLMap) {
}
func mapping(map: XMLMap) {
fields <- map["Field"]
description <- map.attributes["description"]
name <- map.attributes["name"]
}
}
class Field: XMLMappable {
var nodeName: String!
var name: String?
var type: String?
var length: Int?
var lines: Int?
var constraint: String?
var mcHandler: String?
var readOnly: Bool?
var hidden: Bool?
var mandatory: Bool?
var label: String?
var width: Int?
required init(map: XMLMap) {
}
func mapping(map: XMLMap) {
name <- map.attributes["name"]
type <- map.attributes["type"]
length <- map.attributes["length"]
lines <- map.attributes["lines"]
constraint <- map.attributes["constraint"]
mcHandler <- map.attributes["mcHandler"]
readOnly <- map.attributes["readOnly"]
hidden <- map.attributes["hidden"]
mandatory <- map.attributes["mandatory"]
label <- map.attributes["label"]
width <- map.attributes["width"]
}
}
您可以使用以下命令映射 XML 字符串:XMLMapper
let form = XMLMapper<Form>().map(XMLString: xmlString)
评论