2015-12-14 9 views
1

У меня есть viewController с свойством NSInteger (или NSNumber), то, что я хочу сделать, это передать целое число в дочерний ViewController, внести некоторые изменения (возможно, добавить некоторые числа).iOS change Integer/NSNumber родительского ViewController

Но когда я использую NSNumber как свойство в родительском и ребенка контроллера и передать его по установленным свойством:

//parent and child property.  
@property (nonatomic,strong) NSNumber *num; 

//pass to the child 
child.num = self.num; 

//do some change in child 
self.num = [NSNumber numberWithInteger:[self.num integerValue] + 1]; 

Это не может изменить значение родителя, потому что NSNumber только для чтения, и в ребенке они Alloc новый, без изменения значения родителя.

Итак:

Как я могу передать NSInteger или NSNumber ребенку ViewController и изменить значение в нем, и когда ребенок поп прочь, родительский контроллер получить изменение?

+1

Вы можете использовать шаблон делегата для этого. – trojanfoe

+0

Можете ли вы показать мне некоторый код шаблона делегата? – FisherMartyn

ответ

3

Вы определяете и назначения нового NSNumber в следующей строке:

self.num = [NSNumber numberWithInteger:[self.num integerValue] + 1]; 

Вы не можете использовать этот метод, потому что NSNumbers неизменны. Итак, self.num укажет на другое место, отличное от родительского num. Чтобы избежать подобных проблем, вы можете использовать шаблон делегирования или просто передать указатель viewController родителя и изменить его значение num.

Например:

Родительское Заголовок:

@property (nonatomic,strong) NSNumber *num; 

Заголовок ребенка:

@property (nonatomic,weak) parentViewControllerClass * parentClass; 

Код:

self.parentClass.num = [NSNumber numberWithInteger:[self.parentClass.num integerValue] + 1]; 

P.S. Вы можете проверить, как определить протоколы here и here. С этим вы можете реализовать шаблон делегата.

+0

Это ужасно. Более нормальным является наличие метода делегата, такого как 'setSomeNumber: (NSUInteger) number;' вместо того, чтобы создавать внешние свойства таким образом. – trojanfoe

+0

@trojanfoe полностью согласен, но я сказал, что он может использовать шаблон делегата, прежде чем выражать этот пример. Я добавлю код, чтобы показать, как использовать делегат. – Amir

+0

Я не вижу в этом ничего ужасного. Это даже не делегат; это просто манипулирование свойствами, которое ребенок создает у родителя. – NRitH

0

Может быть, в другом языке мог указатель пропуска указателя (я не уверен, что если вы должен), но в Objective-C вы не можете запросить адрес собственности.

Что вы можете сделать:

  1. Используйте упомянутый делегат шаблон - что это значит:
    1. Создать протокол, который определяет метод как setNumber:
    2. Реализация этого протокола в вашем родительском контроллере (просто реализуйте функцию setNumber:)
    3. Установить родительский контроллер как свойство дочернего элемента, но в качестве экземпляра этого протокола, а не экземпляр его класса - сохранить инкапсуляцию.
    4. Вызова setNumber: из контроллера
  2. ребенка Создания изменяемого объекта, который разделяется между родителем и ребенком контроллером. Например:

    @interface Counter : NSObject 
    @property (nonatomic) NSInteger value; 
    @end 
    
  3. Вы могли отправить уведомление об изменении числа от контроллера ребенка и соблюдать его в родителю:

    // post notification in child 
    NSNumber *num = [NSNumber numberWithInteger:1]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"numberChangedNotification" 
        object:self 
        userInfo:@{@"number": num}]; 
    // observe notifications in parent 
    // first register observer in viewDidLoad 
    [[NSNotificationCenter defaultCenter] addObserver:self 
        selector:@selector(changeNumber:) 
        name:@"numberChangedNotification" 
        object:child]; 
    // and implement updateNumber 
    - changeNumber: (NSNotification *)notification { 
        NSNumber *num = notification.userInfo[@"number"]; 
        // ... 
    } 
    

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

  • Нет связанных вопросов^_^