【问题标题】:Updating a dynamically created ImageView with Appcelerator使用 Appcelerator 更新动态创建的 ImageView
【发布时间】:2016-04-25 15:01:42
【问题描述】:

我正在尝试做一些我认为很简单的事情,但只是在使用 Titanium 5.2.2 SDK 的 iOS 上遇到了一些问题。

所以,我有一个应用程序,它从应用程序外部托管的 JSON 文件中提取员工列表,我将所有数据缓存在板载数据库中,并为循环内的每个员工创建蒙版图像。

employeeImage[i] = Titanium.UI.createMaskedImage({
                        mask : employee_image, // background image
                        tint: 'black',
                        mode : Titanium.UI.iOS.BLEND_MODE_COLOR,
                        width: 210,
                        height: 210,
                        touchEnabled: false,
                        custom_employee_id: employee_id
                    });

我需要能够引用该图像并将色调从“黑色”更新为我的应用程序中其他地方的“其他”,这样我就不必不断查找和刷新每张图像。

我想做这样的事情:

// get the employee status
            var db = Ti.Database.open('Enter');
            var getEmp = db.execute('SELECT employee_id, employee_status FROM Employee');
                while (getEmp.isValidRow())
                {
                  var empID = getEmp.fieldByName('employee_id');
                  var empStatus = getEmp.fieldByName('employee_status');
                  Ti.API.info(empID + ' ' + empStatus);

                  // update the images correctly
                  if (empStatus == 0) {
                    // update the image mask to black if they are now out of the building
                    Ti.API.info('Status is zero');
                    //employeeImage[i].tint = 'black';
                  } else {
                    // update the image mask to transparent if they are now in the building
                    Ti.API.info('Status is ONE');
                    //employeeImage[i].tint = 'transparent';
                  }


                  getEmp.next();
                }
                getEmp.close();

                db.close();

问题是,如果图像视图具有动态名称,我不知道是否可以将这些更改设置为。

如果它只是被称为employeeImage1 这将很容易。但是,如果我尝试调用 employeeImage1 而不是 employeeImage[i] 我会收到此错误。

“找不到变量:employeeImage1”;

我该如何解决这个问题?

有什么想法吗?

【问题讨论】:

    标签: appcelerator appcelerator-titanium


    【解决方案1】:

    毫无疑问,您可以将对象存储为数组元素。我已将您的样本缩减为以下测试用例:

    (function(){
        var count=10;
        var i=0;
        var employeeImage=[];
        for (i=0;i<10;i++){
            employeeImage[i]=Ti.UI.createButton({
                title : "Employee " + i
            });
        }
        for (var i=0;i<10;i++){
          console.log(employeeImage[i].title);
        }
    })()
    

    这是你所期望的输出:

    [INFO]  Employee 0
    [INFO]  Employee 1
    [INFO]  Employee 2
    [INFO]  Employee 3
    [INFO]  Employee 4    
    [INFO]  Employee 5
    [INFO]  Employee 6
    [INFO]  Employee 7
    [INFO]  Employee 8
    [INFO]  Employee 9
    

    现在,作为数组元素,您应该将其称为employeeImage[n] 而不是employeeImageN,因为employeeImageN 不存在,存在的是对存储为数组元素的对象的引用。

    这有意义吗。

    R

    【讨论】:

    • 我想是的,遗憾的是我没有带上我的代码来尝试,但我明天会先试一试。感谢您花时间解释!
    • 我实际上已经在循环中创建了蒙版图像,就像在您的示例中一样。 for (var i = 0; i
    • 为方便起见,我已将整个代码粘贴到此处pastebin.com/n46izkLT,因此很容易看到我在做什么。问题出在第 178 行和第 182 行。我怀疑这是因为它在创建数组的其他函数之外。有什么想法吗?
    • 这里有一些观察 - 我不能运行你的代码,因为它使用数据库调用,所以这些是基于阅读你的代码。第 178 行和第 182 行中的employeeImage 在 loader.onload 回调的范围内。但是,您填写 loadData() 范围内的值。所以我的假设是你在不同的范围内使用相同变量的两个不同实例。如果这是真的,那么您将需要重构您的代码,以便您可以传递数组,以便您在整个过程中使用单个副本。同样,这是基于阅读您的代码的假设。希望对您有所帮助。
    • 好的,不想在这里听起来像一个完整的新手,简单来说,我如何能够轻松地传递数组?能够理想地在功能之间跳转!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2015-03-14
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    相关资源
    最近更新 更多