【发布时间】:2016-08-27 14:09:15
【问题描述】:
我是 swift 编程新手,正在测试一些场景。
我有一个 UIView 类,我用它来绘制一些东西。我将使用 for 循环多次将此 UIView 类作为子视图添加到我的主视图控制器中。
我在 coredata 中有一个实体,它存储了我使用 UIVIew 类执行的绘图的配置信息。每个条目都将包含 ID、尺寸和绘图所需的其他一些详细信息。
从 coredata 获取数据后,我使用“for”循环遍历每个条目,然后使用从 coredata 检索到的数据进行绘制(UIView 类作为子视图)。
循环的每次迭代都需要使用 UIView 类创建新的子视图,并从核心数据中检索到尺寸和其他详细信息。但我注意到它会遍历所有条目并在循环结束时调用 UIView 类,即使 .addsubView 位于循环中间。
我可以看到它创建了与核心数据条目相同数量的子视图,但由于视图在循环结束时被调用,所有子视图都使用最后一个条目核心数据的详细信息创建。
我的代码是这样的。请帮助我。谢谢。
主视图控制器。
let appDel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let context: NSManagedObjectContext = appDel.managedObjectContext
do {
let request = NSFetchRequest(entityName: "Projects")
let results = try context.executeFetchRequest(request)
if results.count > 0 {
GlobalVariable.sharedManager.starty = 50
for item in results as! [NSManagedObject]{
let titleout = String(item.valueForKey("title")!)
let startxp1 = item.valueForKey("startx")
let startxp2 = item.valueForKey("starty")
let projtag = item.valueForKey("pid")
GlobalVariable.sharedManager.title = titleout
let DrawLanes = DrawProj(frame: CGRect(x: startx, y: starty, width: 500, height: 200))
DrawLanes.backgroundColor = UIColor.clearColor()
DrawLanes.userInteractionEnabled = true
DrawLanes.tag = projtag
MainScroller.addSubview(DrawLanes)
}
}
}catch {
print ("there was an error in fetch")
}
绘图项目
override func drawRect(rect: CGRect) {
let button = UIButton(type: .System) // let preferred over var here
button.frame = CGRectMake(24, 15, 300, 20)
button.backgroundColor = UIColor.orangeColor()
button.userInteractionEnabled = false
button.text = GlobalVariable.sharedManager.title
self.addSubview(button)
}
【问题讨论】:
-
我猜在遍历数组 NSManagedObject 时,该项目也是一个托管对象类型,它是一个引用类型变量。因此,即使它遍历数组,作为引用类型,也只会使用最终值。
-
您发布的代码不包含任何循环,即使循环是您问题的关键部分。
-
@Tom Harrington 实际上我正在迭代 NSManagedObject 并将 UIView 添加为该循环中的子视图。
-
@snjmhj 那么请您指导我如何解决这个问题,首先将 coredata 值存储到单独的数组中然后遍历它们会有帮助吗?
-
@VijeshKk 我之前的回答可能有误。我认为失败点是 GlobalVariable.sharedManager.title = titleout 并且实例化视图并不意味着它的 drawRect 将被调用。我的解决方案是在 DrawLanes 中创建一个新变量并使用 titleout 初始化变量,然后在 drawRect 中放置 button.title = self.variable
标签: ios swift core-data uiview