为什么这样做?在重复循环中添加UILabel

时间:2015-12-08 23:36:02

标签: swift uilabel

我是一个绝对快速的初学者,并试图建立我的第一个应用程序。当我写一些代码时,我不希望它第一次工作,并且当它发生时我很怀疑。在重复循环中,我在图表上设置了行,并希望在行的左侧添加UILabel。我以为我可以let创建一个新的UILabel来创建主视图的子视图,但是不知道如何让它为每次迭代创建一个唯一的变量名。

repeat {
        // code to make the lines here

        // create label with minute number for each line
        let minuteLabel = UILabel(frame: CGRectMake(0, 0, 20, 20))

        // code to position the label here

        minuteLabel.text = String(numberOfLines)

        // code to style the label

        self.addSubview(minuteLabel)

        numberOfLines--
    }
    while numberOfLines > 0

我认为这最终只会创建一个子视图,它的文本将是numberOfLines的最后一次迭代,但它完美地工作。这是否意味着我的主图形视图现在具有(numberOfLines)UILabel子视图的数量,每个子视图具有相同的名称?

是否可以在此重复循环范围之外单独访问每个?

感谢您帮助我理解这一点!

2 个答案:

答案 0 :(得分:0)

首先,suviews没有按名称引用,因此它们不会都具有相同的名称。它们包含在一个可以通过引用索引访问的数组中。因此,当您添加每个子视图时,它会添加到相应的数组中,例如通过以下方式访问:

self.subviews[0]

然后每个元素将保存您在循环中创建的相同子视图。希望这有助于为您清理它。

答案 1 :(得分:0)

我认为区分对象的属性和对象的引用很重要。当您编写" UILabel子视图的数量时,每个子视图具有相同的名称"这不是一个准确的短语,因为那些标签没有名称。对象(在本例中为标签)没有关于可能存在多少引用的信息,或者在编译时可能已经命名了这些引用的信息。

在您的代码示例中,您创建一个常量引用minuteLabel并将其指定为指向标签。该常量仅存在于该repeat循环的一次迭代范围内。在当前循环迭代结束时,丢弃该引用。如果没有对标签对象的引用,您可能无法再找到它,但这并不意味着标签不存在。在这种情况下,您将标签添加为其他视图(self)的子视图。该父视图创建了自己对标签的强引用,并且根据Automatic Reference Counting的规则,只要有强烈的引用,该标签将继续存在。您甚至可以使用self.subviews再次找到这些标签,但是您可能很难确定哪个标签现在您不再参考每个标签。

虽然您提供引用的名称(如minuteLabel)对您有意义,但它对您运行应用的计算机没有意义或甚至不知道也可能会有所帮助。这个名称可以帮助我们人类跟踪计算机内存中的特定位置,该位置指向UILabel,但您无法使用相同的名称从某些位置找到相同的标签代码中的其他范围。您的应用程序可能在不同的范围内有许多名为minuteLabel的引用,它们甚至可以指向不同类型的对象,具有相同的名称并不会使它们成为相同的东西。

在那种情况下,你有一个对象的集合,并希望以后能够再次找到每个对象,一个好的解决方案通常是使用某种集合类型;数组允许您以已知顺序存储对这些标签的引用,然后您可以在特定索引处查找标签,字典将允许您在某些已知的"键"下存储对这些标签的引用。对象,您稍后可以使用等效键来检索特定标签。

尝试为每个对象动态创建常量变量(例如,创建minuteLabel0常量然后是minuteLabel1常量的循环,...),您将无法获得巨大成功。如果不清楚为什么那么可能值得为程序的编译和执行阶段之间建立一个更精确的心理模型。