2014-01-20 3 views
1

У меня есть push-сегмент от VC1 до VC2. При подготовке к переходу на VC2 я установил свойство VC2 с содержимым свойства в VC1 с помощью оператора «=». Затем я изменил содержимое этого свойства IN VC2. Теперь я должен передать это свойство обратно в VC1. У меня создалось впечатление, что я могу сделать это делегацией. Тем не менее, кажется, что он «волшебным образом» изменился, когда я изменил его в VC2. Я действительно не знаю, что это такое. Это должен быть оператор «=», назначающий одно и то же место памяти в свойстве в VC1 и VC2, что делает их правильными? Пожалуйста, дайте мне знать термин для этого и должен ли я хранить его так или повторить мою модель, поэтому я использую делегацию.Использование делегирования против «свойства обратной области видимости»

Спасибо.

EDIT/Сложение:

Так это property1 в VC1 prepareForSegue, устанавливает property1 VC2 в. Затем я изменяю свойство2 в тексте TextFieldDidEndEiting VC2. Когда я запускаю программу, свойство1 статически выделяется в VC1 в порядке. Затем я проверяю свойство1 в VC2 до его изменения, и это нормально, и затем я проверяю после его изменения и его правильное изменение. Однако, когда я возвращаюсь к VC1 (через кнопку «Назад» в контроллере навигации), я проверяю свойство 1 VC1, и это НОВАЯ модифицированная версия. Я думал, что должен использовать делегацию, чтобы передать ее обратно в VC1.

Мои вопросы были, что это называется? какой-то масштаб или наследование? И должен ли я настроить мою программу таким образом, или я должен заставить ее использовать делегацию, чтобы перейти от представления к модели?

VC1.M

@interface VC1() 
@property(nonatomic, strong) NSMutableDictionary *property1; 
@end 

@implementation VC1 

@synthesize property1= _property1; 
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if ([segue.identifier isEqualToString:@"VC2_SEGUE"]){ 
     VC2 *mVC2 = (VC2 *)segue.destinationViewController; 
     mVC2.property1 = self.property1; 
    } 
} 

@end 

VC2.H

@interface VC2: UITableViewController <UITextFieldDelegate> 
@property(nonatomic, strong)NSMutableDictionary *property1; 
@end 

VC2.M

@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 

Edit:

Я действительно более любопытно, почему property1 изменяется в VC1, как только я изменю его в VC2. Я сделал то же самое только с NSString и назначил свойство в VC2 локальному значению, но он не вставил, как только я вернулся в VC1. Может ли это объяснить, пожалуйста :(

+0

Вы можете указать пример кода? Я не совсем понимаю, чего вы пытаетесь достичь. –

+0

@StefanFisk Sure Thing – user3213783

+0

Я не смотрел код, но это звучит так, как будто вы * pass-by-reference *, если хотите * pass-by-copy *. Вероятно, этого можно достичь, установив атрибут 'copy' в' @ property'. – trojanfoe

ответ

0

Делегат является своего рода стиль, чтобы установить VC1 свойство в области VC2 кода. Использование блока может сделать код более ясным. В VC2.h файл

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

@interface VC2: UITableViewController <UITextFieldDelegate> 
@property(nonatomic, strong) BeginEditBlock *editBlock; 
@end 

в VC2.m файл

-(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); 
    } 
} 

в 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]]; 

     }; 
    } 
} 

Описание блока: here

+0

Я бы предпочел этот стиль для делегатов, это делает связь действительно свободной. –

+0

Будет ли это более полезно, если мне нужно значение в VC1 как SOON, как я установил его в VC2? Как если бы VC1 выполнял некоторые вычисления, ожидающие, когда он будет установлен в VC2? - В фоновом режиме. – user3213783

+0

Я думаю, вы должны сначала прочитать блок-документ, который я упомянул выше. Блок - отличный стиль для управления вашим кодом. Над кодом блок использует свойство, как только VC2 вызывает блок, будет выполняться кодирование в блоке. – simalone

Смежные вопросы