Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如果我在代码中创建一个对象,我可以稍后引用它进行更改吗?_Iphone_Ios_Objective C_Ipad - Fatal编程技术网

Iphone 如果我在代码中创建一个对象,我可以稍后引用它进行更改吗?

Iphone 如果我在代码中创建一个对象,我可以稍后引用它进行更改吗?,iphone,ios,objective-c,ipad,Iphone,Ios,Objective C,Ipad,我希望在代码中构建我的新应用程序,而不是在界面生成器中构建,因为它将涉及到多次重复查看。不过,我希望能够回到我正在制作的许多对象,以便以后与它们进行交互 所有这些对象都需要在my.h文件中创建,然后在my.m中设置,还是只能在需要时构建它们?如果我只在需要时创建对象,对内存不是更好吗 例如,我可以用一种方法创建UIView,如下所示: -(void)makeViewOne { UIView *viewOne = [[UIView alloc] init]; viewOne.frame = CGR

我希望在代码中构建我的新应用程序,而不是在界面生成器中构建,因为它将涉及到多次重复查看。不过,我希望能够回到我正在制作的许多对象,以便以后与它们进行交互

所有这些对象都需要在my.h文件中创建,然后在my.m中设置,还是只能在需要时构建它们?如果我只在需要时创建对象,对内存不是更好吗

例如,我可以用一种方法创建UIView,如下所示:

-(void)makeViewOne {
UIView *viewOne = [[UIView alloc] init];
viewOne.frame = CGRectMake(0,0,50,50);
viewOne.backgroundColor = [UIColor whiteColor];
[mainView addSubview:viewOne];
}

-(void)changeViewOneBackgroundColor {
viewOne.backgroundColor = [UIColor grayColor];
}
但是,在第二种方法中,我怎样才能引用这个观点呢?我还想构建并引用UITextFields、UILabels、uibutton等内容


谢谢

实现这一点有多种方法,以下是我通常使用的其中一种方法:

注意:此示例使用内部属性保存对视图的引用。HotLicks和tom在您的评论中提到了这方面的关键教训,即您可以使用IVAR和属性(以及其他内容):

MyViewController.m

编辑

要明确的是,关键是要将对您的观点的引用保存在某个地方。在评论中,您提到您可能有多个对象,或者可能没有,这取决于您的情况。这不会改变任何事情;然而,您可以考虑将视图存储在集合中,HoTLICK再次指出。但是,要做到这一点,您还需要在某处存储对您的收藏的引用,以获取其内容。因此,使用我的示例,您可能会决定改为创建类型为
NSMutableDictionary
NSMutableArray
的属性,或各种其他类型的属性,然后添加希望在其中创建的任何视图。使用
NSMutableDictionary
可能对您更有用,因为您可以使用键将视图存储在其中,然后使用键返回这些视图


另一种可能性是,假设您有一个对
mainView
的引用,则可以设置每个视图的标记属性或某些自定义属性。然后,您可以枚举
mainView.subview
以获取您要查找的视图,以便对其进行更改。

您听说过
ivars
@property
吗?您需要将所需的视图存储到这两个视图中的任何一个中。您可以将指向所创建对象的指针存储到任何位置。IVAR和属性是常规选择,但您也可以使用NSArray或NSDictionary。或者您甚至可以从主视图导航,查询主视图以查找ID或任何需要定位到目标对象的内容(尽管这种方法既慢又乱)。我有过,但在我(有限的)以前的工作中很少遇到过。因此,我不知道要研究这些问题,但会在这方面做更多的研究。答案是在中编辑的,所以我将其从原始问题中删除,因为它属于答案。上面提供的答案是正确的,但只是复制和粘贴是没有用的。这是你如何在iOS上编写代码的基本部分,你真的需要在dept了解这些事情是如何以及为什么要做的。否则你就是在黑暗中徘徊。我强烈建议你看看这个免费的iTunesU课程。保罗·赫加蒂(Paul Hegarty)认为,他在Next工作,当时他们开发了后来成为OS X的东西。你很难找到更好的人来解释这一切是如何工作的。谢谢杰里米,不过我对此有点不确定。从代码的顶部来看,这与我过去使用.h文件所做的类似,我希望避免这种情况。其思想是,只有在需要时才创建项目。我想为游戏中的每一个玩家发表一个观点,我不想在需要它们的时候发表很多观点,让它们不被使用,也不想让自己处于一个我没有足够的观点的位置。这就是我根据需要制作它们的目标。这取决于你,艾伦,完全取决于你的技能水平。但是,从示例中收集到的信息是将引用存储在某个位置,以便您可以重新引用它。如果ivar或属性不是您的包,那么正如HotLicks指出的,您可以使用数组或字典。我将用另一个选项更新答案。@stringCode-我的问题可能有点措词错误。我理解Jeremy在回答中提供的所有内容,但这并不能解决我试图解决的问题。谢谢Jeremy,我想我需要更多地了解这一点,以便在创建视图时添加到数组/字典中。
@interface MyViewController()
@property (nonatomic, retain) UIView *viewOne;
@end

@implementation MyViewController
@synthesize viewOne;
...
...
-(void)makeViewOne 
{
    self.viewOne = [[[UIView alloc] init] autorelease];
    self.viewOne.frame = CGRectMake(0,0,50,50);
    self.viewOne.backgroundColor = [UIColor whiteColor];
    [mainView addSubview:self.viewOne];
}
-(void)changeViewOneBackgroundColor 
{
    self.viewOne.backgroundColor = [UIColor grayColor];
}
/*
 Bonus!
*/
-(void)removeViewOne 
{
    [self.viewOne removeFromSuperview];
}
...
...
@end