Objective c 使用委托与“授权”;“财产反向范围”;

Objective c 使用委托与“授权”;“财产反向范围”;,objective-c,inheritance,ios7,delegates,delegation,Objective C,Inheritance,Ios7,Delegates,Delegation,我有一个从VC1到VC2的推送序列。在前往VC2的prepare for segue中,我使用“=”运算符设置了VC2的属性,其中包含VC1中属性的内容。然后我在VC2中更改了该属性的内容。我现在需要将该属性传递回VC1。我的印象是,我可以通过授权来做到这一点。然而,一旦我在VC2中更改它,它似乎就“神奇地”自行更改了。我真的不知道这是什么意思。它必须是“=”运算符,将相同的内存位置分配给VC1和VC2中的属性,使两者都指向正确的位置?请让我知道这个词,我是否应该保持这样,还是重做我的模型,所以

我有一个从VC1到VC2的推送序列。在前往VC2的prepare for segue中,我使用“=”运算符设置了VC2的属性,其中包含VC1中属性的内容。然后我在VC2中更改了该属性的内容。我现在需要将该属性传递回VC1。我的印象是,我可以通过授权来做到这一点。然而,一旦我在VC2中更改它,它似乎就“神奇地”自行更改了。我真的不知道这是什么意思。它必须是“=”运算符,将相同的内存位置分配给VC1和VC2中的属性,使两者都指向正确的位置?请让我知道这个词,我是否应该保持这样,还是重做我的模型,所以我使用委托

谢谢

编辑/添加:

所以VC1 PrepareForegue中的属性1设置了VC2的属性1。然后,我在VC2的TextFieldDiEndediting中更改属性2。当我运行程序时,属性1在VC1中静态分配。然后我检查VC2中的属性1,在它被更改之前,它很好,然后在它被修改并且被正确修改之后进行检查。然而,当我回到VC1时(通过导航控制器中的“后退”按钮),我检查VC1的属性1,它是新的修改版本。我想我必须使用授权才能将其传递回VC1

我的问题是,这叫什么?某种范围或继承?我应该这样设置我的程序,还是我应该强迫它使用委托从视图到模型

VC1.M

VC2.H

编辑:


我真的很好奇为什么在VC2中修改属性1后,它在VC1中会发生变化。我只对一个NSString做了同样的事情,并将VC2中的属性分配给一个本地val,但一旦我回到VC1,它就不起作用了。请解释一下:(

委托是在VC2代码区设置VC1属性的一种样式。 使用block可以使代码更加清晰。 在VC2.h文件中

typedef void(^BeginEditBlock )(NSMutableArray *newObject, int section);

@interface VC2: UITableViewController <UITextFieldDelegate>
@property(nonatomic, strong) BeginEditBlock *editBlock;
@end
在VC1.m文件中

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([segue.identifier isEqualToString:@"VC2_SEGUE"]){
        VC2 *mVC2 = (VC2 *)segue.destinationViewController;
        mVC2.editBlock = ^(NSMutableArray *newObject, int section){
            [self.property1 setObject:newObject forKey:[NSString stringWithFormat:@"%i", section]];

       };
    }
}

关于块的描述是:

你能提供一些示例代码吗?我不太明白你想实现什么。@StefanFisk肯定我没有看过代码,但听起来像是你想按副本传递时按引用传递。这可能可以通过在
@属性中设置
copy
属性来实现de>@trojanfoe好的,谢谢你用这个词来表达这个想法,我在想可能会有一些通过引用的行为。mvc的好做法是不是应该使用委托来传递回?我应该利用这个通过引用,还是忽略它/通过值,然后使用委托将属性返回到VC1?@user3213783是的,委托是一种方式继续。集合类型上的“按值复制”的问题是您需要浅复制还是深复制,这将取决于您要更改的内容。浅复制可以通过
@属性
声明上的
复制
属性来完成,但是递归深复制需要自定义setter/getter方法,并且是相当数量的复制工作。与委托相比,我更喜欢这种方式,它会使耦合非常松散。如果我在VC2中设置VC1时需要VC1中的值,这会更有用吗?就像VC1正在进行一些计算,等待它在VC2中设置?-在后台。我想你应该先阅读我上面提到的块文档。块是管理的好方式e您的代码。上面的代码,块是一个属性,一旦VC2调用块,块中的编码就会执行。在流方面,它与使用委托协议做的事情完全相同,但不需要声明协议、实现方法等。
@implementation VC2

@synthesize property1 = _property1;

-(void)textFieldDidEndEditing:(UITextField *)textField
{
    // Get the cell in which the textfield is embedded
    id textFieldSuper = textField;
    while (![textFieldSuper isKindOfClass:[CustomCel class]]) {
        textFieldSuper = [textFieldSuper superview];
    }
    // Get that cell's index path

    NSIndexPath *indexPath = [self.tableView indexPathForCell:(CustomCell   *)textFieldSuper];

    NSMutableArray *newObject = [[self.property1 objectForKey:[NSString stringWithFormat:@"%i", indexPath.section]] mutableCopy];
    [newObject replaceObjectAtIndex:indexPath.row withObject:textField.text];

    [self.property1 setObject:newObject forKey:[NSString stringWithFormat:@"%i", indexPath.section]];

}

@end
typedef void(^BeginEditBlock )(NSMutableArray *newObject, int section);

@interface VC2: UITableViewController <UITextFieldDelegate>
@property(nonatomic, strong) BeginEditBlock *editBlock;
@end
-(void)textFieldDidEndEditing:(UITextField *)textField
{
    // Get the cell in which the textfield is embedded
    id textFieldSuper = textField;
    while (![textFieldSuper isKindOfClass:[CustomCel class]]) {
        textFieldSuper = [textFieldSuper superview];
    }
    // Get that cell's index path

    NSIndexPath *indexPath = [self.tableView indexPathForCell:(CustomCell   *)textFieldSuper];

    NSMutableArray *newObject = [[self.property1 objectForKey:[NSString stringWithFormat:@"%i", indexPath.section]] mutableCopy];
    [newObject replaceObjectAtIndex:indexPath.row withObject:textField.text];

    if(self.editBlock){
        self.editBlock(newObject, indexPath.section);
    }
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([segue.identifier isEqualToString:@"VC2_SEGUE"]){
        VC2 *mVC2 = (VC2 *)segue.destinationViewController;
        mVC2.editBlock = ^(NSMutableArray *newObject, int section){
            [self.property1 setObject:newObject forKey:[NSString stringWithFormat:@"%i", section]];

       };
    }
}