iOS更改父ViewController的Integer / NSNumber

时间:2015-12-14 15:22:04

标签: ios objective-c nsnumber nsinteger

我有一个具有NSInteger(或NSNumber)属性的viewController,我想要做的是将整数传递给子ViewController,做一些更改(可能会添加一些数字)。

但是当我在父控制器和子控制器中使用NSNumber作为属性并通过set属性传递它时:

<ctype.h>

这不能改变父级的值,因为NSNumber是只读的,并且在子级中它们分配了一个新的,而不更改父级的值。

所以:

如何将NSInteger或NSNumber传递给子ViewController并更改其中的值,当子节点弹出时,父控制器会得到更改?

2 个答案:

答案 0 :(得分:3)

您正在以下行中定义和分配新的NSNumber:

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

您不能使用此方法,因为NSNumbers是不可变的。 因此,self.num将指向与父级num不同的另一个位置。 为了避免这样的问题,你可以使用委托模式或简单地将父的viewController指针传递给子节点并更改其num值。

例如:

家长的标题:

@property (nonatomic,strong) NSNumber *num;

Child's Header:

@property (nonatomic,weak) parentViewControllerClass * parentClass;

代码:

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

P.S。您可以查看如何定义协议herehere。有了它,您可以实现委托模式。

答案 1 :(得分:0)

也许在其他语言中你可以将指针传递给指针(我不确定你应该),但在Objective-C中你可以&#39;请求财产地址。

可以做的是:

  1. 使用提到的委托模式 - 含义:
    1. 创建指定setNumber:
    2. 等方法的协议
    3. 在父控制器中实现此协议(只需实现setNumber:功能)
    4. 将父控制器设置为子属性,但作为此协议的实例,而不是它的类的实例 - 以保持封装。
    5. 从子控制器
    6. 调用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"];
        // ...
    }