Swift - 如何从XML代码动态构建iOS用户界面?

Swift - How to build iOS user interface dynamically from XML code?

提问人:Marton Zeisler 提问时间:4/14/2018 更新时间:4/15/2018 访问量:1013

问:

我有以下示例 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>
iOS Swift 动态 XML 解析

评论


答:

2赞 meaning-matters 4/14/2018 #1

首先,您需要使用 XMLParser 解析 XML

然后,遍历生成的数据结构,并手动创建每个组的 s 和可能的 s。UILabelUIView

最后,将上面的每个 UI 元素添加到当前的 .UIView

如果要添加每个组,当然需要将其设置为当前 .当你到达一个组中 Fiels 的末尾时,你需要跳回前一个(即当前 的)。UIViewUIViewUIViewsuperviewUIView

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)