iOS 更改 Integer/NSNumber 的 parent ViewController

iOS change Integer/NSNumber of parent ViewController

我有一个 viewController 和一个 属性 的 NSInteger(或 NSNumber),我想做的是将整数传递给 child ViewController,做一些变化(可能增加一些数字)。

但是当我在 parent 和 child 控制器中将 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];

这不能更改 parent 的值,因为 NSNumber 是只读的,并且在 child 中他们分配了一个新的,而不更改 parent 的值。

所以:

我如何将 NSInteger 或 NSNumber 传递给 child ViewController 并更改其中的值,当 child 弹出时,parent 控制器找零钱?

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

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

您不能使用此方法,因为 NSNumber 是不可变的。 所以 self.num 将指向不同于 parent 的 num 的另一个位置。 为避免此类问题,您可以使用委托模式或简单地将 parent 的 viewController 指针传递给 child 并更改其 num 值。

例如:

Parent的Header:

@property (nonatomic,strong) NSNumber *num;

Child的Header:

@property (nonatomic,weak) parentViewControllerClass * parentClass;

代码:

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

P.S。您可以查看如何定义协议 here and here。这样你就可以实现委托模式了。

也许在其他语言中你可以传递指针到指针(我不确定你是否应该),但是在Objective-C 您不能请求 属性.

的地址

可以做的是:

  1. 使用提到的委托模式——这意味着什么:
    1. 创建指定方法的协议,如setNumber:
    2. 在你的父控制器中实现这个协议(只实现setNumber:函数)
    3. 将父控制器设置为子控制器的 属性,但作为此协议的实例,而不是它的实例 class - 以保持封装。
    4. 从子控制器调用setNumber:
  2. 创建在父子控制器之间共享的可变对象。例如:

    @interface Counter : NSObject
    @property (nonatomic) NSInteger value;
    @end
    
  3. 您可以 post 来自子控制器的关于号码变化的通知并在父控制器中观察它:

    // 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"];
        // ...
    }