间歇性问题设置UISwitch

时间:2017-05-11 16:07:42

标签: ios swift

我有一个令人困惑的问题,我希望有人可以给我一些解决方法的见解或指导。

我的应用非常简单。它是UISwitches和标签的一系列视图,用作为客户选择一组产品的指导性访谈。最后,它将所有变量存储在一个类中,并使用它们来构建PDF提议。

一切都很好,除了罕见的场合。对于使用该应用程序的人,我已经出现过两次,当他们转到之前的屏幕时,它无法在视图中设置UISwitch元素。再玩一点,然后开始按预期行事。

我知道变量仍然存储正确,因为如果你在展示这种行为的同时生成PDF,那么所有的内容都会出现,那些先前的答案应该生成。

所有变量都存储在一个实例为newTracker的类中:

<script src="http://d3js.org/d3.v3.min.js"></script>

<script>
    // set the dimensions of the canvas
    var margin = { top: 20, right: 20, bottom: 70, left: 40 },
        width = 1000 - margin.left - margin.right,
        height = 500 - margin.top - margin.bottom;


    // set the ranges
    var x0 = d3.scale.ordinal().rangeRoundBands([0, width], .05);
    var x1 = d3.scale.ordinal();
    var xl = d3.scale.linear().range([0,width]);
    var y = d3.scale.linear().range([height, 0]);
    var z = d3.scale.ordinal().range(["#0b4a72", "#ad1a2c", "#7aa74d"]);

    // define the axis
    var xAxis = d3.svg.axis()
        .scale(x0)
        .orient("bottom")


    var yAxis = d3.svg.axis()
        .scale(y)
        .orient("left")
        .ticks(10);

    // add the SVG element
    var svg = d3.select("body").append("svg")
        .attr("width", width + margin.left + margin.right)
        .attr("height", height + margin.top + margin.bottom)
        .append("g")
        .attr("transform",
        "translate(" + margin.left + "," + margin.top + ")");

    // load the data
    d3.json("http://lrssrs/LRCS/EmpHours/GraphData", function (error, data) {

        var seriesNames = d3.keys(data[0]).filter(function (key) { return (key !== "SORT_NAME") && (key !== "Year") && (key !== "Month") && (key !== "MonthName"); });

        data.forEach(function (d) { d.Hours = seriesNames.map(function (name) { return { name: name, value: +d[name] }; }); });

        // scale the range of the data
        x0.domain(data.map(function (d) { return d.MonthName + " " + d.Year; }));
        x1.domain(seriesNames).rangeRoundBands([0, x0.rangeBand()]);
        xl.domain(data.map(function (d) { return d.MonthName + " " + d.Year; }));
        y.domain([0, (10 + d3.max(data, function (d) { return d3.max(d.Hours, function (d) { return d.value; }); }))]); 
        var line = d3.svg.line()
            .x(function (d) {
              return xl(d.Available);
            })
            .y(function (d) {
              return y(d.Service / d.Timesheet);
            });     

        svg.append("path")
            .attr("d", line(data));

        // add axis
        svg.append("g")
            .attr("class", "x axis")
            .attr("transform", "translate(0," + height + ")")
            .call(xAxis)
            .selectAll("text")
            .style("text-anchor", "end")
            .attr("dx", "-.8em")
            .attr("dy", "-.55em")
            .attr("transform", "rotate(-90)");

        svg.append("g")
            .attr("class", "y axis")
            .call(yAxis)
            .append("text")
            .attr("transform", "rotate(-90)")
            .attr("y", 5)
            .attr("dy", ".71em")
            .style("text-anchor", "end")
            .text("Hours");

        var state = svg.selectAll(".state")
            .data(data)
            .enter().append("g")
            .attr("class", "g")
            .attr("transform", function (d) { return "translate(" + x0(d.MonthName + " " + d.Year) + ",0)"; });

        // Add bar chart
        state.selectAll("bar")
            .data(function (d) { return d.Hours; })
            .enter().append("rect")
            .attr("class", "bar")
            .attr("x", function (d) { return x1(d.name); })
            .attr("width", x1.rangeBand())
            .attr("y", function (d) { return y(d.value); })
            .attr("height", function (d) { return height - y(d.value); })
            .style("fill", function (d) { return z(d.name); });

        state.selectAll("text")
            .data(function (d) { return d.Hours; })
            .enter().append("text")
            .text(function (d) { return d.value; })
            .attr("width", x1.rangeBand())
            .attr("x", function (d) { return x1(d.name) + (x1.rangeBand() / 2); })
            .attr("y", function (d) { return y(d.value) + 20; })
            .attr("text-anchor", "middle")
            .attr("font-family", "sans-serif")
            .attr("font-size", "11px")
            .attr("fill", "white");

        var legend = svg.selectAll(".legend")
            .data(seriesNames.slice().reverse())
            .enter().append("g")
            .attr("class", "legend")
            .attr("transform", function (d, i) { return "translate(0," + (i * 20) + ")"; });

        legend.append("rect")
            .attr("x", width - 18)
            .attr("width", 18)
            .attr("height", 18)
            .style("fill", z);

        legend.append("text")
            .attr("x", width - 24)
            .attr("y", 9)
            .attr("dy", ".35em")
            .style("text-anchor", "end")
            .text(function (d) { return d; })
            .on("click", function (d) { alert(d); });

    });

</script>

网点看起来像:

class AnswerTracker: NSObject {

    var someVariable1: Bool = false
    var someVariable2: Bool = false
    ...

设置这些开关是在viewDidLoad()中完成的,如下所示:

@IBOutlet weak var outSomeSwitch1: UISwitch!
@IBOutlet weak var outSomeSwitch2: UISwitch!

任何人都可以想到为什么这会随机的功能?它的第一个实例是具有最新操作系统的iPhone 6s,第二个实例是最新操作系统的7。其他应用程序都没有在后台运行。我把手放在他们身上,但是他们没有挂进我的开发机器,所以我无法查看正在发生的事情,我无法在4,5,5s,7上复制结果,或者我用于测试的iPad Air 2.

在我的情况下唯一另一件奇怪的事情是,有时 Back Next 按钮可能不是拖累和放置。下降segue。有时他们可以使用一些代码来决定接下来要加载哪个屏幕,或应该之前的哪个屏幕。

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    if newTracker.someVariable1 {
        outSomeSwtich1.setOn(true, animated: true)
    }
    if newTracker.someVariable2 {
        outSomeSwitch2.setOn(true, animated: true)
    }
}

问题可能会以加载视图的方式存在吗?

感谢任何见解。

1 个答案:

答案 0 :(得分:1)

从故事板加载视图后,将调用

viewDidLoad()一次来设置视图。如果您想在视图显示时更新用户界面,请稍后转到其他视图,您应该使用viewDidAppearviewWillAppear()

override func viewWillAppear() {
    super.viewWillAppear()
    outSomeSwitch1.setOn(newTracker.someVariable1, animated: true)
    outSomeSwitch2.setOn(newTracker.someVariable2, animated: true)
}